diff --git a/README.md b/README.md index c55ea35c..875dc7b9 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,17 @@ # Table of contents -1. [Key Benefits](#key-benefits) -2. [Installation](#installation) -3. [Migration from previous releases](#migration-from-previous-releases) -4. [Core Module](#core-module) -5. [Performing a RingOut](#performing-a-ringout) -6. [Call Management Using JavaScript](#call-management-using-javascript) -7. [SMS](#sms) -8. [Fax](#fax) -9. [Page Visibility](#page-visibility) -10. [Tracking Ajax Requests](#tracking-ajax-requests) +- [Key Benefits](#key-benefits) +- [Installation](#installation) +- [Migration from previous releases](#migration-from-previous-releases) +- [Getting Started](#getting-started) +- [API Calls](#api-calls) +- [Server-side Subscriptions](#server-side-subscriptions) +- [Making telephony calls](#making-telephony-calls) +- [Call management using JavaScript](#call-management-using-javascript) +- [SMS](#sms) +- [Fax](#fax) +- [Page visibility](#page-visibility) +- [Tracking network Requests And Responses](#tracking-network-requests-and-responses) *** @@ -19,8 +21,9 @@ - Re-issues non-authorized requests - Decrypts PUBNUB notification messages - Parses multipart API responses -- Creates Request bodies for FaxOut -- Compatible with latest WhatWG `fetch()` spec (DOM Requests & DOM Responses) +- Restores subscriptions from cache +- Automatically re-subscribes in case of subscription renewal errors +- Compatible with latest WhatWG `fetch()` spec (DOM Requests and Responses) *** @@ -28,13 +31,13 @@ SDK can be used in 3 environments: -1. [Browser](#1-set-things-up-in-browser) -2. [NodeJS](#1-set-things-up-in-nodejs) -3. [Browserify or Webpack](#3-set-things-up-for-browserify-or-webpack) +1. [Browser](#set-things-up-in-browser) +2. [NodeJS](#set-things-up-in-nodejs) +3. [Browserify or Webpack](#set-things-up-for-browserify-or-webpack) -## 1. Set things up in Browser +## Set things up in Browser -### 1.1. Get the code +### Get the code Pick the option that works best for you: @@ -50,7 +53,7 @@ Pick the option that works best for you: - [ES6 Promise](https://github.com/jakearchibald/es6-promise), direct download: [es6-promise.js](https://raw.githubusercontent.com/jakearchibald/es6-promise/master/dist/es6-promise.js) - [PUBNUB](https://github.com/pubnub/javascript), direct download: [pubnub.js](https://raw.githubusercontent.com/pubnub/javascript/master/web/pubnub.js) -## 1.2.a. Add scripts to HTML page +### Add scripts to HTML page (if you are not using any module loaders) Add the following to your HTML: @@ -61,7 +64,7 @@ Add the following to your HTML: ``` @@ -72,7 +75,7 @@ Add the following to your HTML: ``` @@ -80,7 +83,7 @@ Add the following to your HTML: Keep in mind that this is for quick start only and for production you should add each dependency separately to have full control over the process. -## 1.2.b. Set things up in Browser (if you use RequireJS in your project) +### If you use RequireJS in your project ```js // Add this to your RequireJS configuration file @@ -107,7 +110,7 @@ require(['ringcentral', 'es6-promise', 'fetch'], function(SDK, Promise) { Make sure that polyfills are loaded before or together with SDK. -## 2. Set things up in NodeJS +## Set things up in NodeJS 1. Install the NPM package: @@ -121,7 +124,7 @@ Make sure that polyfills are loaded before or together with SDK. var RingCentral = require('ringcentral'); ``` -## 3. Set things up for Browserify or Webpack (experimental) +## Set things up for Browserify or Webpack **!!! This is experimental !!!** @@ -155,15 +158,15 @@ To reduce the size of your Webpack bundle it's better to use browser version of are installed via NPM along with the SDK). You can get them via Bower or directly download the the source. More information can be found in [installation for browser](#1-set-things-up-in-browser). -## 4. Polyfills for old browsers +## Polyfills for old browsers You can use any of your favourite `fetch()` and `Promise` polyfills. SDK tries to get them from global scope every time new instance is created. -In case SDK will not detect globals automatically you can set them as follows: +In rare case when SDK will not detect globals automatically you can set them as follows: ```js -window.Promise = {Promise: $q.Promise, resolve: q.resolve, reject: q.reject, all: q.all}; +window.Promise = whatever; window.fetch = whatever; window.Headers = whatever; window.Request = whatever; @@ -173,7 +176,7 @@ window.Response = whatever; Also you can manually define SDK internal variables: ```js -RingCentral.SDK.core.Externals.Promise = {Promise: $q.Promise, resolve: q.resolve, reject: q.reject, all: q.all}; +RingCentral.SDK.core.Externals.Promise = whatever; RingCentral.SDK.core.Externals.fetch = whatever; RingCentral.SDK.core.Externals.Headers = whatever; RingCentral.SDK.core.Externals.Request = whatever; @@ -200,7 +203,7 @@ Full list of migration instructions: *** -# Core Module +# Getting Started ## Instantiate the RingCentral object @@ -222,7 +225,7 @@ var rcsdk = new RingCentral.SDK({ This instance will be used later on to perform calls to API. -## Get the Platform Singleton +## Get the Platform singleton ```js var platform = rcsdk.platform(); @@ -251,7 +254,7 @@ rcsdk.platform() }); ``` -### Handling Login Success +## Handling login success Because the login process is asynchronous, you need to call the promise's `then` method and pass your success handler as the continuation function. @@ -260,7 +263,7 @@ This function will be called once login has succeeded, which allows the applicat the user interface, and then perform the next actions using the API to load account details for the user's account and such. -### Handling Login Failure +## Handling login failure Login can, of course, fail - a user can enter the incorrect password or mistype their user name. @@ -268,7 +271,7 @@ To handle cases where login fails, you can provide an error handler function in To keep this example simple, a simple JavaScript alert is being used. In a real application, you will want to provide a good UX in your login form UI. -### Checking Authentication State +## Checking login state To check in your Application if the user is authenticated, you can call the `loggedIn` method of the platform singleton: @@ -288,14 +291,54 @@ If you just need to check whether the user has a valid token, you can call the ` rcsdk.platform().auth().accessTokenValid(); // returns boolean ``` -## Performing API calls +## Logout + +Logging the user out is trivial - just call the `logout` method on the platform singleton: + +```js +rcsdk.platform().logout().then(...).catch(...); +``` + +## Events + +The platform provides the following events: + +- `loginSuccess` +- `loginError` +- `logoutSuccess` +- `logoutError` +- `refreshSuccess` +- `refreshError` — application may listen to this error and show login page + +To listen on platform events, you should call the `on` method of the platform singleton: + +```js +var platform = rcsdk.platform(); + +platform.on(platform.events.refreshError, function(e){ + // do something +}); +``` + +The `on` method accepts an event type as its first argument and a handler function as its second argument. + +## Cache + +In the NodeJS it might be useful to replace simple built-in storage with something persistent: + +```js +RingCentral.SDK.core.Externals.localStorage = Anything; +``` + +# API calls To perform an authenticated API call, you should use the one of the methods of the platform singleton: ```js rcsdk.platform() - .send('/account/~/extension/~', { + .send({ method: 'PUT', + url: '/account/~/extension/~', query: {...}, headers: {...}, body: {...} @@ -322,55 +365,15 @@ rcsdk.platform() // Shorthand methods -rcsdk.platform().get('/account/~/extension/~', {query: {...}}).then(...); -rcsdk.platform().post('/account/~/extension/~', {body: {...}, query: {...}}).then(...); -rcsdk.platform().put('/account/~/extension/~', {body: {...}, query: {...}}).then(...); -rcsdk.platform().delete('/account/~/extension/~', {query: {...}}).then(function(...); +rcsdk.platform().get('/account/~/extension/~', {...query}).then(...); +rcsdk.platform().post('/account/~/extension/~', {...body}, {...query}).then(...); +rcsdk.platform().put('/account/~/extension/~', {...body}, {...query}).then(...); +rcsdk.platform().delete('/account/~/extension/~', {...query}).then(function(...); ``` -### Sending things other than JSON +If your `Promise` library supports global error handler it might be useful to log Requests and Responses there. -You can set `headers['Content-Type']` property of AJAX options to `false` in order to let XHR library to figure out -appropriate `Content-Type` header automatically. - -Important notes: - -- Automatic guessing of `Content-Type` is unreliable, if you know `Content-Type` then set it explicitly -- NodeJS cannot set `multipart/mixed` header with appropriate boundary automatically when sending `Buffer` object - so your application must take care of that - -## Logout - -Logging the user out is trivial - just call the `logout` method on the platform singleton: - -```js -rcsdk.platform().logout().then(...).catch(...); -``` - -## Events - -The platform provides the following events: - -- `loginSuccess` -- `loginError` -- `logoutSuccess` -- `logoutError` -- `refreshSuccess` -- `refreshError` — application may listen to this error and show login page - -To listen on platform events, you should call the `on` method of the platform singleton: - -```js -var platform = rcsdk.platform(); - -platform.on(platform.events.refreshError, function(e){ - // do something -}); -``` - -The `on` method accepts an event type as its first argument and a handler function as its second argument. - -## Subscriptions +# Server-side Subscriptions Subscriptions are a convenient way to receive updates on server-side events, such as new messages or presence changes. @@ -383,35 +386,53 @@ subscription.on(subscription.events.notification, function(msg) { console.log(msg, msg.body); }); -subscription.register({ - events: ['/account/~/extension/~/presence'], // a list of server-side events -}).then(...); +subscription + .setEventFilters(['/account/~/extension/~/presence']) // a list of server-side events + .register() + .then(...); ``` +## Removing Subscriptions from server + Once a subscription has been created, the SDK takes care of renewing it automatically. To cancel a subscription, you can -call the subscription instance's `reset` and `off` methods: +call the subscription instance's `remove()` method: ```js -subscription.reset().off(); +subscription.remove().then(...); ``` -You can add more events to the same subscription at any time, by calling the subscription methods: +## Updating Subsctiptions + +You can add more or replace event filters in the existing subscription at any time, by calling the subscription methods +and then calling the `register()` method to update it on the server: ```js subscription.setEventFilters(['/account/~/extension/111/presence']).register(); subscription.addEventFilters(['/account/~/extension/222/presence']).register(); ``` -### Subscriptions Lifecycle +## Subscription reset + +To revert subscription instance to it's prestine state you can use its `reset()` and `off()` methods, this will close +PUBNUB channel, remove all timers, subscription data and all bindings: + +```js +subscription.reset().off(); +``` + +## Subscriptions lifecycle The number of active subscriptions is limited per account (about 20). This means that the application should dispose unused subscriptions in the following situations: -- the user navigates away from the page or particular view -- the `Platform` instance emits `logoutSuccess` or `accessViolation` events -- a subscription becomes unused by the application, based upon the application's business logic +- Application should `reset()` subscriptions (on the server they are dead already): + - the `Platform` instance emits `logoutSuccess` or `accessViolation` events so the app should `reset()` all subscriptions +- Application should `remove()` subscriptions or remove no longer needed event filters from them: + - the user navigates away from the page or particular view + - a subscription becomes unused by the application, based upon the application's business logic -One of very useful techniques is to always store subscription data in cache: +One of very useful techniques to limit the number of active subscriptions is to store subscription data in cache and +share this data across Subscription instances in multiple tabs: ```js var cacheKey = 'some-custom-key'; @@ -440,7 +461,7 @@ With this technique subscription remove request on window/tab closing is no long In any case if application logic dictates that subscription is not used anymore by any of it's instances, subscription can be removed from the server to make sure application stays within limits. -### Stale Subscriptions +## Stale Subscriptions There is a known bug when user awakes the computer: subscription tries to renew itself but fails because the expiration time has passed (JS was halted while computer was sleeping). @@ -458,16 +479,7 @@ subscription.on(subscription.events.renewError, function() { This has to be done in all tabs, application must handle potential race conditions. -### Shorthand - -The above mentioned things are put together into `restoreFromCache()` method: - -```js -var subscription = rcsdk.createSubscription() - .restoreFromCache('cache-key', ['/account/~/extension/~/presence']); -``` - -### Subscription Multiplexor +## Multiple event filters in one Subscription The best practice is to have only one subscription object with multiple event filters of different types (messages, presence, etc.) instead of having separate subscription for each individual event filter. @@ -483,9 +495,29 @@ subscription.on(subscription.events.notification, function(msg) { }); ``` +## Shorthand + +The above mentioned things are put together into `CachedSubscription` class and its `restore(cacheKey)` method: + +```js +var subscription = rcsdk.createCachedSubscription('cache-key').restore(['/account/~/extension/~/presence']); + +// use it as usual +subscription.register(); +``` + +`CachedSubscription` class has 4 extra events which you can use for more granular control: + +- `queuedRenewSuccess` +- `queuedRenewError` +- `queuedResubscribeSuccess` +- `queuedResubscribeError` + *** -# Performing a RingOut +# Making telephony calls + +In RingCentral terminology making telephony calls is named as RingOut. This example demonstrates a way to create a flexible RingOut tracking procedure. This is the most complex example with maximum fine-tuning - it could be simplified to suit the business requirements. @@ -592,7 +624,7 @@ create({ *** -# Call Management Using JavaScript +# Call management using JavaScript If you are integrating with a CRM or ERP system, use of the JavaScript SDK is highly recommended. Following is an example of a call management integration that includes monitoring of incoming calls and performing of RingOuts. @@ -767,7 +799,7 @@ Further reading: *** -# Page Visibility +# Page visibility You can use any of the libraties that work with the [Page Visibility API](http://www.w3.org/TR/page-visibility/), such as [visibility.js](https://github.com/ai/visibilityjs). @@ -784,7 +816,7 @@ not require that any such optimizations be implemented in the application, but i *** -# Tracking Network Requests & Responses +# Tracking network Requests And Responses You can set up tracking for all network requests (for instance, to log them somewhere) by obtaining a `Client` object and registering observers on its various events: diff --git a/build/ringcentral-bundle.js b/build/ringcentral-bundle.js index c2c34d84..a33af59e 100644 --- a/build/ringcentral-bundle.js +++ b/build/ringcentral-bundle.js @@ -89,31 +89,35 @@ var _coreObservable = __webpack_require__(12); var _coreObservable2 = _interopRequireDefault(_coreObservable); -var _httpClient = __webpack_require__(13); +var _coreQueue = __webpack_require__(13); + +var _coreQueue2 = _interopRequireDefault(_coreQueue); + +var _httpClient = __webpack_require__(14); var _httpClient2 = _interopRequireDefault(_httpClient); -var _httpApiResponse = __webpack_require__(15); +var _httpApiResponse = __webpack_require__(16); var _httpApiResponse2 = _interopRequireDefault(_httpApiResponse); -var _httpUtils = __webpack_require__(14); +var _httpUtils = __webpack_require__(15); var HttpUtils = _interopRequireWildcard(_httpUtils); -var _mocksClientMock = __webpack_require__(16); +var _mocksClientMock = __webpack_require__(17); var _mocksClientMock2 = _interopRequireDefault(_mocksClientMock); -var _mocksMock = __webpack_require__(18); +var _mocksMock = __webpack_require__(19); var _mocksMock2 = _interopRequireDefault(_mocksMock); -var _mocksRegistry = __webpack_require__(17); +var _mocksRegistry = __webpack_require__(18); var _mocksRegistry2 = _interopRequireDefault(_mocksRegistry); -var _platformPlatform = __webpack_require__(19); +var _platformPlatform = __webpack_require__(20); var _platformPlatform2 = _interopRequireDefault(_platformPlatform); @@ -121,10 +125,6 @@ var _platformAuth = __webpack_require__(21); var _platformAuth2 = _interopRequireDefault(_platformAuth); -var _platformQueue = __webpack_require__(20); - -var _platformQueue2 = _interopRequireDefault(_platformQueue); - var _pubnubPubnubFactory = __webpack_require__(22); var _pubnubPubnubFactory2 = _interopRequireDefault(_pubnubPubnubFactory); @@ -133,7 +133,11 @@ var _subscriptionSubscription = __webpack_require__(24); var _subscriptionSubscription2 = _interopRequireDefault(_subscriptionSubscription); -__webpack_require__(25); +var _subscriptionCachedSubscription = __webpack_require__(25); + +var _subscriptionCachedSubscription2 = _interopRequireDefault(_subscriptionCachedSubscription); + +__webpack_require__(26); var SDK = (function () { _createClass(SDK, null, [{ @@ -189,7 +193,15 @@ var SDK = (function () { */ SDK.prototype.createSubscription = function createSubscription() { - return new _subscriptionSubscription2['default'](this._pubnubFactory, this._platform, this._cache); + return new _subscriptionSubscription2['default'](this._pubnubFactory, this._platform); + }; + + /** + * @return {CachedSubscription} + */ + + SDK.prototype.createCachedSubscription = function createCachedSubscription(cacheKey) { + return new _subscriptionCachedSubscription2['default'](this._pubnubFactory, this._platform, this._cache, cacheKey); }; /** @@ -206,7 +218,8 @@ var SDK = (function () { Cache: _coreCache2['default'], Observable: _coreObservable2['default'], Utils: Utils, - Externals: Externals + Externals: Externals, + Queue: _coreQueue2['default'] }, enumerable: true }, { @@ -221,8 +234,7 @@ var SDK = (function () { key: 'platform', value: { Auth: _platformAuth2['default'], - Platform: _platformPlatform2['default'], - Queue: _platformQueue2['default'] + Platform: _platformPlatform2['default'] }, enumerable: true }, { @@ -425,22 +437,24 @@ var _pubnub = __webpack_require__(10); var _pubnub2 = _interopRequireDefault(_pubnub); -var Promise = _es6Promise2['default'] && _es6Promise2['default'].Promise || window.Promise; +var root = new Function('return this')(); + +var Promise = _es6Promise2['default'] && _es6Promise2['default'].Promise || root.Promise; exports.Promise = Promise; -var fetch = _nodeFetch2['default'] || window.fetch; +var fetch = root.fetch || _nodeFetch2['default']; exports.fetch = fetch; -var Request = fetch.Request || window.Request; +var Request = root.Request || fetch.Request; exports.Request = Request; -var Response = fetch.Response || window.Response; +var Response = root.Response || fetch.Response; exports.Response = Response; -var Headers = fetch.Headers || window.Headers; +var Headers = root.Headers || fetch.Headers; exports.Headers = Headers; -var PUBNUB = _pubnub2['default'] || window.PUBNUB; +var PUBNUB = root.PUBNUB || _pubnub2['default']; exports.PUBNUB = PUBNUB; -var localStorage = typeof window !== 'undefined' && typeof window.localStorage !== 'undefined' ? window.localStorage : {}; +var localStorage = typeof root.localStorage !== 'undefined' ? root.localStorage : {}; exports.localStorage = localStorage; /***/ }, @@ -5139,6 +5153,86 @@ exports.__esModule = true; var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + +var _coreExternals = __webpack_require__(3); + +var _Utils = __webpack_require__(2); + +var Queue = (function () { + _createClass(Queue, null, [{ + key: '_pollInterval', + value: 250, + enumerable: true + }, { + key: '_releaseTimeout', + value: 5000, + enumerable: true + }]); + + function Queue(cache, cacheId) { + _classCallCheck(this, Queue); + + this._cache = cache; + this._cacheId = cacheId; + this._promise = null; + } + + Queue.prototype.isPaused = function isPaused() { + + var time = this._cache.getItem(this._cacheId); + + return !!time && Date.now() - parseInt(time) < Queue._releaseTimeout; + }; + + Queue.prototype.pause = function pause() { + this._cache.setItem(this._cacheId, Date.now()); + return this; + }; + + Queue.prototype.resume = function resume() { + this._cache.removeItem(this._cacheId); + return this; + }; + + Queue.prototype.poll = function poll() { + var _this = this; + + if (this._promise) return this._promise; + + this._promise = new _coreExternals.Promise(function (resolve, reject) { + + _Utils.poll(function (next) { + + if (_this.isPaused()) return next(); + + _this._promise = null; + + _this.resume(); // this is actually not needed but why not + + resolve(null); + }, Queue._pollInterval); + }); + + return this._promise; + }; + + return Queue; +})(); + +exports['default'] = Queue; +module.exports = exports['default']; + +/***/ }, +/* 14 */ +/***/ function(module, exports, __webpack_require__) { + +'use strict'; + +exports.__esModule = true; + +var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } @@ -5149,13 +5243,13 @@ var _coreExternals = __webpack_require__(3); var _coreUtils = __webpack_require__(2); -var _Utils = __webpack_require__(14); +var _Utils = __webpack_require__(15); var _coreObservable = __webpack_require__(12); var _coreObservable2 = _interopRequireDefault(_coreObservable); -var _ApiResponse = __webpack_require__(15); +var _ApiResponse = __webpack_require__(16); var _ApiResponse2 = _interopRequireDefault(_ApiResponse); @@ -5365,7 +5459,7 @@ exports['default'] = Client; module.exports = exports['default']; /***/ }, -/* 14 */ +/* 15 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -5417,7 +5511,7 @@ function findHeaderName(name, headers) { } /***/ }, -/* 15 */ +/* 16 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -5432,7 +5526,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons var _coreExternals = __webpack_require__(3); -var _Utils = __webpack_require__(14); +var _Utils = __webpack_require__(15); var utils = _interopRequireWildcard(_Utils); @@ -5662,7 +5756,7 @@ exports['default'] = ApiResponse; module.exports = exports['default']; /***/ }, -/* 16 */ +/* 17 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -5675,11 +5769,11 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -var _Registry = __webpack_require__(17); +var _Registry = __webpack_require__(18); var _Registry2 = _interopRequireDefault(_Registry); -var _httpClient = __webpack_require__(13); +var _httpClient = __webpack_require__(14); var _httpClient2 = _interopRequireDefault(_httpClient); @@ -5723,7 +5817,7 @@ exports['default'] = Client; module.exports = exports['default']; /***/ }, -/* 17 */ +/* 18 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -5734,7 +5828,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'd function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -var _Mock = __webpack_require__(18); +var _Mock = __webpack_require__(19); var _Mock2 = _interopRequireDefault(_Mock); @@ -5901,7 +5995,7 @@ exports['default'] = Registry; module.exports = exports['default']; /***/ }, -/* 18 */ +/* 19 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -5912,13 +6006,13 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'd function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -var _httpApiResponse = __webpack_require__(15); +var _httpApiResponse = __webpack_require__(16); var _httpApiResponse2 = _interopRequireDefault(_httpApiResponse); var _coreUtils = __webpack_require__(2); -var _httpUtils = __webpack_require__(14); +var _httpUtils = __webpack_require__(15); var Mock = (function () { function Mock(method, path, json, status, statusText, delay) { @@ -5984,7 +6078,7 @@ exports['default'] = Mock; module.exports = exports['default']; /***/ }, -/* 19 */ +/* 20 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -6003,9 +6097,9 @@ var _coreObservable = __webpack_require__(12); var _coreObservable2 = _interopRequireDefault(_coreObservable); -var _Queue = __webpack_require__(20); +var _coreQueue = __webpack_require__(13); -var _Queue2 = _interopRequireDefault(_Queue); +var _coreQueue2 = _interopRequireDefault(_coreQueue); var _Auth = __webpack_require__(21); @@ -6093,7 +6187,7 @@ var Platform = (function (_Observable) { /** @type {Client} */ this._client = client; - this._queue = new _Queue2['default'](this._cache, Platform._cacheId + '-refresh'); + this._queue = new _coreQueue2['default'](this._cache, Platform._cacheId + '-refresh'); this._auth = new _Auth2['default'](this._cache, Platform._cacheId); } @@ -6547,8 +6641,8 @@ var Platform = (function (_Observable) { /** * General purpose function to send anything to server + * @param {string} options.url * @param {object} [options.body] - * @param {string} [options.url] * @param {string} [options.method] * @param {object} [options.query] * @param {object} [options.headers] @@ -6580,7 +6674,7 @@ var Platform = (function (_Observable) { /** * @param {string} url - * @param {object} query + * @param {object} [query] * @param {object} [options] * @param {object} [options.headers] * @param {boolean} [options.skipAuthCheck] @@ -6611,7 +6705,7 @@ var Platform = (function (_Observable) { /** * @param {string} url * @param {object} body - * @param {object} query + * @param {object} [query] * @param {object} [options] * @param {object} [options.headers] * @param {boolean} [options.skipAuthCheck] @@ -6642,8 +6736,8 @@ var Platform = (function (_Observable) { /** * @param {string} url - * @param {object} body - * @param {object} query + * @param {object} [body] + * @param {object} [query] * @param {object} [options] * @param {object} [options.headers] * @param {boolean} [options.skipAuthCheck] @@ -6674,7 +6768,7 @@ var Platform = (function (_Observable) { /** * @param {string} url - * @param {string} query + * @param {string} [query] * @param {object} [options] * @param {object} [options.headers] * @param {boolean} [options.skipAuthCheck] @@ -6780,88 +6874,6 @@ module.exports = exports['default']; // Guard is for errors that come from polling -/***/ }, -/* 20 */ -/***/ function(module, exports, __webpack_require__) { - -'use strict'; - -exports.__esModule = true; - -var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - -var _coreExternals = __webpack_require__(3); - -var _coreUtils = __webpack_require__(2); - -var Queue = (function () { - _createClass(Queue, null, [{ - key: '_pollInterval', - value: 250, - enumerable: true - }, { - key: '_releaseTimeout', - value: 5000, - enumerable: true - }]); - - function Queue(cache, cacheId) { - _classCallCheck(this, Queue); - - this._cache = cache; - this._cacheId = cacheId; - this._promise = null; - } - - Queue.prototype.isPaused = function isPaused() { - - var storage = this._cache, - cacheId = this._cacheId, - time = storage.getItem(cacheId); - - return !!time && Date.now() - parseInt(time) < Queue._releaseTimeout; - }; - - Queue.prototype.pause = function pause() { - this._cache.setItem(this._cacheId, Date.now()); - return this; - }; - - Queue.prototype.resume = function resume() { - this._cache.removeItem(this._cacheId); - return this; - }; - - Queue.prototype.poll = function poll() { - var _this = this; - - if (this._promise) return this._promise; - - this._promise = new _coreExternals.Promise(function (resolve, reject) { - - _coreUtils.poll(function (next) { - - if (_this.isPaused()) return next(); - - _this._promise = null; - - _this.resume(); // this is actually not needed but why not - - resolve(null); - }, Queue._pollInterval); - }); - - return this._promise; - }; - - return Queue; -})(); - -exports['default'] = Queue; -module.exports = exports['default']; - /***/ }, /* 21 */ /***/ function(module, exports) { @@ -7138,7 +7150,7 @@ var _coreObservable = __webpack_require__(12); var _coreObservable2 = _interopRequireDefault(_coreObservable); -var _httpClient = __webpack_require__(13); +var _httpClient = __webpack_require__(14); var _httpClient2 = _interopRequireDefault(_httpClient); @@ -7157,7 +7169,7 @@ var Subscription = (function (_Observable) { enumerable: true }]); - function Subscription(pubnubFactory, platform, cache) { + function Subscription(pubnubFactory, platform) { _classCallCheck(this, Subscription); _Observable.call(this); @@ -7173,7 +7185,6 @@ var Subscription = (function (_Observable) { }; this._pubnubFactory = pubnubFactory; this._platform = platform; - this._cache = cache; this._pubnub = null; this._timeout = null; this._subscription = {}; @@ -7197,13 +7208,18 @@ var Subscription = (function (_Observable) { // status?:string; // Active //} + Subscription.prototype.subscribed = function subscribed() { + + return !!(this._subscription.id && this._subscription.deliveryMode && this._subscription.deliveryMode.subscriberKey && this._subscription.deliveryMode.address); + }; + /** * @return {boolean} */ Subscription.prototype.alive = function alive() { - return !!(this._subscription.id && this._subscription.deliveryMode && this._subscription.deliveryMode.subscriberKey && this._subscription.deliveryMode.address && Date.now() < this.expirationTime()); + return this.subscribed() && Date.now() < this.expirationTime(); }; Subscription.prototype.expirationTime = function expirationTime() { @@ -7231,11 +7247,10 @@ var Subscription = (function (_Observable) { /** * Creates or updates subscription if there is an active one - * @param {{events?:string[]}} [options] New array of events * @returns {Promise} */ - Subscription.prototype.register = function register(options) { + Subscription.prototype.register = function register() { return regeneratorRuntime.async(function register$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: @@ -7245,14 +7260,14 @@ var Subscription = (function (_Observable) { } context$2$0.next = 3; - return regeneratorRuntime.awrap(this.renew(options)); + return regeneratorRuntime.awrap(this.renew()); case 3: return context$2$0.abrupt('return', context$2$0.sent); case 6: context$2$0.next = 8; - return regeneratorRuntime.awrap(this.subscribe(options)); + return regeneratorRuntime.awrap(this.subscribe()); case 8: return context$2$0.abrupt('return', context$2$0.sent); @@ -7289,32 +7304,27 @@ var Subscription = (function (_Observable) { }; /** - * @param {{events?:string[]}} [options] New array of events * @returns {Promise} */ - Subscription.prototype.subscribe = function subscribe(options) { + Subscription.prototype.subscribe = function subscribe() { var response, json; return regeneratorRuntime.async(function subscribe$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: context$2$0.prev = 0; - options = options || {}; - - if (options.events) this.setEventFilters(options.events); - this._clearTimeout(); if (this.eventFilters().length) { - context$2$0.next = 6; + context$2$0.next = 4; break; } throw new Error('Events are undefined'); - case 6: - context$2$0.next = 8; + case 4: + context$2$0.next = 6; return regeneratorRuntime.awrap(this._platform.post('/restapi/v1.0/subscription', { eventFilters: this._getFullEventFilters(), deliveryMode: { @@ -7322,7 +7332,7 @@ var Subscription = (function (_Observable) { } })); - case 8: + case 6: response = context$2$0.sent; json = response.json(); @@ -7330,8 +7340,8 @@ var Subscription = (function (_Observable) { return context$2$0.abrupt('return', response); - case 14: - context$2$0.prev = 14; + case 12: + context$2$0.prev = 12; context$2$0.t0 = context$2$0['catch'](0); context$2$0.t0 = this._platform.client().makeError(context$2$0.t0); @@ -7340,53 +7350,48 @@ var Subscription = (function (_Observable) { throw context$2$0.t0; - case 19: + case 17: case 'end': return context$2$0.stop(); } - }, null, this, [[0, 14]]); + }, null, this, [[0, 12]]); }; /** - * @param {{events?:string[]}} [options] New array of events * @returns {Promise} */ - Subscription.prototype.renew = function renew(options) { + Subscription.prototype.renew = function renew() { var response, json; return regeneratorRuntime.async(function renew$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: context$2$0.prev = 0; - options = options || {}; - - if (options.events) this.setEventFilters(options.events); - this._clearTimeout(); if (this.alive()) { - context$2$0.next = 6; + context$2$0.next = 4; break; } throw new Error('Subscription is not alive'); - case 6: + case 4: if (this.eventFilters().length) { - context$2$0.next = 8; + context$2$0.next = 6; break; } throw new Error('Events are undefined'); - case 8: - context$2$0.next = 10; + case 6: + context$2$0.next = 8; return regeneratorRuntime.awrap(this._platform.put('/restapi/v1.0/subscription/' + this._subscription.id, { eventFilters: this._getFullEventFilters() })); - case 10: + case 8: response = context$2$0.sent; json = response.json(); @@ -7394,8 +7399,8 @@ var Subscription = (function (_Observable) { return context$2$0.abrupt('return', response); - case 16: - context$2$0.prev = 16; + case 14: + context$2$0.prev = 14; context$2$0.t0 = context$2$0['catch'](0); context$2$0.t0 = this._platform.client().makeError(context$2$0.t0); @@ -7404,11 +7409,11 @@ var Subscription = (function (_Observable) { throw context$2$0.t0; - case 21: + case 19: case 'end': return context$2$0.stop(); } - }, null, this, [[0, 16]]); + }, null, this, [[0, 14]]); }; /** @@ -7422,12 +7427,12 @@ var Subscription = (function (_Observable) { case 0: context$2$0.prev = 0; - if (this.alive()) { + if (this.subscribed()) { context$2$0.next = 3; break; } - throw new Error('Subscription is not alive'); + throw new Error('No subscription'); case 3: context$2$0.next = 5; @@ -7458,60 +7463,36 @@ var Subscription = (function (_Observable) { }; /** - * Remove subscription and disconnect from PUBNUB - * This method resets subscription at client side but backend is not notified + * @returns {Promise} */ - Subscription.prototype.reset = function reset() { - this._clearTimeout(); - if (this.alive() && this._pubnub) this._pubnub.unsubscribe({ channel: this._subscription.deliveryMode.address }); - this._subscription = {}; - return this; + Subscription.prototype.resubscribe = function resubscribe() { + + return this.reset().setEventFilters(this.eventFilters()).subscribe(); }; /** - * - * @param {string} cacheKey - * @param {string[]} events - * @return {Subscription} + * Remove subscription and disconnect from PUBNUB + * This method resets subscription at client side but backend is not notified */ - Subscription.prototype.restoreFromCache = function restoreFromCache(cacheKey, events) { - var _this = this; - - this.on([this.events.subscribeSuccess, this.events.renewSuccess], function () { - - _this._cache.setItem(cacheKey, _this.subscription()); - }); - - this.on(this.events.renewError, function () { - - _this.reset().setEventFilters(events).register(); - }); - - var cachedSubscriptionData = this._cache.getItem(cacheKey); - - if (cachedSubscriptionData) { - try { - this.setSubscription(cachedSubscriptionData); - } catch (e) {} - } else { - this.setEventFilters(events); - } - + Subscription.prototype.reset = function reset() { + this._clearTimeout(); + if (this.subscribed() && this._pubnub) this._pubnub.unsubscribe({ channel: this._subscription.deliveryMode.address }); + this._subscription = {}; return this; }; Subscription.prototype._getFullEventFilters = function _getFullEventFilters() { - var _this2 = this; + var _this = this; return this.eventFilters().map(function (event) { - return _this2._platform.createUrl(event); + return _this._platform.createUrl(event); }); }; Subscription.prototype._setTimeout = function _setTimeout() { - var _this3 = this; + var _this2 = this; this._clearTimeout(); @@ -7519,9 +7500,9 @@ var Subscription = (function (_Observable) { _coreUtils.poll(function (next) { - if (_this3.alive()) return next(); + if (_this2.alive()) return next(); - _this3.renew(); + _this2.renew(); }, Subscription._pollInterval, this._timeout); return this; @@ -7536,7 +7517,7 @@ var Subscription = (function (_Observable) { Subscription.prototype._decrypt = function _decrypt(message) { - if (!this.alive()) throw new Error('Subscription is not alive'); + if (!this.subscribed()) throw new Error('No subscription'); if (this._subscription.deliveryMode.encryptionKey) { @@ -7590,6 +7571,180 @@ module.exports = exports['default']; /***/ }, /* 25 */ +/***/ function(module, exports, __webpack_require__) { + +'use strict'; + +exports.__esModule = true; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _Subscription2 = __webpack_require__(24); + +var _Subscription3 = _interopRequireDefault(_Subscription2); + +var _coreQueue = __webpack_require__(13); + +var _coreQueue2 = _interopRequireDefault(_coreQueue); + +var CachedSubscription = (function (_Subscription) { + _inherits(CachedSubscription, _Subscription); + + function CachedSubscription(pubnubFactory, platform, cache, cacheKey) { + var _this = this; + + _classCallCheck(this, CachedSubscription); + + _Subscription.call(this, pubnubFactory, platform); + + this._cache = cache; + this._cacheKey = cacheKey; + this._renewQueue = new _coreQueue2['default'](this._cache, cacheKey + '-renew'); + this._resubscribeQueue = new _coreQueue2['default'](this._cache, cacheKey + '-resubscribe'); + + this.events = _extends({}, this.events, { + queuedRenewSuccess: 'queuedRenewSuccess', + queuedRenewError: 'queuedRenewError', + queuedResubscribeSuccess: 'queuedResubscribeSuccess', + queuedResubscribeError: 'queuedResubscribeError' + }); + + this.on(this.events.renewError, function () { + _this.resubscribe(); + }); + + this.on([this.events.subscribeSuccess, this.events.renewSuccess], function () { + _this._cache.setItem(_this._cacheKey, _this.subscription()); + }); + + this.on(this.events.removeSuccess, function () { + _this._cache.removeItem(_this._cacheKey); + }); + } + + /** + * TODO Combine with Platform.refresh and move elsewhere + * @param actionCb + * @param queue + * @param successEvent + * @param errorEvent + * @param errorMessage + * @return {*} + * @private + */ + + CachedSubscription.prototype._queue = function _queue(actionCb, queue, successEvent, errorEvent, errorMessage) { + var res; + return regeneratorRuntime.async(function _queue$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + context$2$0.prev = 0; + + if (!queue.isPaused()) { + context$2$0.next = 8; + break; + } + + context$2$0.next = 4; + return regeneratorRuntime.awrap(queue.poll()); + + case 4: + if (this.alive()) { + context$2$0.next = 6; + break; + } + + throw new Error(errorMessage); + + case 6: + + this.emit(successEvent, null); + + return context$2$0.abrupt('return', null); + + case 8: + + queue.pause(); + + context$2$0.next = 11; + return regeneratorRuntime.awrap(actionCb.call(this)); + + case 11: + res = context$2$0.sent; + + queue.resume(); + + this.emit(successEvent, res); + + return context$2$0.abrupt('return', res); + + case 17: + context$2$0.prev = 17; + context$2$0.t0 = context$2$0['catch'](0); + + this.emit(errorEvent, context$2$0.t0); + + throw context$2$0.t0; + + case 21: + case 'end': + return context$2$0.stop(); + } + }, null, this, [[0, 17]]); + }; + + /** + * @returns {Promise} + */ + + CachedSubscription.prototype.renew = function renew() { + + return this._queue(_Subscription.prototype.renew, this._renewQueue, this.events.queuedRenewSuccess, this.events.queuedRenewError, 'Subscription is not alive after renew timeout'); + }; + + /** + * @returns {Promise} + */ + + CachedSubscription.prototype.resubscribe = function resubscribe() { + + return this._queue(_Subscription.prototype.resubscribe, this._resubscribeQueue, this.events.queuedResubscribeSuccess, this.events.queuedResubscribeError, 'Subscription is not alive after resubscribe timeout'); + }; + + /** + * @param {string[]} events + * @return {CachedSubscription} + */ + + CachedSubscription.prototype.restore = function restore(events) { + + var cachedSubscriptionData = this._cache.getItem(this._cacheKey); + + if (cachedSubscriptionData) { + try { + this.setSubscription(cachedSubscriptionData); + } catch (e) {} + } else { + this.setEventFilters(events); + } + + return this; + }; + + return CachedSubscription; +})(_Subscription3['default']); + +exports['default'] = CachedSubscription; +module.exports = exports['default']; + +/***/ }, +/* 26 */ /***/ function(module, exports) { /* WEBPACK VAR INJECTION */(function(global) {/** diff --git a/build/ringcentral-bundle.js.map b/build/ringcentral-bundle.js.map index 4d0abcde..4f6e675c 100644 --- a/build/ringcentral-bundle.js.map +++ b/build/ringcentral-bundle.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap ab5bb5a6cdbb0cfc49a3","webpack:///./src/SDK.js","webpack:///./src/core/Utils.js","webpack:///./src/core/Externals.js","webpack:///./bower_components/es6-promise/promise.js","webpack:///(webpack)/~/node-libs-browser/~/timers-browserify/main.js","webpack:///(webpack)/~/node-libs-browser/~/process/browser.js","webpack:///(webpack)/buildin/module.js","webpack:///(webpack)/buildin/amd-define.js","webpack:///./bower_components/fetch/fetch.js","webpack:///./bower_components/pubnub/web/pubnub.js","webpack:///./src/core/Cache.js","webpack:///./src/core/Observable.js","webpack:///./src/http/Client.js","webpack:///./src/http/Utils.js","webpack:///./src/http/ApiResponse.js","webpack:///./src/mocks/ClientMock.js","webpack:///./src/mocks/Registry.js","webpack:///./src/mocks/Mock.js","webpack:///./src/platform/Platform.js","webpack:///./src/platform/Queue.js","webpack:///./src/platform/Auth.js","webpack:///./src/pubnub/PubnubFactory.js","webpack:///./src/pubnub/PubnubMock.js","webpack:///./src/subscription/Subscription.js","webpack:///./~/regenerator/runtime.js"],"names":[],"mappings":"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ACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA,2CAA2C;AAC3C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,2EAA2E;;AAE3E;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,8BAA8B,sBAAsB;;AAEpD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qBAAqB,+BAA+B;AACpD;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,uBAAuB,QAAQ;AAC/B;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,SAAS;AACT,uBAAuB,QAAQ;AAC/B;;AAEA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,kEAAkE,QAAQ;;AAE1E;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,kEAAkE,QAAQ;AAC1E;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,qCAAqC,QAAQ;;AAE7C;;AAEA,qBAAqB,wBAAwB;AAC7C;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;;AAEA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,qBAAqB,qEAAqE;AAC1F;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,qBAAqB,qEAAqE;AAC1F;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;;AAEA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,OAAO;AACP;;AAEA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;;AAEA;AACA,cAAc,SAAS;AACvB,cAAc,SAAS;AACvB;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA,cAAc,SAAS;AACvB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,oDAAyB,wCAAwC,EAAE;AACnE,KAAK;AACL;AACA,KAAK;AACL;AACA;;AAEA;AACA,CAAC;;;;;;;;;ACt8BD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,iBAAiB;;AAE5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA,E;;;;;;;AC3EA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,uBAAuB,sBAAsB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,2BAA2B;AAC3B;AACA;AACA;AACA,4BAA4B,UAAU;;;;;;;AC1FtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACTA,6BAA6B,mDAAmD;;;;;;;ACAhF;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP,KAAK;AACL;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA,KAAK;AACL;AACA;AACA,CAAC;;;;;;;AC5VD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,0CAA0C;;AAE1C;AACA,kBAAkB;AAClB,kBAAkB;AAClB;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,2BAA2B,YAAY;AACvC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,YAAY;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,0CAA0C;AAC1C,wBAAwB;AACxB,iCAAiC,MAAM,0BAA0B;AACjE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,2BAA2B,WAAW;AACtC;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,UAAU;AACtC;AACA;;AAEA;AACA;AACA,yCAAyC;AACzC;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,UAAU;;AAElC;AACA;AACA;AACA,mBAAmB;AACnB,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;AAGD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,6CAA6C,kBAAkB;AAC/D;AACA;AACA;AACA,mCAAmC,wBAAwB;AAC3D;AACA;;AAEA;AACA;AACA;AACA,gCAAgC,KAAK,KAAK,gBAAgB;AAC1D;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kCAAkC,EAAE;AACpC;AACA;AACA;;AAEA;AACA,sCAAsC,OAAO;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,4CAA4C,kBAAkB;AAC9D;AACA;AACA;AACA,wCAAwC,wBAAwB;AAChE;AACA;;;AAGA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,uBAAuB;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA,kBAAkB;AAClB;AACA;AACA,2CAA2C,YAAY;AACvD,CAAC,WAAW;;AAEZ;AACA,mBAAmB,YAAY;AAC/B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D,2DAA2D;AAC3D,gDAAgD,mBAAmB;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,wCAAwC,UAAU;AAClD,wCAAwC;AACxC;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B,uCAAuC;AACrE;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,mCAAmC;AACnC,SAAS;;AAET;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,mCAAmC;AACnC,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;;AAEb;;AAEA;AACA;AACA;;AAEA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;;;;AAIA;AACA;;;;;AAKA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;;AAGA;AACA;AACA;AACA,0CAA0C,yEAAyE;AACnH;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA,SAAS;AACT;;AAEA,0BAA0B;AAC1B;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;;AAEA;AACA,SAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,SAAS;;AAET;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA,SAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA,8CAA8C;AAC9C,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,iEAAiE;AAC9F;AACA;AACA;AACA;AACA,mCAAmC,qBAAqB;AACxD;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;;AAET;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,uCAAuC,kCAAkC;AACzE;AACA;AACA,aAAa;AACb,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA,uCAAuC,EAAE;AACzC;AACA;AACA;;AAEA,wBAAwB;;AAExB;;AAEA;AACA;AACA;AACA;AACA;AACA,+CAA+C,wBAAwB;AACvE,uCAAuC;AACvC,aAAa;AACb,SAAS;;AAET;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sBAAsB;;AAEtB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;;AAEb;AACA;AACA,SAAS;;AAET;AACA,gCAAgC,sBAAsB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B;;AAE9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,iBAAiB;;;AAG/D,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,iBAAiB;;AAE/D,iBAAiB;AACjB;;AAEA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA,8CAA8C;AAC9C,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,qBAAqB;;AAErB;AACA;;AAEA;AACA;AACA;AACA;AACA,sDAAsD,mCAAmC;AACzF;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA,6BAA6B,kBAAkB,EAAE;AACjD;AACA,qBAAqB;AACrB,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;;AAErB;AACA;;AAEA;AACA;AACA;AACA;AACA,4DAA4D,mCAAmC;AAC/F;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA,6BAA6B,wBAAwB,EAAE;AACvD;AACA,qBAAqB;AACrB,iBAAiB;AACjB;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,qBAAqB;AACrB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,4CAA4C,mCAAmC;;AAE/E;AACA;AACA;;;AAGA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,6BAA6B;AAC7B;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;AACA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA,6BAA6B;AAC7B;AACA,qFAAqF;AACrF;AACA;AACA,oDAAoD,aAAa;AACjE,uCAAuC;AACvC;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,+FAA+F;AAC/F,iCAAiC;AACjC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,SAAS;;AAET;AACA,6BAA6B,sCAAsC;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;;AAE5B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,+BAA+B,0BAA0B;;AAEzD;AACA;AACA,iE;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb,SAAS;;AAET;AACA,6CAA6C,sCAAsC;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;;AAE5B;AACA;AACA;;AAEA,+BAA+B,0BAA0B;;AAEzD;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,oBAAoB;;AAEhE;AACA;AACA;AACA;;AAEA,+BAA+B,0BAA0B;;AAEzD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;;AAEA,aAAa;;AAEb,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,0BAA0B;AACzD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,sBAAsB;;AAEtB;AACA;AACA,aAAa;AACb;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;;AAEb,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,wBAAwB;AACxB,+BAA+B,0BAA0B;AACzD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,4BAA4B;;AAE5B;AACA;;AAEA;;AAEA,+BAA+B,0BAA0B;;AAEzD;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,+CAA+C,8BAA8B;AAC7E,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC,gBAAgB,6DAA6D;AAC7E,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yFAAyF,uBAAuB;AAChH;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,yBAAyB,eAAe,uBAAuB;AAC5H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA,sBAAsB,yBAAyB;AAC/C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,YAAY;AACjB;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA,cAAc,sCAAsC;AACpD;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA,0BAA0B;;;AAG1B;AACA;AACA;AACA;AACA;AACA,qBAAqB;;;;AAIrB;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,iDAAiD,eAAe;AAChE;AACA;AACA;AACA;AACA,iBAAiB;AACjB,iCAAiC,yBAAyB;AAC1D;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,wCAAwC,SAAS,sBAAsB,EAAE;AACzE;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;;AAEA;;AAEA,iCAAiC;AACjC;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,uBAAuB,4CAA4C;AACnE,uBAAuB,gBAAgB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,SAAS,sBAAsB,EAAE;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,kDAAkD;AAClD,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,iBAAiB,gEAAgE,EAAE;AACtH;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf,eAAe;AACf;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;;AAE3B;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;;;AAGvC;AACA;AACA,+DAA+D,8BAA8B;AAC7F;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,2CAA2C;;AAE3C;AACA;AACA;AACA;AACA;AACA,qCAAqC,sBAAsB;AAC3D;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,YAAY,2CAA2C;;AAEvD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,+BAA+B;AAC/B,8BAA8B,0BAA0B,EAAE;AAC1D;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,CAAC;AACD;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2BAA2B;AAC3B,2BAA2B;AAC3B,2BAA2B;AAC3B,2BAA2B;;AAE3B;AACA,wCAAwC,0BAA0B;AAClE,wCAAwC;AACxC,wCAAwC;AACxC,wCAAwC;AACxC,wCAAwC;AACxC,wCAAwC;AACxC,wCAAwC;;AAExC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA,+BAA+B,mBAAmB;AAClD,SAAS;AACT;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,oBAAoB;AAChD;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;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ACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,KAAK;AACL,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,WAAW;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS;AACT;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAiC,kBAAkB;AACnD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,iBAAiB;;AAEjB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,YAAY;AACZ;AACA;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,8CAA8C,QAAQ;AACtD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA,WAAW;AACX;AACA;AACA;;AAEA,WAAW;AACX;AACA;AACA;;AAEA,WAAW;AACX;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,8CAA8C,QAAQ;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;;AAEL;AACA,8CAA8C,QAAQ;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,8CAA8C,QAAQ;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA","file":"ringcentral-bundle.js","sourcesContent":["(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[\"SDK\"] = factory();\n\telse\n\t\troot[\"RingCentral\"] = root[\"RingCentral\"] || {}, root[\"RingCentral\"][\"SDK\"] = factory();\n})(this, function() {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\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 = \"/build/\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap ab5bb5a6cdbb0cfc49a3\n **/","import * as Utils from './core/Utils';\nimport Cache from './core/Cache';\nimport * as Externals from './core/Externals';\nimport Observable from './core/Observable';\n\nimport Client from './http/Client';\nimport ApiResponse from './http/ApiResponse';\nimport * as HttpUtils from './http/Utils';\n\nimport {default as ClientMock} from './mocks/ClientMock';\nimport Mock from './mocks/Mock';\nimport Registry from './mocks/Registry';\n\nimport Platform from './platform/Platform';\nimport Auth from './platform/Auth';\nimport Queue from './platform/Queue';\n\nimport PubnubMockFactory from './pubnub/PubnubFactory';\n\nimport Subscription from './subscription/Subscription';\n\nrequire(\"regenerator/runtime\");\n\nexport default class SDK {\n\n static version = '2.0.0';\n\n static server = {\n sandbox: 'https://platform.devtest.ringcentral.com',\n production: 'https://platform.ringcentral.com'\n };\n\n /**\n * @constructor\n * @param {object} [options]\n * @param {string} [options.server]\n * @param {string} [options.cachePrefix]\n * @param {string} [options.appSecret]\n * @param {string} [options.appKey]\n * @param {string} [options.appName]\n * @param {string} [options.appVersion]\n * @param {string} [options.pubnubFactory]\n * @param {string} [options.client]\n */\n constructor(options) {\n\n options = options || {};\n\n this._cache = new Cache(Externals.localStorage, options.cachePrefix);\n\n this._client = options.client || new Client();\n\n this._platform = new Platform(this._client, this._cache, options.server, options.appKey, options.appSecret);\n\n this._pubnubFactory = options.pubnubFactory || Externals.PUBNUB;\n\n }\n\n /**\n * @return {Platform}\n */\n platform() {\n return this._platform;\n }\n\n /**\n * @return {Subscription}\n */\n createSubscription() {\n return new Subscription(this._pubnubFactory, this._platform, this._cache);\n }\n\n /**\n * @return {Cache}\n */\n cache() {\n return this._cache;\n }\n\n static core = {\n Cache: Cache,\n Observable: Observable,\n Utils: Utils,\n Externals: Externals\n };\n\n static http = {\n Client: Client,\n ApiResponse: ApiResponse,\n Utils: HttpUtils\n };\n\n static platform = {\n Auth: Auth,\n Platform: Platform,\n Queue: Queue\n };\n\n static subscription = {\n Subscription: Subscription\n };\n\n static mocks = {\n Client: ClientMock,\n Registry: Registry,\n Mock: Mock\n };\n\n static pubnub = {\n PubnubMockFactory: PubnubMockFactory\n };\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/SDK.js\n **/","import {Promise} from './Externals.js';\n\n/**\n * TODO Replace with something better\n * @see https://github.com/joyent/node/blob/master/lib/querystring.js\n * @param {object} parameters\n * @returns {string}\n */\nexport function queryStringify(parameters) {\n\n var array = [];\n\n parameters = parameters || {};\n\n Object.keys(parameters).forEach((k) => {\n\n var v = parameters[k];\n\n if (isArray(v)) {\n v.forEach((vv) => {\n array.push(encodeURIComponent(k) + '=' + encodeURIComponent(vv));\n });\n } else {\n array.push(encodeURIComponent(k) + '=' + encodeURIComponent(v));\n }\n\n });\n\n return array.join('&');\n\n}\n\n/**\n * TODO Replace with something better\n * @see https://github.com/joyent/node/blob/master/lib/querystring.js\n * @param {string} queryString\n * @returns {object}\n */\nexport function parseQueryString(queryString) {\n\n var argsParsed = {};\n\n queryString.split('&').forEach((arg) => {\n\n arg = decodeURIComponent(arg);\n\n if (arg.indexOf('=') == -1) {\n\n argsParsed[arg.trim()] = true;\n\n } else {\n\n var pair = arg.split('='),\n key = pair[0].trim(),\n value = pair[1].trim();\n\n if (key in argsParsed) {\n if (key in argsParsed && !isArray(argsParsed[key])) argsParsed[key] = [argsParsed[key]];\n argsParsed[key].push(value);\n } else {\n argsParsed[key] = value;\n }\n\n }\n\n });\n\n return argsParsed;\n\n}\n\n/**\n * @param obj\n * @return {boolean}\n */\nexport function isFunction(obj) {\n return typeof obj === \"function\";\n}\n\n/**\n * @param obj\n * @return {boolean}\n */\nexport function isArray(obj) {\n return Array.isArray ? Array.isArray(obj) : typeof obj === \"array\";\n}\n\n/**\n * @param fn\n * @param interval\n * @param timeout\n */\nexport function poll(fn, interval, timeout) { //NodeJS.Timer|number\n\n module.exports.stopPolling(timeout);\n\n interval = interval || 1000;\n\n var next = (delay) => {\n\n delay = delay || interval;\n\n interval = delay;\n\n return setTimeout(() => {\n\n fn(next, delay);\n\n }, delay);\n\n };\n\n return next();\n\n}\n\nexport function stopPolling(timeout) {\n if (timeout) clearTimeout(timeout);\n}\n\nexport function isNodeJS() {\n return (typeof process !== 'undefined');\n}\n\nexport function isBrowser() {\n return (typeof window !== 'undefined');\n}\n\nexport function delay(timeout) {\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n resolve(null);\n }, timeout);\n });\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Utils.js\n **/","import ES6Promise from 'es6-promise';\nimport nodeFetch from 'node-fetch';\nimport pubnub from 'pubnub';\n\nexport var Promise = (ES6Promise && ES6Promise.Promise) || window.Promise;\n\nexport var fetch = nodeFetch || window.fetch;\nexport var Request = fetch.Request || window.Request;\nexport var Response = fetch.Response || window.Response;\nexport var Headers = fetch.Headers || window.Headers;\n\nexport var PUBNUB = pubnub || window.PUBNUB;\n\nexport var localStorage = (typeof window !== 'undefined' &&\n typeof window.localStorage !== 'undefined') ? window.localStorage : {};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Externals.js\n **/","/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license Licensed under MIT license\n * See https://raw.githubusercontent.com/jakearchibald/es6-promise/master/LICENSE\n * @version 2.2.0\n */\n\n(function() {\n \"use strict\";\n function lib$es6$promise$utils$$objectOrFunction(x) {\n return typeof x === 'function' || (typeof x === 'object' && x !== null);\n }\n\n function lib$es6$promise$utils$$isFunction(x) {\n return typeof x === 'function';\n }\n\n function lib$es6$promise$utils$$isMaybeThenable(x) {\n return typeof x === 'object' && x !== null;\n }\n\n var lib$es6$promise$utils$$_isArray;\n if (!Array.isArray) {\n lib$es6$promise$utils$$_isArray = function (x) {\n return Object.prototype.toString.call(x) === '[object Array]';\n };\n } else {\n lib$es6$promise$utils$$_isArray = Array.isArray;\n }\n\n var lib$es6$promise$utils$$isArray = lib$es6$promise$utils$$_isArray;\n var lib$es6$promise$asap$$len = 0;\n var lib$es6$promise$asap$$toString = {}.toString;\n var lib$es6$promise$asap$$vertxNext;\n var lib$es6$promise$asap$$customSchedulerFn;\n\n function lib$es6$promise$asap$$asap(callback, arg) {\n lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len] = callback;\n lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len + 1] = arg;\n lib$es6$promise$asap$$len += 2;\n if (lib$es6$promise$asap$$len === 2) {\n // If len is 2, 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 if (lib$es6$promise$asap$$customSchedulerFn) {\n lib$es6$promise$asap$$customSchedulerFn(lib$es6$promise$asap$$flush);\n } else {\n lib$es6$promise$asap$$scheduleFlush();\n }\n }\n }\n\n var lib$es6$promise$asap$$default = lib$es6$promise$asap$$asap;\n function lib$es6$promise$asap$$setScheduler(scheduleFn) {\n lib$es6$promise$asap$$customSchedulerFn = scheduleFn;\n }\n\n var lib$es6$promise$asap$$browserWindow = (typeof window !== 'undefined') ? window : undefined;\n var lib$es6$promise$asap$$browserGlobal = lib$es6$promise$asap$$browserWindow || {};\n var lib$es6$promise$asap$$BrowserMutationObserver = lib$es6$promise$asap$$browserGlobal.MutationObserver || lib$es6$promise$asap$$browserGlobal.WebKitMutationObserver;\n var lib$es6$promise$asap$$isNode = typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n // test for web worker but not in IE10\n var lib$es6$promise$asap$$isWorker = typeof Uint8ClampedArray !== 'undefined' &&\n typeof importScripts !== 'undefined' &&\n typeof MessageChannel !== 'undefined';\n\n // node\n function lib$es6$promise$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$es6$promise$asap$$flush);\n };\n }\n\n // vertx\n function lib$es6$promise$asap$$useVertxTimer() {\n return function() {\n lib$es6$promise$asap$$vertxNext(lib$es6$promise$asap$$flush);\n };\n }\n\n function lib$es6$promise$asap$$useMutationObserver() {\n var iterations = 0;\n var observer = new lib$es6$promise$asap$$BrowserMutationObserver(lib$es6$promise$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$es6$promise$asap$$useMessageChannel() {\n var channel = new MessageChannel();\n channel.port1.onmessage = lib$es6$promise$asap$$flush;\n return function () {\n channel.port2.postMessage(0);\n };\n }\n\n function lib$es6$promise$asap$$useSetTimeout() {\n return function() {\n setTimeout(lib$es6$promise$asap$$flush, 1);\n };\n }\n\n var lib$es6$promise$asap$$queue = new Array(1000);\n function lib$es6$promise$asap$$flush() {\n for (var i = 0; i < lib$es6$promise$asap$$len; i+=2) {\n var callback = lib$es6$promise$asap$$queue[i];\n var arg = lib$es6$promise$asap$$queue[i+1];\n\n callback(arg);\n\n lib$es6$promise$asap$$queue[i] = undefined;\n lib$es6$promise$asap$$queue[i+1] = undefined;\n }\n\n lib$es6$promise$asap$$len = 0;\n }\n\n function lib$es6$promise$asap$$attemptVertex() {\n try {\n var r = require;\n var vertx = r('vertx');\n lib$es6$promise$asap$$vertxNext = vertx.runOnLoop || vertx.runOnContext;\n return lib$es6$promise$asap$$useVertxTimer();\n } catch(e) {\n return lib$es6$promise$asap$$useSetTimeout();\n }\n }\n\n var lib$es6$promise$asap$$scheduleFlush;\n // Decide what async method to use to triggering processing of queued callbacks:\n if (lib$es6$promise$asap$$isNode) {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useNextTick();\n } else if (lib$es6$promise$asap$$BrowserMutationObserver) {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMutationObserver();\n } else if (lib$es6$promise$asap$$isWorker) {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMessageChannel();\n } else if (lib$es6$promise$asap$$browserWindow === undefined && typeof require === 'function') {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$attemptVertex();\n } else {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useSetTimeout();\n }\n\n function lib$es6$promise$$internal$$noop() {}\n\n var lib$es6$promise$$internal$$PENDING = void 0;\n var lib$es6$promise$$internal$$FULFILLED = 1;\n var lib$es6$promise$$internal$$REJECTED = 2;\n\n var lib$es6$promise$$internal$$GET_THEN_ERROR = new lib$es6$promise$$internal$$ErrorObject();\n\n function lib$es6$promise$$internal$$selfFullfillment() {\n return new TypeError(\"You cannot resolve a promise with itself\");\n }\n\n function lib$es6$promise$$internal$$cannotReturnOwn() {\n return new TypeError('A promises callback cannot return that same promise.');\n }\n\n function lib$es6$promise$$internal$$getThen(promise) {\n try {\n return promise.then;\n } catch(error) {\n lib$es6$promise$$internal$$GET_THEN_ERROR.error = error;\n return lib$es6$promise$$internal$$GET_THEN_ERROR;\n }\n }\n\n function lib$es6$promise$$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$es6$promise$$internal$$handleForeignThenable(promise, thenable, then) {\n lib$es6$promise$asap$$default(function(promise) {\n var sealed = false;\n var error = lib$es6$promise$$internal$$tryThen(then, thenable, function(value) {\n if (sealed) { return; }\n sealed = true;\n if (thenable !== value) {\n lib$es6$promise$$internal$$resolve(promise, value);\n } else {\n lib$es6$promise$$internal$$fulfill(promise, value);\n }\n }, function(reason) {\n if (sealed) { return; }\n sealed = true;\n\n lib$es6$promise$$internal$$reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && error) {\n sealed = true;\n lib$es6$promise$$internal$$reject(promise, error);\n }\n }, promise);\n }\n\n function lib$es6$promise$$internal$$handleOwnThenable(promise, thenable) {\n if (thenable._state === lib$es6$promise$$internal$$FULFILLED) {\n lib$es6$promise$$internal$$fulfill(promise, thenable._result);\n } else if (thenable._state === lib$es6$promise$$internal$$REJECTED) {\n lib$es6$promise$$internal$$reject(promise, thenable._result);\n } else {\n lib$es6$promise$$internal$$subscribe(thenable, undefined, function(value) {\n lib$es6$promise$$internal$$resolve(promise, value);\n }, function(reason) {\n lib$es6$promise$$internal$$reject(promise, reason);\n });\n }\n }\n\n function lib$es6$promise$$internal$$handleMaybeThenable(promise, maybeThenable) {\n if (maybeThenable.constructor === promise.constructor) {\n lib$es6$promise$$internal$$handleOwnThenable(promise, maybeThenable);\n } else {\n var then = lib$es6$promise$$internal$$getThen(maybeThenable);\n\n if (then === lib$es6$promise$$internal$$GET_THEN_ERROR) {\n lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$GET_THEN_ERROR.error);\n } else if (then === undefined) {\n lib$es6$promise$$internal$$fulfill(promise, maybeThenable);\n } else if (lib$es6$promise$utils$$isFunction(then)) {\n lib$es6$promise$$internal$$handleForeignThenable(promise, maybeThenable, then);\n } else {\n lib$es6$promise$$internal$$fulfill(promise, maybeThenable);\n }\n }\n }\n\n function lib$es6$promise$$internal$$resolve(promise, value) {\n if (promise === value) {\n lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$selfFullfillment());\n } else if (lib$es6$promise$utils$$objectOrFunction(value)) {\n lib$es6$promise$$internal$$handleMaybeThenable(promise, value);\n } else {\n lib$es6$promise$$internal$$fulfill(promise, value);\n }\n }\n\n function lib$es6$promise$$internal$$publishRejection(promise) {\n if (promise._onerror) {\n promise._onerror(promise._result);\n }\n\n lib$es6$promise$$internal$$publish(promise);\n }\n\n function lib$es6$promise$$internal$$fulfill(promise, value) {\n if (promise._state !== lib$es6$promise$$internal$$PENDING) { return; }\n\n promise._result = value;\n promise._state = lib$es6$promise$$internal$$FULFILLED;\n\n if (promise._subscribers.length !== 0) {\n lib$es6$promise$asap$$default(lib$es6$promise$$internal$$publish, promise);\n }\n }\n\n function lib$es6$promise$$internal$$reject(promise, reason) {\n if (promise._state !== lib$es6$promise$$internal$$PENDING) { return; }\n promise._state = lib$es6$promise$$internal$$REJECTED;\n promise._result = reason;\n\n lib$es6$promise$asap$$default(lib$es6$promise$$internal$$publishRejection, promise);\n }\n\n function lib$es6$promise$$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$es6$promise$$internal$$FULFILLED] = onFulfillment;\n subscribers[length + lib$es6$promise$$internal$$REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n lib$es6$promise$asap$$default(lib$es6$promise$$internal$$publish, parent);\n }\n }\n\n function lib$es6$promise$$internal$$publish(promise) {\n var subscribers = promise._subscribers;\n var settled = promise._state;\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$es6$promise$$internal$$invokeCallback(settled, child, callback, detail);\n } else {\n callback(detail);\n }\n }\n\n promise._subscribers.length = 0;\n }\n\n function lib$es6$promise$$internal$$ErrorObject() {\n this.error = null;\n }\n\n var lib$es6$promise$$internal$$TRY_CATCH_ERROR = new lib$es6$promise$$internal$$ErrorObject();\n\n function lib$es6$promise$$internal$$tryCatch(callback, detail) {\n try {\n return callback(detail);\n } catch(e) {\n lib$es6$promise$$internal$$TRY_CATCH_ERROR.error = e;\n return lib$es6$promise$$internal$$TRY_CATCH_ERROR;\n }\n }\n\n function lib$es6$promise$$internal$$invokeCallback(settled, promise, callback, detail) {\n var hasCallback = lib$es6$promise$utils$$isFunction(callback),\n value, error, succeeded, failed;\n\n if (hasCallback) {\n value = lib$es6$promise$$internal$$tryCatch(callback, detail);\n\n if (value === lib$es6$promise$$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$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$cannotReturnOwn());\n return;\n }\n\n } else {\n value = detail;\n succeeded = true;\n }\n\n if (promise._state !== lib$es6$promise$$internal$$PENDING) {\n // noop\n } else if (hasCallback && succeeded) {\n lib$es6$promise$$internal$$resolve(promise, value);\n } else if (failed) {\n lib$es6$promise$$internal$$reject(promise, error);\n } else if (settled === lib$es6$promise$$internal$$FULFILLED) {\n lib$es6$promise$$internal$$fulfill(promise, value);\n } else if (settled === lib$es6$promise$$internal$$REJECTED) {\n lib$es6$promise$$internal$$reject(promise, value);\n }\n }\n\n function lib$es6$promise$$internal$$initializePromise(promise, resolver) {\n try {\n resolver(function resolvePromise(value){\n lib$es6$promise$$internal$$resolve(promise, value);\n }, function rejectPromise(reason) {\n lib$es6$promise$$internal$$reject(promise, reason);\n });\n } catch(e) {\n lib$es6$promise$$internal$$reject(promise, e);\n }\n }\n\n function lib$es6$promise$enumerator$$Enumerator(Constructor, input) {\n var enumerator = this;\n\n enumerator._instanceConstructor = Constructor;\n enumerator.promise = new Constructor(lib$es6$promise$$internal$$noop);\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$es6$promise$$internal$$fulfill(enumerator.promise, enumerator._result);\n } else {\n enumerator.length = enumerator.length || 0;\n enumerator._enumerate();\n if (enumerator._remaining === 0) {\n lib$es6$promise$$internal$$fulfill(enumerator.promise, enumerator._result);\n }\n }\n } else {\n lib$es6$promise$$internal$$reject(enumerator.promise, enumerator._validationError());\n }\n }\n\n lib$es6$promise$enumerator$$Enumerator.prototype._validateInput = function(input) {\n return lib$es6$promise$utils$$isArray(input);\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._validationError = function() {\n return new Error('Array Methods must be provided an Array');\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._init = function() {\n this._result = new Array(this.length);\n };\n\n var lib$es6$promise$enumerator$$default = lib$es6$promise$enumerator$$Enumerator;\n\n lib$es6$promise$enumerator$$Enumerator.prototype._enumerate = function() {\n var enumerator = this;\n\n var length = enumerator.length;\n var promise = enumerator.promise;\n var input = enumerator._input;\n\n for (var i = 0; promise._state === lib$es6$promise$$internal$$PENDING && i < length; i++) {\n enumerator._eachEntry(input[i], i);\n }\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._eachEntry = function(entry, i) {\n var enumerator = this;\n var c = enumerator._instanceConstructor;\n\n if (lib$es6$promise$utils$$isMaybeThenable(entry)) {\n if (entry.constructor === c && entry._state !== lib$es6$promise$$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] = entry;\n }\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._settledAt = function(state, i, value) {\n var enumerator = this;\n var promise = enumerator.promise;\n\n if (promise._state === lib$es6$promise$$internal$$PENDING) {\n enumerator._remaining--;\n\n if (state === lib$es6$promise$$internal$$REJECTED) {\n lib$es6$promise$$internal$$reject(promise, value);\n } else {\n enumerator._result[i] = value;\n }\n }\n\n if (enumerator._remaining === 0) {\n lib$es6$promise$$internal$$fulfill(promise, enumerator._result);\n }\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._willSettleAt = function(promise, i) {\n var enumerator = this;\n\n lib$es6$promise$$internal$$subscribe(promise, undefined, function(value) {\n enumerator._settledAt(lib$es6$promise$$internal$$FULFILLED, i, value);\n }, function(reason) {\n enumerator._settledAt(lib$es6$promise$$internal$$REJECTED, i, reason);\n });\n };\n function lib$es6$promise$promise$all$$all(entries) {\n return new lib$es6$promise$enumerator$$default(this, entries).promise;\n }\n var lib$es6$promise$promise$all$$default = lib$es6$promise$promise$all$$all;\n function lib$es6$promise$promise$race$$race(entries) {\n /*jshint validthis:true */\n var Constructor = this;\n\n var promise = new Constructor(lib$es6$promise$$internal$$noop);\n\n if (!lib$es6$promise$utils$$isArray(entries)) {\n lib$es6$promise$$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$es6$promise$$internal$$resolve(promise, value);\n }\n\n function onRejection(reason) {\n lib$es6$promise$$internal$$reject(promise, reason);\n }\n\n for (var i = 0; promise._state === lib$es6$promise$$internal$$PENDING && i < length; i++) {\n lib$es6$promise$$internal$$subscribe(Constructor.resolve(entries[i]), undefined, onFulfillment, onRejection);\n }\n\n return promise;\n }\n var lib$es6$promise$promise$race$$default = lib$es6$promise$promise$race$$race;\n function lib$es6$promise$promise$resolve$$resolve(object) {\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$es6$promise$$internal$$noop);\n lib$es6$promise$$internal$$resolve(promise, object);\n return promise;\n }\n var lib$es6$promise$promise$resolve$$default = lib$es6$promise$promise$resolve$$resolve;\n function lib$es6$promise$promise$reject$$reject(reason) {\n /*jshint validthis:true */\n var Constructor = this;\n var promise = new Constructor(lib$es6$promise$$internal$$noop);\n lib$es6$promise$$internal$$reject(promise, reason);\n return promise;\n }\n var lib$es6$promise$promise$reject$$default = lib$es6$promise$promise$reject$$reject;\n\n var lib$es6$promise$promise$$counter = 0;\n\n function lib$es6$promise$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$es6$promise$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 var lib$es6$promise$promise$$default = lib$es6$promise$promise$$Promise;\n /**\n Promise objects represent the eventual result of an asynchronous operation. The\n primary way of interacting with a promise is through its `then` method, which\n registers callbacks to receive either a promise’s eventual value or the reason\n why the promise cannot be fulfilled.\n\n Terminology\n -----------\n\n - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n - `thenable` is an object or function that defines a `then` method.\n - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n - `exception` is a value that is thrown using the throw statement.\n - `reason` is a value that indicates why a promise was rejected.\n - `settled` the final resting state of a promise, fulfilled or rejected.\n\n A promise can be in one of three states: pending, fulfilled, or rejected.\n\n Promises that are fulfilled have a fulfillment value and are in the fulfilled\n state. Promises that are rejected have a rejection reason and are in the\n rejected state. A fulfillment value is never a thenable.\n\n Promises can also be said to *resolve* a value. If this value is also a\n promise, then the original promise's settled state will match the value's\n settled state. So a promise that *resolves* a promise that rejects will\n itself reject, and a promise that *resolves* a promise that fulfills will\n itself fulfill.\n\n\n Basic Usage:\n ------------\n\n ```js\n var promise = new Promise(function(resolve, reject) {\n // on success\n resolve(value);\n\n // on failure\n reject(reason);\n });\n\n promise.then(function(value) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Advanced Usage:\n ---------------\n\n Promises shine when abstracting away asynchronous interactions such as\n `XMLHttpRequest`s.\n\n ```js\n function getJSON(url) {\n return new Promise(function(resolve, reject){\n var xhr = new XMLHttpRequest();\n\n xhr.open('GET', url);\n xhr.onreadystatechange = handler;\n xhr.responseType = 'json';\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send();\n\n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200) {\n resolve(this.response);\n } else {\n reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n }\n }\n };\n });\n }\n\n getJSON('/posts.json').then(function(json) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Unlike callbacks, promises are great composable primitives.\n\n ```js\n Promise.all([\n getJSON('/posts'),\n getJSON('/comments')\n ]).then(function(values){\n values[0] // => postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class Promise\n @param {function} resolver\n Useful for tooling.\n @constructor\n */\n function lib$es6$promise$promise$$Promise(resolver) {\n this._id = lib$es6$promise$promise$$counter++;\n this._state = undefined;\n this._result = undefined;\n this._subscribers = [];\n\n if (lib$es6$promise$$internal$$noop !== resolver) {\n if (!lib$es6$promise$utils$$isFunction(resolver)) {\n lib$es6$promise$promise$$needsResolver();\n }\n\n if (!(this instanceof lib$es6$promise$promise$$Promise)) {\n lib$es6$promise$promise$$needsNew();\n }\n\n lib$es6$promise$$internal$$initializePromise(this, resolver);\n }\n }\n\n lib$es6$promise$promise$$Promise.all = lib$es6$promise$promise$all$$default;\n lib$es6$promise$promise$$Promise.race = lib$es6$promise$promise$race$$default;\n lib$es6$promise$promise$$Promise.resolve = lib$es6$promise$promise$resolve$$default;\n lib$es6$promise$promise$$Promise.reject = lib$es6$promise$promise$reject$$default;\n lib$es6$promise$promise$$Promise._setScheduler = lib$es6$promise$asap$$setScheduler;\n lib$es6$promise$promise$$Promise._asap = lib$es6$promise$asap$$default;\n\n lib$es6$promise$promise$$Promise.prototype = {\n constructor: lib$es6$promise$promise$$Promise,\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 Useful for tooling.\n @return {Promise}\n */\n then: function(onFulfillment, onRejection) {\n var parent = this;\n var state = parent._state;\n\n if (state === lib$es6$promise$$internal$$FULFILLED && !onFulfillment || state === lib$es6$promise$$internal$$REJECTED && !onRejection) {\n return this;\n }\n\n var child = new this.constructor(lib$es6$promise$$internal$$noop);\n var result = parent._result;\n\n if (state) {\n var callback = arguments[state - 1];\n lib$es6$promise$asap$$default(function(){\n lib$es6$promise$$internal$$invokeCallback(state, child, callback, result);\n });\n } else {\n lib$es6$promise$$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 Useful for tooling.\n @return {Promise}\n */\n 'catch': function(onRejection) {\n return this.then(null, onRejection);\n }\n };\n function lib$es6$promise$polyfill$$polyfill() {\n var local;\n\n if (typeof global !== 'undefined') {\n local = global;\n } else if (typeof self !== 'undefined') {\n local = self;\n } else {\n try {\n local = Function('return this')();\n } catch (e) {\n throw new Error('polyfill failed because global object is unavailable in this environment');\n }\n }\n\n var P = local.Promise;\n\n if (P && Object.prototype.toString.call(P.resolve()) === '[object Promise]' && !P.cast) {\n return;\n }\n\n local.Promise = lib$es6$promise$promise$$default;\n }\n var lib$es6$promise$polyfill$$default = lib$es6$promise$polyfill$$polyfill;\n\n var lib$es6$promise$umd$$ES6Promise = {\n 'Promise': lib$es6$promise$promise$$default,\n 'polyfill': lib$es6$promise$polyfill$$default\n };\n\n /* global define:true module:true window: true */\n if (typeof define === 'function' && define['amd']) {\n define(function() { return lib$es6$promise$umd$$ES6Promise; });\n } else if (typeof module !== 'undefined' && module['exports']) {\n module['exports'] = lib$es6$promise$umd$$ES6Promise;\n } else if (typeof this !== 'undefined') {\n this['ES6Promise'] = lib$es6$promise$umd$$ES6Promise;\n }\n\n lib$es6$promise$polyfill$$default();\n}).call(this);\n\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./bower_components/es6-promise/promise.js\n ** module id = 4\n ** module chunks = 0\n **/","var nextTick = require('process/browser.js').nextTick;\nvar apply = Function.prototype.apply;\nvar slice = Array.prototype.slice;\nvar immediateIds = {};\nvar nextImmediateId = 0;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n return new Timeout(apply.call(setInterval, window, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) { timeout.close(); };\n\nfunction Timeout(id, clearFn) {\n this._id = id;\n this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n this._clearFn.call(window, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n clearTimeout(item._idleTimeoutId);\n\n var msecs = item._idleTimeout;\n if (msecs >= 0) {\n item._idleTimeoutId = setTimeout(function onTimeout() {\n if (item._onTimeout)\n item._onTimeout();\n }, msecs);\n }\n};\n\n// That's not how node.js implements it but the exposed api is the same.\nexports.setImmediate = typeof setImmediate === \"function\" ? setImmediate : function(fn) {\n var id = nextImmediateId++;\n var args = arguments.length < 2 ? false : slice.call(arguments, 1);\n\n immediateIds[id] = true;\n\n nextTick(function onNextTick() {\n if (immediateIds[id]) {\n // fn.call() is faster so we optimize for the common use-case\n // @see http://jsperf.com/call-apply-segu\n if (args) {\n fn.apply(null, args);\n } else {\n fn.call(null);\n }\n // Prevent ids from leaking\n exports.clearImmediate(id);\n }\n });\n\n return id;\n};\n\nexports.clearImmediate = typeof clearImmediate === \"function\" ? clearImmediate : function(id) {\n delete immediateIds[id];\n};\n\n\n/*****************\n ** WEBPACK FOOTER\n ** (webpack)/~/node-libs-browser/~/timers-browserify/main.js\n ** module id = 5\n ** module chunks = 0\n **/","// shim for using process in browser\n\nvar process = module.exports = {};\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = setTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n clearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n setTimeout(drainQueue, 0);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** (webpack)/~/node-libs-browser/~/process/browser.js\n ** module id = 6\n ** module chunks = 0\n **/","module.exports = function(module) {\r\n\tif(!module.webpackPolyfill) {\r\n\t\tmodule.deprecate = function() {};\r\n\t\tmodule.paths = [];\r\n\t\t// module.parent = undefined by default\r\n\t\tmodule.children = [];\r\n\t\tmodule.webpackPolyfill = 1;\r\n\t}\r\n\treturn module;\r\n}\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** (webpack)/buildin/module.js\n ** module id = 7\n ** module chunks = 0\n **/","module.exports = function() { throw new Error(\"define cannot be used indirect\"); };\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** (webpack)/buildin/amd-define.js\n ** module id = 8\n ** module chunks = 0\n **/","(function() {\n 'use strict';\n\n if (self.fetch) {\n return\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n }\n\n function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var list = this.map[name]\n if (!list) {\n list = []\n this.map[name] = list\n }\n list.push(value)\n }\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n }\n\n Headers.prototype.get = function(name) {\n var values = this.map[normalizeName(name)]\n return values ? values[0] : null\n }\n\n Headers.prototype.getAll = function(name) {\n return this.map[normalizeName(name)] || []\n }\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n }\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = [normalizeValue(value)]\n }\n\n Headers.prototype.forEach = function(callback, thisArg) {\n Object.getOwnPropertyNames(this.map).forEach(function(name) {\n this.map[name].forEach(function(value) {\n callback.call(thisArg, value, name, this)\n }, this)\n }, this)\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n reader.readAsArrayBuffer(blob)\n return fileReaderReady(reader)\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader()\n reader.readAsText(blob)\n return fileReaderReady(reader)\n }\n\n var support = {\n blob: 'FileReader' in self && 'Blob' in self && (function() {\n try {\n new Blob();\n return true\n } catch(e) {\n return false\n }\n })(),\n formData: 'FormData' in self\n }\n\n function Body() {\n this.bodyUsed = false\n\n\n this._initBody = function(body) {\n this._bodyInit = body\n if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (!body) {\n this._bodyText = ''\n } else {\n throw new Error('unsupported BodyInit type')\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n } else {\n this.text = function() {\n var rejected = consumed(this)\n return rejected ? rejected : Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return (methods.indexOf(upcased) > -1) ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {}\n var body = options.body\n if (Request.prototype.isPrototypeOf(input)) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n if (!body) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n } else {\n this.url = input\n }\n\n this.credentials = options.credentials || this.credentials || 'omit'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n }\n\n function decode(body) {\n var form = new FormData()\n body.trim().split('&').forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n }\n\n function headers(xhr) {\n var head = new Headers()\n var pairs = xhr.getAllResponseHeaders().trim().split('\\n')\n pairs.forEach(function(header) {\n var split = header.trim().split(':')\n var key = split.shift().trim()\n var value = split.join(':').trim()\n head.append(key, value)\n })\n return head\n }\n\n Body.call(Request.prototype)\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {}\n }\n\n this._initBody(bodyInit)\n this.type = 'default'\n this.url = null\n this.status = options.status\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = options.statusText\n this.headers = options.headers instanceof Headers ? options.headers : new Headers(options.headers)\n this.url = options.url || ''\n }\n\n Body.call(Response.prototype)\n\n self.Headers = Headers;\n self.Request = Request;\n self.Response = Response;\n\n self.fetch = function(input, init) {\n var request\n if (Request.prototype.isPrototypeOf(input) && !init) {\n request = input\n } else {\n request = new Request(input, init)\n }\n\n return new Promise(function(resolve, reject) {\n var xhr = new XMLHttpRequest()\n\n function responseURL() {\n if ('responseURL' in xhr) {\n return xhr.responseURL\n }\n\n // Avoid security warnings on getResponseHeader when not allowed by CORS\n if (/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())) {\n return xhr.getResponseHeader('X-Request-URL')\n }\n\n return;\n }\n\n xhr.onload = function() {\n var status = (xhr.status === 1223) ? 204 : xhr.status\n if (status < 100 || status > 599) {\n reject(new TypeError('Network request failed'))\n return\n }\n var options = {\n status: status,\n statusText: xhr.statusText,\n headers: headers(xhr),\n url: responseURL()\n }\n var body = 'response' in xhr ? xhr.response : xhr.responseText;\n resolve(new Response(body, options))\n }\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.open(request.method, request.url, true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob'\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n }\n self.fetch.polyfill = true\n})();\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./bower_components/fetch/fetch.js\n ** module id = 9\n ** module chunks = 0\n **/","// Version: 3.7.14\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n/* =-========================= JSON =============================-= */\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n\n(window['JSON'] && window['JSON']['stringify']) || (function () {\n window['JSON'] || (window['JSON'] = {});\n\n function toJSON(key) {\n try { return this.valueOf() }\n catch(e) { return null }\n }\n\n var cx = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n escapable = /[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n gap,\n indent,\n meta = { // table of character substitutions\n '\\b': '\\\\b',\n '\\t': '\\\\t',\n '\\n': '\\\\n',\n '\\f': '\\\\f',\n '\\r': '\\\\r',\n '\"' : '\\\\\"',\n '\\\\': '\\\\\\\\'\n },\n rep;\n\n function quote(string) {\n escapable.lastIndex = 0;\n return escapable.test(string) ?\n '\"' + string.replace(escapable, function (a) {\n var c = meta[a];\n return typeof c === 'string' ? c :\n '\\\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n }) + '\"' :\n '\"' + string + '\"';\n }\n\n function str(key, holder) {\n var i, // The loop counter.\n k, // The member key.\n v, // The member value.\n length,\n partial,\n mind = gap,\n value = holder[key];\n\n if (value && typeof value === 'object') {\n value = toJSON.call( value, key );\n }\n\n if (typeof rep === 'function') {\n value = rep.call(holder, key, value);\n }\n\n switch (typeof value) {\n case 'string':\n return quote(value);\n\n case 'number':\n return isFinite(value) ? String(value) : 'null';\n\n case 'boolean':\n case 'null':\n return String(value);\n\n case 'object':\n\n if (!value) {\n return 'null';\n }\n\n gap += indent;\n partial = [];\n\n if (Object.prototype.toString.apply(value) === '[object Array]') {\n\n length = value.length;\n for (i = 0; i < length; i += 1) {\n partial[i] = str(i, value) || 'null';\n }\n\n v = partial.length === 0 ? '[]' :\n gap ? '[\\n' + gap +\n partial.join(',\\n' + gap) + '\\n' +\n mind + ']' :\n '[' + partial.join(',') + ']';\n gap = mind;\n return v;\n }\n if (rep && typeof rep === 'object') {\n length = rep.length;\n for (i = 0; i < length; i += 1) {\n k = rep[i];\n if (typeof k === 'string') {\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? ': ' : ':') + v);\n }\n }\n }\n } else {\n for (k in value) {\n if (Object.hasOwnProperty.call(value, k)) {\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? ': ' : ':') + v);\n }\n }\n }\n }\n\n v = partial.length === 0 ? '{}' :\n gap ? '{\\n' + gap + partial.join(',\\n' + gap) + '\\n' +\n mind + '}' : '{' + partial.join(',') + '}';\n gap = mind;\n return v;\n }\n }\n\n if (typeof JSON['stringify'] !== 'function') {\n JSON['stringify'] = function (value, replacer, space) {\n var i;\n gap = '';\n indent = '';\n\n if (typeof space === 'number') {\n for (i = 0; i < space; i += 1) {\n indent += ' ';\n }\n } else if (typeof space === 'string') {\n indent = space;\n }\n rep = replacer;\n if (replacer && typeof replacer !== 'function' &&\n (typeof replacer !== 'object' ||\n typeof replacer.length !== 'number')) {\n throw new Error('JSON.stringify');\n }\n return str('', {'': value});\n };\n }\n\n if (typeof JSON['parse'] !== 'function') {\n // JSON is parsed on the server for security.\n JSON['parse'] = function (text) {return eval('('+text+')')};\n }\n}());\nvar NOW = 1\n, READY = false\n, READY_BUFFER = []\n, PRESENCE_SUFFIX = '-pnpres'\n, DEF_WINDOWING = 10 // MILLISECONDS.\n, DEF_TIMEOUT = 10000 // MILLISECONDS.\n, DEF_SUB_TIMEOUT = 310 // SECONDS.\n, DEF_KEEPALIVE = 60 // SECONDS (FOR TIMESYNC).\n, SECOND = 1000 // A THOUSAND MILLISECONDS.\n, URLBIT = '/'\n, PARAMSBIT = '&'\n, PRESENCE_HB_THRESHOLD = 5\n, PRESENCE_HB_DEFAULT = 30\n, SDK_VER = '3.7.14'\n, REPL = /{([\\w\\-]+)}/g;\n\n/**\n * UTILITIES\n */\nfunction unique() { return'x'+ ++NOW+''+(+new Date) }\nfunction rnow() { return+new Date }\n\n/**\n * NEXTORIGIN\n * ==========\n * var next_origin = nextorigin();\n */\nvar nextorigin = (function() {\n var max = 20\n , ori = Math.floor(Math.random() * max);\n return function( origin, failover ) {\n return origin.indexOf('pubsub.') > 0\n && origin.replace(\n 'pubsub', 'ps' + (\n failover ? generate_uuid().split('-')[0] :\n (++ori < max? ori : ori=1)\n ) ) || origin;\n }\n})();\n\n\n/**\n * Build Url\n * =======\n *\n */\nfunction build_url( url_components, url_params ) {\n var url = url_components.join(URLBIT)\n , params = [];\n\n if (!url_params) return url;\n\n each( url_params, function( key, value ) {\n var value_str = (typeof value == 'object')?JSON['stringify'](value):value;\n (typeof value != 'undefined' &&\n value != null && encode(value_str).length > 0\n ) && params.push(key + \"=\" + encode(value_str));\n } );\n\n url += \"?\" + params.join(PARAMSBIT);\n return url;\n}\n\n/**\n * UPDATER\n * =======\n * var timestamp = unique();\n */\nfunction updater( fun, rate ) {\n var timeout\n , last = 0\n , runnit = function() {\n if (last + rate > rnow()) {\n clearTimeout(timeout);\n timeout = setTimeout( runnit, rate );\n }\n else {\n last = rnow();\n fun();\n }\n };\n\n return runnit;\n}\n\n/**\n * GREP\n * ====\n * var list = grep( [1,2,3], function(item) { return item % 2 } )\n */\nfunction grep( list, fun ) {\n var fin = [];\n each( list || [], function(l) { fun(l) && fin.push(l) } );\n return fin\n}\n\n/**\n * SUPPLANT\n * ========\n * var text = supplant( 'Hello {name}!', { name : 'John' } )\n */\nfunction supplant( str, values ) {\n return str.replace( REPL, function( _, match ) {\n return values[match] || _\n } );\n}\n\n/**\n * timeout\n * =======\n * timeout( function(){}, 100 );\n */\nfunction timeout( fun, wait ) {\n return setTimeout( fun, wait );\n}\n\n/**\n * uuid\n * ====\n * var my_uuid = generate_uuid();\n */\nfunction generate_uuid(callback) {\n var u = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,\n function(c) {\n var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);\n return v.toString(16);\n });\n if (callback) callback(u);\n return u;\n}\n\nfunction isArray(arg) {\n return !!arg && typeof arg !== 'string' && (Array.isArray && Array.isArray(arg) || typeof(arg.length) === \"number\")\n //return !!arg && (Array.isArray && Array.isArray(arg) || typeof(arg.length) === \"number\")\n}\n\n/**\n * EACH\n * ====\n * each( [1,2,3], function(item) { } )\n */\nfunction each( o, f) {\n if ( !o || !f ) return;\n\n if ( isArray(o) )\n for ( var i = 0, l = o.length; i < l; )\n f.call( o[i], o[i], i++ );\n else\n for ( var i in o )\n o.hasOwnProperty &&\n o.hasOwnProperty(i) &&\n f.call( o[i], i, o[i] );\n}\n\n/**\n * MAP\n * ===\n * var list = map( [1,2,3], function(item) { return item + 1 } )\n */\nfunction map( list, fun ) {\n var fin = [];\n each( list || [], function( k, v ) { fin.push(fun( k, v )) } );\n return fin;\n}\n\n\nfunction pam_encode(str) {\n return encodeURIComponent(str).replace(/[!'()*~]/g, function(c) {\n return '%' + c.charCodeAt(0).toString(16).toUpperCase();\n });\n}\n\n/**\n * ENCODE\n * ======\n * var encoded_data = encode('path');\n */\nfunction encode(path) { return encodeURIComponent(path) }\n\n/**\n * Generate Subscription Channel List\n * ==================================\n * generate_channel_list(channels_object);\n */\nfunction generate_channel_list(channels, nopresence) {\n var list = [];\n each( channels, function( channel, status ) {\n if (nopresence) {\n if(channel.search('-pnpres') < 0) {\n if (status.subscribed) list.push(channel);\n }\n } else {\n if (status.subscribed) list.push(channel);\n }\n });\n return list.sort();\n}\n\n/**\n * Generate Subscription Channel Groups List\n * ==================================\n * generate_channel_group_list(channels_groups object);\n */\nfunction generate_channel_group_list(channel_groups, nopresence) {\n var list = [];\n each(channel_groups, function( channel_group, status ) {\n if (nopresence) {\n if(channel_group.search('-pnpres') < 0) {\n if (status.subscribed) list.push(channel_group);\n }\n } else {\n if (status.subscribed) list.push(channel_group);\n }\n });\n return list.sort();\n}\n\n// PUBNUB READY TO CONNECT\nfunction ready() { timeout( function() {\n if (READY) return;\n READY = 1;\n each( READY_BUFFER, function(connect) { connect() } );\n}, SECOND ); }\n\nfunction PNmessage(args) {\n msg = args || {'apns' : {}},\n msg['getPubnubMessage'] = function() {\n var m = {};\n\n if (Object.keys(msg['apns']).length) {\n m['pn_apns'] = {\n 'aps' : {\n 'alert' : msg['apns']['alert'] ,\n 'badge' : msg['apns']['badge']\n }\n }\n for (var k in msg['apns']) {\n m['pn_apns'][k] = msg['apns'][k];\n }\n var exclude1 = ['badge','alert'];\n for (var k in exclude1) {\n delete m['pn_apns'][exclude1[k]];\n }\n }\n\n\n\n if (msg['gcm']) {\n m['pn_gcm'] = {\n 'data' : msg['gcm']\n }\n }\n\n for (var k in msg) {\n m[k] = msg[k];\n }\n var exclude = ['apns','gcm','publish', 'channel','callback','error'];\n for (var k in exclude) {\n delete m[exclude[k]];\n }\n\n return m;\n };\n msg['publish'] = function() {\n\n var m = msg.getPubnubMessage();\n\n if (msg['pubnub'] && msg['channel']) {\n msg['pubnub'].publish({\n 'message' : m,\n 'channel' : msg['channel'],\n 'callback' : msg['callback'],\n 'error' : msg['error']\n })\n }\n };\n return msg;\n}\n\nfunction PN_API(setup) {\n var SUB_WINDOWING = +setup['windowing'] || DEF_WINDOWING\n , SUB_TIMEOUT = (+setup['timeout'] || DEF_SUB_TIMEOUT) * SECOND\n , KEEPALIVE = (+setup['keepalive'] || DEF_KEEPALIVE) * SECOND\n , TIME_CHECK = setup['timecheck'] || 0\n , NOLEAVE = setup['noleave'] || 0\n , PUBLISH_KEY = setup['publish_key']\n , SUBSCRIBE_KEY = setup['subscribe_key']\n , AUTH_KEY = setup['auth_key'] || ''\n , SECRET_KEY = setup['secret_key'] || ''\n , hmac_SHA256 = setup['hmac_SHA256']\n , SSL = setup['ssl'] ? 's' : ''\n , ORIGIN = 'http'+SSL+'://'+(setup['origin']||'pubsub.pubnub.com')\n , STD_ORIGIN = nextorigin(ORIGIN)\n , SUB_ORIGIN = nextorigin(ORIGIN)\n , CONNECT = function(){}\n , PUB_QUEUE = []\n , CLOAK = true\n , TIME_DRIFT = 0\n , SUB_CALLBACK = 0\n , SUB_CHANNEL = 0\n , SUB_RECEIVER = 0\n , SUB_RESTORE = setup['restore'] || 0\n , SUB_BUFF_WAIT = 0\n , TIMETOKEN = 0\n , RESUMED = false\n , CHANNELS = {}\n , CHANNEL_GROUPS = {}\n , SUB_ERROR = function(){}\n , STATE = {}\n , PRESENCE_HB_TIMEOUT = null\n , PRESENCE_HB = validate_presence_heartbeat(\n setup['heartbeat'] || setup['pnexpires'] || 0, setup['error']\n )\n , PRESENCE_HB_INTERVAL = setup['heartbeat_interval'] || (PRESENCE_HB / 2) -1\n , PRESENCE_HB_RUNNING = false\n , NO_WAIT_FOR_PENDING = setup['no_wait_for_pending']\n , COMPATIBLE_35 = setup['compatible_3.5'] || false\n , xdr = setup['xdr']\n , params = setup['params'] || {}\n , error = setup['error'] || function() {}\n , _is_online = setup['_is_online'] || function() { return 1 }\n , jsonp_cb = setup['jsonp_cb'] || function() { return 0 }\n , db = setup['db'] || {'get': function(){}, 'set': function(){}}\n , CIPHER_KEY = setup['cipher_key']\n , UUID = setup['uuid'] || ( !setup['unique_uuid'] && db && db['get'](SUBSCRIBE_KEY+'uuid') || '')\n , USE_INSTANCEID = setup['instance_id'] || false\n , INSTANCEID = ''\n , shutdown = setup['shutdown']\n , use_send_beacon = (typeof setup['use_send_beacon'] != 'undefined')?setup['use_send_beacon']:true\n , sendBeacon = (use_send_beacon)?setup['sendBeacon']:null\n , _poll_timer\n , _poll_timer2;\n\n if (PRESENCE_HB === 2) PRESENCE_HB_INTERVAL = 1;\n\n var crypto_obj = setup['crypto_obj'] ||\n {\n 'encrypt' : function(a,key){ return a},\n 'decrypt' : function(b,key){return b}\n };\n\n function _get_url_params(data) {\n if (!data) data = {};\n each( params , function( key, value ) {\n if (!(key in data)) data[key] = value;\n });\n return data;\n }\n\n function _object_to_key_list(o) {\n var l = []\n each( o , function( key, value ) {\n l.push(key);\n });\n return l;\n }\n function _object_to_key_list_sorted(o) {\n return _object_to_key_list(o).sort();\n }\n\n function _get_pam_sign_input_from_params(params) {\n var si = \"\";\n var l = _object_to_key_list_sorted(params);\n\n for (var i in l) {\n var k = l[i]\n si += k + \"=\" + pam_encode(params[k]) ;\n if (i != l.length - 1) si += \"&\"\n }\n return si;\n }\n\n function validate_presence_heartbeat(heartbeat, cur_heartbeat, error) {\n var err = false;\n\n if (typeof heartbeat === 'undefined') {\n return cur_heartbeat;\n }\n\n if (typeof heartbeat === 'number') {\n if (heartbeat > PRESENCE_HB_THRESHOLD || heartbeat == 0)\n err = false;\n else\n err = true;\n } else if(typeof heartbeat === 'boolean'){\n if (!heartbeat) {\n return 0;\n } else {\n return PRESENCE_HB_DEFAULT;\n }\n } else {\n err = true;\n }\n\n if (err) {\n error && error(\"Presence Heartbeat value invalid. Valid range ( x > \" + PRESENCE_HB_THRESHOLD + \" or x = 0). Current Value : \" + (cur_heartbeat || PRESENCE_HB_THRESHOLD));\n return cur_heartbeat || PRESENCE_HB_THRESHOLD;\n } else return heartbeat;\n }\n\n function encrypt(input, key) {\n return crypto_obj['encrypt'](input, key || CIPHER_KEY) || input;\n }\n function decrypt(input, key) {\n return crypto_obj['decrypt'](input, key || CIPHER_KEY) ||\n crypto_obj['decrypt'](input, CIPHER_KEY) ||\n input;\n }\n\n function error_common(message, callback) {\n callback && callback({ 'error' : message || \"error occurred\"});\n error && error(message);\n }\n function _presence_heartbeat() {\n\n clearTimeout(PRESENCE_HB_TIMEOUT);\n\n if (!PRESENCE_HB_INTERVAL || PRESENCE_HB_INTERVAL >= 500 ||\n PRESENCE_HB_INTERVAL < 1 ||\n (!generate_channel_list(CHANNELS,true).length && !generate_channel_group_list(CHANNEL_GROUPS, true).length ) )\n {\n PRESENCE_HB_RUNNING = false;\n return;\n }\n\n PRESENCE_HB_RUNNING = true;\n SELF['presence_heartbeat']({\n 'callback' : function(r) {\n PRESENCE_HB_TIMEOUT = timeout( _presence_heartbeat, (PRESENCE_HB_INTERVAL) * SECOND );\n },\n 'error' : function(e) {\n error && error(\"Presence Heartbeat unable to reach Pubnub servers.\" + JSON.stringify(e));\n PRESENCE_HB_TIMEOUT = timeout( _presence_heartbeat, (PRESENCE_HB_INTERVAL) * SECOND );\n }\n });\n }\n\n function start_presence_heartbeat() {\n !PRESENCE_HB_RUNNING && _presence_heartbeat();\n }\n\n function publish(next) {\n\n if (NO_WAIT_FOR_PENDING) {\n if (!PUB_QUEUE.length) return;\n } else {\n if (next) PUB_QUEUE.sending = 0;\n if ( PUB_QUEUE.sending || !PUB_QUEUE.length ) return;\n PUB_QUEUE.sending = 1;\n }\n\n xdr(PUB_QUEUE.shift());\n }\n function each_channel_group(callback) {\n var count = 0;\n\n each( generate_channel_group_list(CHANNEL_GROUPS), function(channel_group) {\n var chang = CHANNEL_GROUPS[channel_group];\n\n if (!chang) return;\n\n count++;\n (callback||function(){})(chang);\n } );\n\n return count;\n }\n\n function each_channel(callback) {\n var count = 0;\n\n each( generate_channel_list(CHANNELS), function(channel) {\n var chan = CHANNELS[channel];\n\n if (!chan) return;\n\n count++;\n (callback||function(){})(chan);\n } );\n\n return count;\n }\n function _invoke_callback(response, callback, err) {\n if (typeof response == 'object') {\n if (response['error']) {\n var callback_data = {};\n\n if (response['message']) {\n callback_data['message'] = response['message'];\n }\n\n if (response['payload']) {\n callback_data['payload'] = response['payload'];\n }\n\n err && err(callback_data);\n return;\n\n }\n if (response['payload']) {\n if (response['next_page'])\n callback && callback(response['payload'], response['next_page']);\n else\n callback && callback(response['payload']);\n return;\n }\n }\n callback && callback(response);\n }\n\n function _invoke_error(response,err) {\n\n if (typeof response == 'object' && response['error']) {\n var callback_data = {};\n\n if (response['message']) {\n callback_data['message'] = response['message'];\n }\n\n if (response['payload']) {\n callback_data['payload'] = response['payload'];\n }\n \n err && err(callback_data);\n return;\n } else {\n err && err(response);\n }\n }\n function CR(args, callback, url1, data) {\n var callback = args['callback'] || callback\n , err = args['error'] || error\n , jsonp = jsonp_cb();\n\n data = data || {};\n \n if (!data['auth']) {\n data['auth'] = args['auth_key'] || AUTH_KEY;\n }\n \n var url = [\n STD_ORIGIN, 'v1', 'channel-registration',\n 'sub-key', SUBSCRIBE_KEY\n ];\n\n url.push.apply(url,url1);\n \n if (jsonp) data['callback'] = jsonp;\n \n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : url\n });\n\n }\n\n // Announce Leave Event\n var SELF = {\n 'LEAVE' : function( channel, blocking, auth_key, callback, error ) {\n\n var data = { 'uuid' : UUID, 'auth' : auth_key || AUTH_KEY }\n , origin = nextorigin(ORIGIN)\n , callback = callback || function(){}\n , err = error || function(){}\n , url\n , jsonp = jsonp_cb();\n\n\n\n // Prevent Leaving a Presence Channel\n if (channel.indexOf(PRESENCE_SUFFIX) > 0) return true;\n\n\n\n\n if (COMPATIBLE_35) {\n if (!SSL) return false;\n if (jsonp == '0') return false;\n }\n\n if (NOLEAVE) return false;\n\n if (jsonp != '0') data['callback'] = jsonp;\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n url = [\n origin, 'v2', 'presence', 'sub_key',\n SUBSCRIBE_KEY, 'channel', encode(channel), 'leave'\n ];\n\n params = _get_url_params(data);\n\n\n if (sendBeacon) {\n url_string = build_url(url, params);\n if (sendBeacon(url_string)) {\n callback && callback({\"status\": 200, \"action\": \"leave\", \"message\": \"OK\", \"service\": \"Presence\"});\n return true;\n }\n }\n\n\n xdr({\n blocking : blocking || SSL,\n timeout : 2000,\n callback : jsonp,\n data : params,\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : url\n });\n return true;\n },\n 'LEAVE_GROUP' : function( channel_group, blocking, auth_key, callback, error ) {\n\n var data = { 'uuid' : UUID, 'auth' : auth_key || AUTH_KEY }\n , origin = nextorigin(ORIGIN)\n , callback = callback || function(){}\n , err = error || function(){}\n , jsonp = jsonp_cb();\n\n // Prevent Leaving a Presence Channel Group\n if (channel_group.indexOf(PRESENCE_SUFFIX) > 0) return true;\n\n if (COMPATIBLE_35) {\n if (!SSL) return false;\n if (jsonp == '0') return false;\n }\n\n if (NOLEAVE) return false;\n\n if (jsonp != '0') data['callback'] = jsonp;\n\n if (channel_group && channel_group.length > 0) data['channel-group'] = channel_group;\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n blocking : blocking || SSL,\n timeout : 5000,\n callback : jsonp,\n data : _get_url_params(data),\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : [\n origin, 'v2', 'presence', 'sub_key',\n SUBSCRIBE_KEY, 'channel', encode(','), 'leave'\n ]\n });\n return true;\n },\n 'set_resumed' : function(resumed) {\n RESUMED = resumed;\n },\n 'get_cipher_key' : function() {\n return CIPHER_KEY;\n },\n 'set_cipher_key' : function(key) {\n CIPHER_KEY = key;\n },\n 'raw_encrypt' : function(input, key) {\n return encrypt(input, key);\n },\n 'raw_decrypt' : function(input, key) {\n return decrypt(input, key);\n },\n 'get_heartbeat' : function() {\n return PRESENCE_HB;\n },\n \n 'set_heartbeat' : function(heartbeat, heartbeat_interval) {\n PRESENCE_HB = validate_presence_heartbeat(heartbeat, PRESENCE_HB, error);\n PRESENCE_HB_INTERVAL = heartbeat_interval || (PRESENCE_HB / 2) - 1;\n if (PRESENCE_HB == 2) {\n PRESENCE_HB_INTERVAL = 1;\n }\n CONNECT();\n _presence_heartbeat();\n },\n \n 'get_heartbeat_interval' : function() {\n return PRESENCE_HB_INTERVAL;\n },\n \n 'set_heartbeat_interval' : function(heartbeat_interval) {\n PRESENCE_HB_INTERVAL = heartbeat_interval;\n _presence_heartbeat();\n },\n \n 'get_version' : function() {\n return SDK_VER;\n },\n 'getGcmMessageObject' : function(obj) {\n return {\n 'data' : obj\n }\n },\n 'getApnsMessageObject' : function(obj) {\n var x = {\n 'aps' : { 'badge' : 1, 'alert' : ''}\n }\n for (k in obj) {\n k[x] = obj[k];\n }\n return x;\n },\n 'newPnMessage' : function() {\n var x = {};\n if (gcm) x['pn_gcm'] = gcm;\n if (apns) x['pn_apns'] = apns;\n for ( k in n ) {\n x[k] = n[k];\n }\n return x;\n },\n\n '_add_param' : function(key,val) {\n params[key] = val;\n },\n\n 'channel_group' : function(args, callback) {\n var ns_ch = args['channel_group']\n , callback = callback || args['callback']\n , channels = args['channels'] || args['channel']\n , cloak = args['cloak']\n , namespace\n , channel_group\n , url = []\n , data = {}\n , mode = args['mode'] || 'add';\n\n\n if (ns_ch) {\n var ns_ch_a = ns_ch.split(':');\n\n if (ns_ch_a.length > 1) {\n namespace = (ns_ch_a[0] === '*')?null:ns_ch_a[0];\n\n channel_group = ns_ch_a[1];\n } else {\n channel_group = ns_ch_a[0];\n }\n }\n\n namespace && url.push('namespace') && url.push(encode(namespace));\n\n url.push('channel-group');\n\n if (channel_group && channel_group !== '*') {\n url.push(channel_group);\n }\n\n if (channels ) {\n if (isArray(channels)) {\n channels = channels.join(',');\n }\n data[mode] = channels;\n data['cloak'] = (CLOAK)?'true':'false';\n } else {\n if (mode === 'remove') url.push('remove');\n }\n\n if (typeof cloak != 'undefined') data['cloak'] = (cloak)?'true':'false';\n\n CR(args, callback, url, data);\n },\n\n 'channel_group_list_groups' : function(args, callback) {\n var namespace;\n\n namespace = args['namespace'] || args['ns'] || args['channel_group'] || null;\n if (namespace) {\n args[\"channel_group\"] = namespace + \":*\";\n }\n\n SELF['channel_group'](args, callback);\n },\n\n 'channel_group_list_channels' : function(args, callback) {\n if (!args['channel_group']) return error('Missing Channel Group');\n SELF['channel_group'](args, callback);\n },\n\n 'channel_group_remove_channel' : function(args, callback) {\n if (!args['channel_group']) return error('Missing Channel Group');\n if (!args['channel'] && !args['channels'] ) return error('Missing Channel');\n\n args['mode'] = 'remove';\n SELF['channel_group'](args,callback);\n },\n\n 'channel_group_remove_group' : function(args, callback) {\n if (!args['channel_group']) return error('Missing Channel Group');\n if (args['channel']) return error('Use channel_group_remove_channel if you want to remove a channel from a group.');\n\n args['mode'] = 'remove';\n SELF['channel_group'](args,callback);\n },\n\n 'channel_group_add_channel' : function(args, callback) {\n if (!args['channel_group']) return error('Missing Channel Group');\n if (!args['channel'] && !args['channels'] ) return error('Missing Channel');\n SELF['channel_group'](args,callback);\n },\n\n 'channel_group_cloak' : function(args, callback) {\n if (typeof args['cloak'] == 'undefined') {\n callback(CLOAK);\n return;\n }\n CLOAK = args['cloak'];\n SELF['channel_group'](args,callback);\n },\n\n 'channel_group_list_namespaces' : function(args, callback) {\n var url = ['namespace'];\n CR(args, callback, url);\n },\n 'channel_group_remove_namespace' : function(args, callback) {\n var url = ['namespace',args['namespace'],'remove'];\n CR(args, callback, url);\n },\n\n /*\n PUBNUB.history({\n channel : 'my_chat_channel',\n limit : 100,\n callback : function(history) { }\n });\n */\n 'history' : function( args, callback ) {\n var callback = args['callback'] || callback\n , count = args['count'] || args['limit'] || 100\n , reverse = args['reverse'] || \"false\"\n , err = args['error'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , cipher_key = args['cipher_key']\n , channel = args['channel']\n , channel_group = args['channel_group']\n , start = args['start']\n , end = args['end']\n , include_token = args['include_token']\n , string_msg_token = args['string_message_token'] || false\n , params = {}\n , jsonp = jsonp_cb();\n\n // Make sure we have a Channel\n if (!channel && !channel_group) return error('Missing Channel');\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n params['stringtoken'] = 'true';\n params['count'] = count;\n params['reverse'] = reverse;\n params['auth'] = auth_key;\n\n if (channel_group) {\n params['channel-group'] = channel_group;\n if (!channel) {\n channel = ','; \n }\n }\n if (jsonp) params['callback'] = jsonp;\n if (start) params['start'] = start;\n if (end) params['end'] = end;\n if (include_token) params['include_token'] = 'true';\n if (string_msg_token) params['string_message_token'] = 'true';\n\n // Send Message\n xdr({\n callback : jsonp,\n data : _get_url_params(params),\n success : function(response) {\n if (typeof response == 'object' && response['error']) {\n err({'message' : response['message'], 'payload' : response['payload']});\n return;\n }\n var messages = response[0];\n var decrypted_messages = [];\n for (var a = 0; a < messages.length; a++) {\n var new_message = decrypt(messages[a],cipher_key);\n try {\n decrypted_messages['push'](JSON['parse'](new_message));\n } catch (e) {\n decrypted_messages['push']((new_message));\n }\n }\n callback([decrypted_messages, response[1], response[2]]);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : [\n STD_ORIGIN, 'v2', 'history', 'sub-key',\n SUBSCRIBE_KEY, 'channel', encode(channel)\n ]\n });\n },\n\n /*\n PUBNUB.replay({\n source : 'my_channel',\n destination : 'new_channel'\n });\n */\n 'replay' : function(args, callback) {\n var callback = callback || args['callback'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , source = args['source']\n , destination = args['destination']\n , stop = args['stop']\n , start = args['start']\n , end = args['end']\n , reverse = args['reverse']\n , limit = args['limit']\n , jsonp = jsonp_cb()\n , data = {}\n , url;\n\n // Check User Input\n if (!source) return error('Missing Source Channel');\n if (!destination) return error('Missing Destination Channel');\n if (!PUBLISH_KEY) return error('Missing Publish Key');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n // Setup URL Params\n if (jsonp != '0') data['callback'] = jsonp;\n if (stop) data['stop'] = 'all';\n if (reverse) data['reverse'] = 'true';\n if (start) data['start'] = start;\n if (end) data['end'] = end;\n if (limit) data['count'] = limit;\n\n data['auth'] = auth_key;\n\n // Compose URL Parts\n url = [\n STD_ORIGIN, 'v1', 'replay',\n PUBLISH_KEY, SUBSCRIBE_KEY,\n source, destination\n ];\n\n // Start (or Stop) Replay!\n xdr({\n callback : jsonp,\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function() { callback([ 0, 'Disconnected' ]) },\n url : url,\n data : _get_url_params(data)\n });\n },\n\n /*\n PUBNUB.auth('AJFLKAJSDKLA');\n */\n 'auth' : function(auth) {\n AUTH_KEY = auth;\n CONNECT();\n },\n\n /*\n PUBNUB.time(function(time){ });\n */\n 'time' : function(callback) {\n var jsonp = jsonp_cb();\n\n var data = { 'uuid' : UUID, 'auth' : AUTH_KEY }\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n timeout : SECOND * 5,\n url : [STD_ORIGIN, 'time', jsonp],\n success : function(response) { callback(response[0]) },\n fail : function() { callback(0) }\n });\n },\n\n /*\n PUBNUB.publish({\n channel : 'my_chat_channel',\n message : 'hello!'\n });\n */\n 'publish' : function( args, callback ) {\n var msg = args['message'];\n if (!msg) return error('Missing Message');\n\n var callback = callback || args['callback'] || msg['callback'] || function(){}\n , channel = args['channel'] || msg['channel']\n , auth_key = args['auth_key'] || AUTH_KEY\n , cipher_key = args['cipher_key']\n , err = args['error'] || msg['error'] || function() {}\n , post = args['post'] || false\n , store = ('store_in_history' in args) ? args['store_in_history']: true\n , jsonp = jsonp_cb()\n , add_msg = 'push'\n , params\n , url;\n\n if (args['prepend']) add_msg = 'unshift'\n\n if (!channel) return error('Missing Channel');\n if (!PUBLISH_KEY) return error('Missing Publish Key');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n if (msg['getPubnubMessage']) {\n msg = msg['getPubnubMessage']();\n }\n\n // If trying to send Object\n msg = JSON['stringify'](encrypt(msg, cipher_key));\n\n // Create URL\n url = [\n STD_ORIGIN, 'publish',\n PUBLISH_KEY, SUBSCRIBE_KEY,\n 0, encode(channel),\n jsonp, encode(msg)\n ];\n\n params = { 'uuid' : UUID, 'auth' : auth_key }\n\n if (!store) params['store'] =\"0\"\n\n if (USE_INSTANCEID) params['instanceid'] = INSTANCEID;\n\n // Queue Message Send\n PUB_QUEUE[add_msg]({\n callback : jsonp,\n timeout : SECOND * 5,\n url : url,\n data : _get_url_params(params),\n fail : function(response){\n _invoke_error(response, err);\n publish(1);\n },\n success : function(response) {\n _invoke_callback(response, callback, err);\n publish(1);\n },\n mode : (post)?'POST':'GET'\n });\n\n // Send Message\n publish();\n },\n\n /*\n PUBNUB.unsubscribe({ channel : 'my_chat' });\n */\n 'unsubscribe' : function(args, callback) {\n var channel = args['channel']\n , channel_group = args['channel_group']\n , auth_key = args['auth_key'] || AUTH_KEY\n , callback = callback || args['callback'] || function(){}\n , err = args['error'] || function(){};\n\n TIMETOKEN = 0;\n //SUB_RESTORE = 1; REVISIT !!!!\n\n if (channel) {\n // Prepare Channel(s)\n channel = map( (\n channel.join ? channel.join(',') : ''+channel\n ).split(','), function(channel) {\n if (!CHANNELS[channel]) return;\n return channel + ',' + channel + PRESENCE_SUFFIX;\n } ).join(',');\n\n // Iterate over Channels\n each( channel.split(','), function(ch) {\n var CB_CALLED = true;\n if (!ch) return;\n CHANNELS[ch] = 0;\n if (ch in STATE) delete STATE[ch];\n if (READY) {\n CB_CALLED = SELF['LEAVE']( ch, 0 , auth_key, callback, err);\n }\n if (!CB_CALLED) callback({action : \"leave\"});\n\n \n } );\n }\n\n if (channel_group) {\n // Prepare channel group(s)\n channel_group = map( (\n channel_group.join ? channel_group.join(',') : ''+channel_group\n ).split(','), function(channel_group) {\n if (!CHANNEL_GROUPS[channel_group]) return;\n return channel_group + ',' + channel_group + PRESENCE_SUFFIX;\n } ).join(',');\n\n // Iterate over channel groups\n each( channel_group.split(','), function(chg) {\n var CB_CALLED = true;\n if (!chg) return;\n CHANNEL_GROUPS[chg] = 0;\n if (chg in STATE) delete STATE[chg];\n if (READY) {\n CB_CALLED = SELF['LEAVE_GROUP']( chg, 0 , auth_key, callback, err);\n }\n if (!CB_CALLED) callback({action : \"leave\"});\n\n } );\n }\n\n // Reset Connection if Count Less\n CONNECT();\n },\n\n /*\n PUBNUB.subscribe({\n channel : 'my_chat'\n callback : function(message) { }\n });\n */\n 'subscribe' : function( args, callback ) {\n var channel = args['channel']\n , channel_group = args['channel_group']\n , callback = callback || args['callback']\n , callback = callback || args['message']\n , connect = args['connect'] || function(){}\n , reconnect = args['reconnect'] || function(){}\n , disconnect = args['disconnect'] || function(){}\n , SUB_ERROR = args['error'] || SUB_ERROR || function(){}\n , idlecb = args['idle'] || function(){}\n , presence = args['presence'] || 0\n , noheresync = args['noheresync'] || 0\n , backfill = args['backfill'] || 0\n , timetoken = args['timetoken'] || 0\n , sub_timeout = args['timeout'] || SUB_TIMEOUT\n , windowing = args['windowing'] || SUB_WINDOWING\n , state = args['state']\n , heartbeat = args['heartbeat'] || args['pnexpires']\n , heartbeat_interval = args['heartbeat_interval']\n , restore = args['restore'] || SUB_RESTORE;\n\n AUTH_KEY = args['auth_key'] || AUTH_KEY;\n\n // Restore Enabled?\n SUB_RESTORE = restore;\n\n // Always Reset the TT\n TIMETOKEN = timetoken;\n\n // Make sure we have a Channel\n if (!channel && !channel_group) {\n return error('Missing Channel');\n }\n\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n if (heartbeat || heartbeat === 0 || heartbeat_interval || heartbeat_interval === 0) {\n SELF['set_heartbeat'](heartbeat, heartbeat_interval);\n }\n\n // Setup Channel(s)\n if (channel) {\n each( (channel.join ? channel.join(',') : ''+channel).split(','),\n function(channel) {\n var settings = CHANNELS[channel] || {};\n\n // Store Channel State\n CHANNELS[SUB_CHANNEL = channel] = {\n name : channel,\n connected : settings.connected,\n disconnected : settings.disconnected,\n subscribed : 1,\n callback : SUB_CALLBACK = callback,\n 'cipher_key' : args['cipher_key'],\n connect : connect,\n disconnect : disconnect,\n reconnect : reconnect\n };\n\n if (state) {\n if (channel in state) {\n STATE[channel] = state[channel];\n } else {\n STATE[channel] = state;\n }\n }\n\n // Presence Enabled?\n if (!presence) return;\n\n // Subscribe Presence Channel\n SELF['subscribe']({\n 'channel' : channel + PRESENCE_SUFFIX,\n 'callback' : presence,\n 'restore' : restore\n });\n\n // Presence Subscribed?\n if (settings.subscribed) return;\n\n // See Who's Here Now?\n if (noheresync) return;\n SELF['here_now']({\n 'channel' : channel,\n 'data' : _get_url_params({ 'uuid' : UUID, 'auth' : AUTH_KEY }),\n 'callback' : function(here) {\n each( 'uuids' in here ? here['uuids'] : [],\n function(uid) { presence( {\n 'action' : 'join',\n 'uuid' : uid,\n 'timestamp' : Math.floor(rnow() / 1000),\n 'occupancy' : here['occupancy'] || 1\n }, here, channel ); } );\n }\n });\n } );\n }\n\n // Setup Channel Groups\n if (channel_group) {\n each( (channel_group.join ? channel_group.join(',') : ''+channel_group).split(','),\n function(channel_group) {\n var settings = CHANNEL_GROUPS[channel_group] || {};\n\n CHANNEL_GROUPS[channel_group] = {\n name : channel_group,\n connected : settings.connected,\n disconnected : settings.disconnected,\n subscribed : 1,\n callback : SUB_CALLBACK = callback,\n 'cipher_key' : args['cipher_key'],\n connect : connect,\n disconnect : disconnect,\n reconnect : reconnect\n };\n\n // Presence Enabled?\n if (!presence) return;\n\n // Subscribe Presence Channel\n SELF['subscribe']({\n 'channel_group' : channel_group + PRESENCE_SUFFIX,\n 'callback' : presence,\n 'restore' : restore,\n 'auth_key' : AUTH_KEY\n });\n\n // Presence Subscribed?\n if (settings.subscribed) return;\n\n // See Who's Here Now?\n if (noheresync) return;\n SELF['here_now']({\n 'channel_group' : channel_group,\n 'data' : _get_url_params({ 'uuid' : UUID, 'auth' : AUTH_KEY }),\n 'callback' : function(here) {\n each( 'uuids' in here ? here['uuids'] : [],\n function(uid) { presence( {\n 'action' : 'join',\n 'uuid' : uid,\n 'timestamp' : Math.floor(rnow() / 1000),\n 'occupancy' : here['occupancy'] || 1\n }, here, channel_group ); } );\n }\n });\n } );\n }\n\n\n // Test Network Connection\n function _test_connection(success) {\n if (success) {\n // Begin Next Socket Connection\n timeout( CONNECT, windowing);\n }\n else {\n // New Origin on Failed Connection\n STD_ORIGIN = nextorigin( ORIGIN, 1 );\n SUB_ORIGIN = nextorigin( ORIGIN, 1 );\n\n // Re-test Connection\n timeout( function() {\n SELF['time'](_test_connection);\n }, SECOND );\n }\n\n // Disconnect & Reconnect\n each_channel(function(channel){\n // Reconnect\n if (success && channel.disconnected) {\n channel.disconnected = 0;\n return channel.reconnect(channel.name);\n }\n\n // Disconnect\n if (!success && !channel.disconnected) {\n channel.disconnected = 1;\n channel.disconnect(channel.name);\n }\n });\n \n // Disconnect & Reconnect for channel groups\n each_channel_group(function(channel_group){\n // Reconnect\n if (success && channel_group.disconnected) {\n channel_group.disconnected = 0;\n return channel_group.reconnect(channel_group.name);\n }\n\n // Disconnect\n if (!success && !channel_group.disconnected) {\n channel_group.disconnected = 1;\n channel_group.disconnect(channel_group.name);\n }\n });\n }\n\n // Evented Subscribe\n function _connect() {\n var jsonp = jsonp_cb()\n , channels = generate_channel_list(CHANNELS).join(',')\n , channel_groups = generate_channel_group_list(CHANNEL_GROUPS).join(',');\n\n // Stop Connection\n if (!channels && !channel_groups) return;\n\n if (!channels) channels = ',';\n\n // Connect to PubNub Subscribe Servers\n _reset_offline();\n\n var data = _get_url_params({ 'uuid' : UUID, 'auth' : AUTH_KEY });\n\n if (channel_groups) {\n data['channel-group'] = channel_groups;\n }\n\n\n var st = JSON.stringify(STATE);\n if (st.length > 2) data['state'] = JSON.stringify(STATE);\n\n if (PRESENCE_HB) data['heartbeat'] = PRESENCE_HB;\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n start_presence_heartbeat();\n SUB_RECEIVER = xdr({\n timeout : sub_timeout,\n callback : jsonp,\n fail : function(response) {\n if (response && response['error'] && response['service']) {\n _invoke_error(response, SUB_ERROR);\n _test_connection(1);\n } else {\n SELF['time'](function(success){\n !success && ( _invoke_error(response, SUB_ERROR));\n _test_connection(success);\n });\n }\n },\n data : _get_url_params(data),\n url : [\n SUB_ORIGIN, 'subscribe',\n SUBSCRIBE_KEY, encode(channels),\n jsonp, TIMETOKEN\n ],\n success : function(messages) {\n\n // Check for Errors\n if (!messages || (\n typeof messages == 'object' &&\n 'error' in messages &&\n messages['error']\n )) {\n SUB_ERROR(messages['error']);\n return timeout( CONNECT, SECOND );\n }\n\n // User Idle Callback\n idlecb(messages[1]);\n\n // Restore Previous Connection Point if Needed\n TIMETOKEN = !TIMETOKEN &&\n SUB_RESTORE &&\n db['get'](SUBSCRIBE_KEY) || messages[1];\n\n /*\n // Connect\n each_channel_registry(function(registry){\n if (registry.connected) return;\n registry.connected = 1;\n registry.connect(channel.name);\n });\n */\n\n // Connect\n each_channel(function(channel){\n if (channel.connected) return;\n channel.connected = 1;\n channel.connect(channel.name);\n });\n\n // Connect for channel groups\n each_channel_group(function(channel_group){\n if (channel_group.connected) return;\n channel_group.connected = 1;\n channel_group.connect(channel_group.name);\n });\n\n if (RESUMED && !SUB_RESTORE) {\n TIMETOKEN = 0;\n RESUMED = false;\n // Update Saved Timetoken\n db['set']( SUBSCRIBE_KEY, 0 );\n timeout( _connect, windowing );\n return;\n }\n\n // Invoke Memory Catchup and Receive Up to 100\n // Previous Messages from the Queue.\n if (backfill) {\n TIMETOKEN = 10000;\n backfill = 0;\n }\n\n // Update Saved Timetoken\n db['set']( SUBSCRIBE_KEY, messages[1] );\n\n // Route Channel <---> Callback for Message\n var next_callback = (function() {\n var channels = '';\n var channels2 = '';\n\n if (messages.length > 3) {\n channels = messages[3];\n channels2 = messages[2];\n } else if (messages.length > 2) {\n channels = messages[2];\n } else {\n channels = map(\n generate_channel_list(CHANNELS), function(chan) { return map(\n Array(messages[0].length)\n .join(',').split(','),\n function() { return chan; }\n ) }).join(',')\n }\n\n var list = channels.split(',');\n var list2 = (channels2)?channels2.split(','):[];\n\n return function() {\n var channel = list.shift()||SUB_CHANNEL;\n var channel2 = list2.shift();\n\n var chobj = {};\n\n if (channel2) {\n if (channel && channel.indexOf('-pnpres') >= 0 \n && channel2.indexOf('-pnpres') < 0) {\n channel2 += '-pnpres';\n }\n chobj = CHANNEL_GROUPS[channel2] || CHANNELS[channel2] || {'callback' : function(){}};\n } else {\n chobj = CHANNELS[channel];\n }\n\n var r = [\n chobj\n .callback||SUB_CALLBACK,\n channel.split(PRESENCE_SUFFIX)[0]\n ];\n channel2 && r.push(channel2.split(PRESENCE_SUFFIX)[0]);\n return r;\n };\n })();\n\n var latency = detect_latency(+messages[1]);\n each( messages[0], function(msg) {\n var next = next_callback();\n var decrypted_msg = decrypt(msg,\n (CHANNELS[next[1]])?CHANNELS[next[1]]['cipher_key']:null);\n next[0] && next[0]( decrypted_msg, messages, next[2] || next[1], latency, next[1]);\n });\n\n timeout( _connect, windowing );\n }\n });\n }\n\n CONNECT = function() {\n _reset_offline();\n timeout( _connect, windowing );\n };\n\n // Reduce Status Flicker\n if (!READY) return READY_BUFFER.push(CONNECT);\n\n // Connect Now\n CONNECT();\n },\n\n /*\n PUBNUB.here_now({ channel : 'my_chat', callback : fun });\n */\n 'here_now' : function( args, callback ) {\n var callback = args['callback'] || callback\n , err = args['error'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , channel = args['channel']\n , channel_group = args['channel_group']\n , jsonp = jsonp_cb()\n , uuids = ('uuids' in args) ? args['uuids'] : true\n , state = args['state']\n , data = { 'uuid' : UUID, 'auth' : auth_key };\n\n if (!uuids) data['disable_uuids'] = 1;\n if (state) data['state'] = 1;\n\n // Make sure we have a Channel\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n var url = [\n STD_ORIGIN, 'v2', 'presence',\n 'sub_key', SUBSCRIBE_KEY\n ];\n\n channel && url.push('channel') && url.push(encode(channel));\n\n if (jsonp != '0') { data['callback'] = jsonp; }\n\n if (channel_group) {\n data['channel-group'] = channel_group;\n !channel && url.push('channel') && url.push(','); \n }\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : url\n });\n },\n\n /*\n PUBNUB.current_channels_by_uuid({ channel : 'my_chat', callback : fun });\n */\n 'where_now' : function( args, callback ) {\n var callback = args['callback'] || callback\n , err = args['error'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , jsonp = jsonp_cb()\n , uuid = args['uuid'] || UUID\n , data = { 'auth' : auth_key };\n\n // Make sure we have a Channel\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n if (jsonp != '0') { data['callback'] = jsonp; }\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : [\n STD_ORIGIN, 'v2', 'presence',\n 'sub_key', SUBSCRIBE_KEY,\n 'uuid', encode(uuid)\n ]\n });\n },\n\n 'state' : function(args, callback) {\n var callback = args['callback'] || callback || function(r) {}\n , err = args['error'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , jsonp = jsonp_cb()\n , state = args['state']\n , uuid = args['uuid'] || UUID\n , channel = args['channel']\n , channel_group = args['channel_group']\n , url\n , data = _get_url_params({ 'auth' : auth_key });\n\n // Make sure we have a Channel\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n if (!uuid) return error('Missing UUID');\n if (!channel && !channel_group) return error('Missing Channel');\n\n if (jsonp != '0') { data['callback'] = jsonp; }\n\n if (typeof channel != 'undefined'\n && CHANNELS[channel] && CHANNELS[channel].subscribed ) {\n if (state) STATE[channel] = state;\n }\n\n if (typeof channel_group != 'undefined'\n && CHANNEL_GROUPS[channel_group]\n && CHANNEL_GROUPS[channel_group].subscribed\n ) {\n if (state) STATE[channel_group] = state;\n data['channel-group'] = channel_group;\n\n if (!channel) {\n channel = ',';\n }\n }\n\n data['state'] = JSON.stringify(state);\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n if (state) {\n url = [\n STD_ORIGIN, 'v2', 'presence',\n 'sub-key', SUBSCRIBE_KEY,\n 'channel', channel,\n 'uuid', uuid, 'data'\n ]\n } else {\n url = [\n STD_ORIGIN, 'v2', 'presence',\n 'sub-key', SUBSCRIBE_KEY,\n 'channel', channel,\n 'uuid', encode(uuid)\n ]\n }\n\n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : url\n\n });\n\n },\n\n /*\n PUBNUB.grant({\n channel : 'my_chat',\n callback : fun,\n error : fun,\n ttl : 24 * 60, // Minutes\n read : true,\n write : true,\n auth_key : '3y8uiajdklytowsj'\n });\n */\n 'grant' : function( args, callback ) {\n var callback = args['callback'] || callback\n , err = args['error'] || function(){}\n , channel = args['channel'] || args['channels']\n , channel_group = args['channel_group']\n , jsonp = jsonp_cb()\n , ttl = args['ttl']\n , r = (args['read'] )?\"1\":\"0\"\n , w = (args['write'])?\"1\":\"0\"\n , m = (args['manage'])?\"1\":\"0\"\n , auth_key = args['auth_key'] || args['auth_keys'];\n\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n if (!PUBLISH_KEY) return error('Missing Publish Key');\n if (!SECRET_KEY) return error('Missing Secret Key');\n\n var timestamp = Math.floor(new Date().getTime() / 1000)\n , sign_input = SUBSCRIBE_KEY + \"\\n\" + PUBLISH_KEY + \"\\n\"\n + \"grant\" + \"\\n\";\n\n var data = {\n 'w' : w,\n 'r' : r,\n 'timestamp' : timestamp\n };\n if (args['manage']) {\n data['m'] = m;\n }\n if (isArray(channel)) {\n channel = channel['join'](',');\n }\n if (isArray(auth_key)) {\n auth_key = auth_key['join'](',');\n }\n if (typeof channel != 'undefined' && channel != null && channel.length > 0) data['channel'] = channel;\n if (typeof channel_group != 'undefined' && channel_group != null && channel_group.length > 0) {\n data['channel-group'] = channel_group;\n }\n if (jsonp != '0') { data['callback'] = jsonp; }\n if (ttl || ttl === 0) data['ttl'] = ttl;\n\n if (auth_key) data['auth'] = auth_key;\n\n data = _get_url_params(data)\n\n if (!auth_key) delete data['auth'];\n\n sign_input += _get_pam_sign_input_from_params(data);\n\n var signature = hmac_SHA256( sign_input, SECRET_KEY );\n\n signature = signature.replace( /\\+/g, \"-\" );\n signature = signature.replace( /\\//g, \"_\" );\n\n data['signature'] = signature;\n\n xdr({\n callback : jsonp,\n data : data,\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : [\n STD_ORIGIN, 'v1', 'auth', 'grant' ,\n 'sub-key', SUBSCRIBE_KEY\n ]\n });\n },\n\n /*\n PUBNUB.mobile_gw_provision ({\n device_id: 'A655FBA9931AB',\n op : 'add' | 'remove',\n gw_type : 'apns' | 'gcm',\n channel : 'my_chat',\n callback : fun,\n error : fun,\n });\n */\n\n 'mobile_gw_provision' : function( args ) {\n\n var callback = args['callback'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , err = args['error'] || function() {}\n , jsonp = jsonp_cb()\n , channel = args['channel']\n , op = args['op']\n , gw_type = args['gw_type']\n , device_id = args['device_id']\n , params\n , url;\n\n if (!device_id) return error('Missing Device ID (device_id)');\n if (!gw_type) return error('Missing GW Type (gw_type: gcm or apns)');\n if (!op) return error('Missing GW Operation (op: add or remove)');\n if (!channel) return error('Missing gw destination Channel (channel)');\n if (!PUBLISH_KEY) return error('Missing Publish Key');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n // Create URL\n url = [\n STD_ORIGIN, 'v1/push/sub-key',\n SUBSCRIBE_KEY, 'devices', device_id\n ];\n\n params = { 'uuid' : UUID, 'auth' : auth_key, 'type': gw_type};\n\n if (op == \"add\") {\n params['add'] = channel;\n } else if (op == \"remove\") {\n params['remove'] = channel;\n }\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n callback : jsonp,\n data : params,\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : url\n });\n\n },\n\n /*\n PUBNUB.audit({\n channel : 'my_chat',\n callback : fun,\n error : fun,\n read : true,\n write : true,\n auth_key : '3y8uiajdklytowsj'\n });\n */\n 'audit' : function( args, callback ) {\n var callback = args['callback'] || callback\n , err = args['error'] || function(){}\n , channel = args['channel']\n , channel_group = args['channel_group']\n , auth_key = args['auth_key']\n , jsonp = jsonp_cb();\n\n // Make sure we have a Channel\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n if (!PUBLISH_KEY) return error('Missing Publish Key');\n if (!SECRET_KEY) return error('Missing Secret Key');\n\n var timestamp = Math.floor(new Date().getTime() / 1000)\n , sign_input = SUBSCRIBE_KEY + \"\\n\"\n + PUBLISH_KEY + \"\\n\"\n + \"audit\" + \"\\n\";\n\n var data = {'timestamp' : timestamp };\n if (jsonp != '0') { data['callback'] = jsonp; }\n if (typeof channel != 'undefined' && channel != null && channel.length > 0) data['channel'] = channel;\n if (typeof channel_group != 'undefined' && channel_group != null && channel_group.length > 0) {\n data['channel-group'] = channel_group;\n }\n if (auth_key) data['auth'] = auth_key;\n\n data = _get_url_params(data);\n\n if (!auth_key) delete data['auth'];\n\n sign_input += _get_pam_sign_input_from_params(data);\n\n var signature = hmac_SHA256( sign_input, SECRET_KEY );\n\n signature = signature.replace( /\\+/g, \"-\" );\n signature = signature.replace( /\\//g, \"_\" );\n\n data['signature'] = signature;\n xdr({\n callback : jsonp,\n data : data,\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : [\n STD_ORIGIN, 'v1', 'auth', 'audit' ,\n 'sub-key', SUBSCRIBE_KEY\n ]\n });\n },\n\n /*\n PUBNUB.revoke({\n channel : 'my_chat',\n callback : fun,\n error : fun,\n auth_key : '3y8uiajdklytowsj'\n });\n */\n 'revoke' : function( args, callback ) {\n args['read'] = false;\n args['write'] = false;\n SELF['grant']( args, callback );\n },\n 'set_uuid' : function(uuid) {\n UUID = uuid;\n CONNECT();\n },\n 'get_uuid' : function() {\n return UUID;\n },\n 'isArray' : function(arg) {\n return isArray(arg);\n },\n 'get_subscibed_channels' : function() {\n return generate_channel_list(CHANNELS, true);\n },\n 'presence_heartbeat' : function(args) {\n var callback = args['callback'] || function() {}\n var err = args['error'] || function() {}\n var jsonp = jsonp_cb();\n var data = { 'uuid' : UUID, 'auth' : AUTH_KEY };\n\n var st = JSON['stringify'](STATE);\n if (st.length > 2) data['state'] = JSON['stringify'](STATE);\n\n if (PRESENCE_HB > 0 && PRESENCE_HB < 320) data['heartbeat'] = PRESENCE_HB;\n\n if (jsonp != '0') { data['callback'] = jsonp; }\n\n var channels = encode(generate_channel_list(CHANNELS, true)['join'](','));\n var channel_groups = generate_channel_group_list(CHANNEL_GROUPS, true)['join'](',');\n\n if (!channels) channels = ',';\n if (channel_groups) data['channel-group'] = channel_groups;\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n timeout : SECOND * 5,\n url : [\n STD_ORIGIN, 'v2', 'presence',\n 'sub-key', SUBSCRIBE_KEY,\n 'channel' , channels,\n 'heartbeat'\n ],\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) { _invoke_error(response, err); }\n });\n },\n 'stop_timers': function () {\n clearTimeout(_poll_timer);\n clearTimeout(_poll_timer2);\n clearTimeout(PRESENCE_HB_TIMEOUT);\n },\n 'shutdown': function () {\n SELF['stop_timers']();\n shutdown && shutdown();\n },\n\n // Expose PUBNUB Functions\n 'xdr' : xdr,\n 'ready' : ready,\n 'db' : db,\n 'uuid' : generate_uuid,\n 'map' : map,\n 'each' : each,\n 'each-channel' : each_channel,\n 'grep' : grep,\n 'offline' : function(){ _reset_offline(\n 1, { \"message\" : \"Offline. Please check your network settings.\" })\n },\n 'supplant' : supplant,\n 'now' : rnow,\n 'unique' : unique,\n 'updater' : updater\n };\n\n function _poll_online() {\n _is_online() || _reset_offline( 1, {\n \"error\" : \"Offline. Please check your network settings. \"\n });\n _poll_timer && clearTimeout(_poll_timer);\n _poll_timer = timeout( _poll_online, SECOND );\n }\n\n function _poll_online2() {\n if (!TIME_CHECK) return;\n SELF['time'](function(success){\n detect_time_detla( function(){}, success );\n success || _reset_offline( 1, {\n \"error\" : \"Heartbeat failed to connect to Pubnub Servers.\" +\n \"Please check your network settings.\"\n });\n _poll_timer2 && clearTimeout(_poll_timer2);\n _poll_timer2 = timeout( _poll_online2, KEEPALIVE );\n });\n }\n\n function _reset_offline(err, msg) {\n SUB_RECEIVER && SUB_RECEIVER(err, msg);\n SUB_RECEIVER = null;\n\n clearTimeout(_poll_timer);\n clearTimeout(_poll_timer2);\n }\n \n if (!UUID) UUID = SELF['uuid']();\n if (!INSTANCEID) INSTANCEID = SELF['uuid']();\n db['set']( SUBSCRIBE_KEY + 'uuid', UUID );\n\n _poll_timer = timeout( _poll_online, SECOND );\n _poll_timer2 = timeout( _poll_online2, KEEPALIVE );\n PRESENCE_HB_TIMEOUT = timeout(\n start_presence_heartbeat,\n ( PRESENCE_HB_INTERVAL - 3 ) * SECOND\n );\n\n // Detect Age of Message\n function detect_latency(tt) {\n var adjusted_time = rnow() - TIME_DRIFT;\n return adjusted_time - tt / 10000;\n }\n\n detect_time_detla();\n function detect_time_detla( cb, time ) {\n var stime = rnow();\n\n time && calculate(time) || SELF['time'](calculate);\n\n function calculate(time) {\n if (!time) return;\n var ptime = time / 10000\n , latency = (rnow() - stime) / 2;\n TIME_DRIFT = rnow() - (ptime + latency);\n cb && cb(TIME_DRIFT);\n }\n }\n\n return SELF;\n}\nfunction crypto_obj() {\n\n function SHA256(s) {\n return CryptoJS['SHA256'](s)['toString'](CryptoJS['enc']['Hex']);\n }\n\n var iv = \"0123456789012345\";\n\n var allowedKeyEncodings = ['hex', 'utf8', 'base64', 'binary'];\n var allowedKeyLengths = [128, 256];\n var allowedModes = ['ecb', 'cbc'];\n\n var defaultOptions = {\n 'encryptKey': true,\n 'keyEncoding': 'utf8',\n 'keyLength': 256,\n 'mode': 'cbc'\n };\n\n function parse_options(options) {\n\n // Defaults\n options = options || {};\n if (!options['hasOwnProperty']('encryptKey')) options['encryptKey'] = defaultOptions['encryptKey'];\n if (!options['hasOwnProperty']('keyEncoding')) options['keyEncoding'] = defaultOptions['keyEncoding'];\n if (!options['hasOwnProperty']('keyLength')) options['keyLength'] = defaultOptions['keyLength'];\n if (!options['hasOwnProperty']('mode')) options['mode'] = defaultOptions['mode'];\n\n // Validation\n if (allowedKeyEncodings['indexOf'](options['keyEncoding']['toLowerCase']()) == -1) options['keyEncoding'] = defaultOptions['keyEncoding'];\n if (allowedKeyLengths['indexOf'](parseInt(options['keyLength'], 10)) == -1) options['keyLength'] = defaultOptions['keyLength'];\n if (allowedModes['indexOf'](options['mode']['toLowerCase']()) == -1) options['mode'] = defaultOptions['mode'];\n\n return options;\n\n }\n\n function decode_key(key, options) {\n if (options['keyEncoding'] == 'base64') {\n return CryptoJS['enc']['Base64']['parse'](key);\n } else if (options['keyEncoding'] == 'hex') {\n return CryptoJS['enc']['Hex']['parse'](key);\n } else {\n return key;\n }\n }\n\n function get_padded_key(key, options) {\n key = decode_key(key, options);\n if (options['encryptKey']) {\n return CryptoJS['enc']['Utf8']['parse'](SHA256(key)['slice'](0, 32));\n } else {\n return key;\n }\n }\n\n function get_mode(options) {\n if (options['mode'] == 'ecb') {\n return CryptoJS['mode']['ECB'];\n } else {\n return CryptoJS['mode']['CBC'];\n }\n }\n\n function get_iv(options) {\n return (options['mode'] == 'cbc') ? CryptoJS['enc']['Utf8']['parse'](iv) : null;\n }\n\n return {\n\n 'encrypt': function(data, key, options) {\n if (!key) return data;\n options = parse_options(options);\n var iv = get_iv(options);\n var mode = get_mode(options);\n var cipher_key = get_padded_key(key, options);\n var hex_message = JSON['stringify'](data);\n var encryptedHexArray = CryptoJS['AES']['encrypt'](hex_message, cipher_key, {'iv': iv, 'mode': mode})['ciphertext'];\n var base_64_encrypted = encryptedHexArray['toString'](CryptoJS['enc']['Base64']);\n return base_64_encrypted || data;\n },\n\n 'decrypt': function(data, key, options) {\n if (!key) return data;\n options = parse_options(options);\n var iv = get_iv(options);\n var mode = get_mode(options);\n var cipher_key = get_padded_key(key, options);\n try {\n var binary_enc = CryptoJS['enc']['Base64']['parse'](data);\n var json_plain = CryptoJS['AES']['decrypt']({'ciphertext': binary_enc}, cipher_key, {'iv': iv, 'mode': mode})['toString'](CryptoJS['enc']['Utf8']);\n var plaintext = JSON['parse'](json_plain);\n return plaintext;\n }\n catch (e) {\n return undefined;\n }\n }\n };\n}\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n/* =-========================= UTIL =============================-= */\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n\nwindow['PUBNUB'] || (function() {\n\n/**\n * UTIL LOCALS\n */\n\nvar SWF = 'https://pubnub.a.ssl.fastly.net/pubnub.swf'\n, ASYNC = 'async'\n, UA = navigator.userAgent\n, PNSDK = 'PubNub-JS-' + 'Web' + '/' + '3.7.14'\n, XORIGN = UA.indexOf('MSIE 6') == -1;\n\n/**\n * CONSOLE COMPATIBILITY\n */\nwindow.console || (window.console=window.console||{});\nconsole.log || (\n console.log =\n console.error =\n ((window.opera||{}).postError||function(){})\n);\n\n/**\n * LOCAL STORAGE OR COOKIE\n */\nvar db = (function(){\n var store = {};\n var ls = false;\n try {\n ls = window['localStorage'];\n } catch (e) { }\n var cookieGet = function(key) {\n if (document.cookie.indexOf(key) == -1) return null;\n return ((document.cookie||'').match(\n RegExp(key+'=([^;]+)')\n )||[])[1] || null;\n };\n var cookieSet = function( key, value ) {\n document.cookie = key + '=' + value +\n '; expires=Thu, 1 Aug 2030 20:00:00 UTC; path=/';\n };\n var cookieTest = (function() {\n try {\n cookieSet('pnctest', '1');\n return cookieGet('pnctest') === '1';\n } catch (e) {\n return false;\n }\n }());\n return {\n 'get' : function(key) {\n try {\n if (ls) return ls.getItem(key);\n if (cookieTest) return cookieGet(key);\n return store[key];\n } catch(e) {\n return store[key];\n }\n },\n 'set' : function( key, value ) {\n try {\n if (ls) return ls.setItem( key, value ) && 0;\n if (cookieTest) cookieSet( key, value );\n store[key] = value;\n } catch(e) {\n store[key] = value;\n }\n }\n };\n})();\n\nfunction get_hmac_SHA256(data,key) {\n var hash = CryptoJS['HmacSHA256'](data, key);\n return hash.toString(CryptoJS['enc']['Base64']);\n}\n\n/**\n * $\n * =\n * var div = $('divid');\n */\nfunction $(id) { return document.getElementById(id) }\n\n/**\n * ERROR\n * =====\n * error('message');\n */\nfunction error(message) { console['error'](message) }\n\n/**\n * SEARCH\n * ======\n * var elements = search('a div span');\n */\nfunction search( elements, start) {\n var list = [];\n each( elements.split(/\\s+/), function(el) {\n each( (start || document).getElementsByTagName(el), function(node) {\n list.push(node);\n } );\n });\n return list;\n}\n\n/**\n * BIND\n * ====\n * bind( 'keydown', search('a')[0], function(element) {\n * ...\n * } );\n */\nfunction bind( type, el, fun ) {\n each( type.split(','), function(etype) {\n var rapfun = function(e) {\n if (!e) e = window.event;\n if (!fun(e)) {\n e.cancelBubble = true;\n e.preventDefault && e.preventDefault();\n e.stopPropagation && e.stopPropagation();\n }\n };\n\n if ( el.addEventListener ) el.addEventListener( etype, rapfun, false );\n else if ( el.attachEvent ) el.attachEvent( 'on' + etype, rapfun );\n else el[ 'on' + etype ] = rapfun;\n } );\n}\n\n/**\n * UNBIND\n * ======\n * unbind( 'keydown', search('a')[0] );\n */\nfunction unbind( type, el, fun ) {\n if ( el.removeEventListener ) el.removeEventListener( type, false );\n else if ( el.detachEvent ) el.detachEvent( 'on' + type, false );\n else el[ 'on' + type ] = null;\n}\n\n/**\n * HEAD\n * ====\n * head().appendChild(elm);\n */\nfunction head() { return search('head')[0] }\n\n/**\n * ATTR\n * ====\n * var attribute = attr( node, 'attribute' );\n */\nfunction attr( node, attribute, value ) {\n if (value) node.setAttribute( attribute, value );\n else return node && node.getAttribute && node.getAttribute(attribute);\n}\n\n/**\n * CSS\n * ===\n * var obj = create('div');\n */\nfunction css( element, styles ) {\n for (var style in styles) if (styles.hasOwnProperty(style))\n try {element.style[style] = styles[style] + (\n '|width|height|top|left|'.indexOf(style) > 0 &&\n typeof styles[style] == 'number'\n ? 'px' : ''\n )}catch(e){}\n}\n\n/**\n * CREATE\n * ======\n * var obj = create('div');\n */\nfunction create(element) { return document.createElement(element) }\n\n\n/**\n * jsonp_cb\n * ========\n * var callback = jsonp_cb();\n */\nfunction jsonp_cb() { return XORIGN || FDomainRequest() ? 0 : unique() }\n\n\n\n/**\n * EVENTS\n * ======\n * PUBNUB.events.bind( 'you-stepped-on-flower', function(message) {\n * // Do Stuff with message\n * } );\n *\n * PUBNUB.events.fire( 'you-stepped-on-flower', \"message-data\" );\n * PUBNUB.events.fire( 'you-stepped-on-flower', {message:\"data\"} );\n * PUBNUB.events.fire( 'you-stepped-on-flower', [1,2,3] );\n *\n */\nvar events = {\n 'list' : {},\n 'unbind' : function( name ) { events.list[name] = [] },\n 'bind' : function( name, fun ) {\n (events.list[name] = events.list[name] || []).push(fun);\n },\n 'fire' : function( name, data ) {\n each(\n events.list[name] || [],\n function(fun) { fun(data) }\n );\n }\n};\n\n/**\n * XDR Cross Domain Request\n * ========================\n * xdr({\n * url : ['http://www.blah.com/url'],\n * success : function(response) {},\n * fail : function() {}\n * });\n */\nfunction xdr( setup ) {\n if (XORIGN || FDomainRequest()) return ajax(setup);\n\n var script = create('script')\n , callback = setup.callback\n , id = unique()\n , finished = 0\n , xhrtme = setup.timeout || DEF_TIMEOUT\n , timer = timeout( function(){done(1, {\"message\" : \"timeout\"})}, xhrtme )\n , fail = setup.fail || function(){}\n , data = setup.data || {}\n , success = setup.success || function(){}\n , append = function() { head().appendChild(script) }\n , done = function( failed, response ) {\n if (finished) return;\n finished = 1;\n\n script.onerror = null;\n clearTimeout(timer);\n\n (failed || !response) || success(response);\n\n timeout( function() {\n failed && fail();\n var s = $(id)\n , p = s && s.parentNode;\n p && p.removeChild(s);\n }, SECOND );\n };\n\n window[callback] = function(response) {\n done( 0, response );\n };\n\n if (!setup.blocking) script[ASYNC] = ASYNC;\n\n script.onerror = function() { done(1) };\n script.src = build_url( setup.url, data );\n\n attr( script, 'id', id );\n\n append();\n return done;\n}\n\n/**\n * CORS XHR Request\n * ================\n * xdr({\n * url : ['http://www.blah.com/url'],\n * success : function(response) {},\n * fail : function() {}\n * });\n */\nfunction ajax( setup ) {\n var xhr, response\n , finished = function() {\n if (loaded) return;\n loaded = 1;\n\n clearTimeout(timer);\n\n try { response = JSON['parse'](xhr.responseText); }\n catch (r) { return done(1); }\n\n complete = 1;\n success(response);\n }\n , complete = 0\n , loaded = 0\n , xhrtme = setup.timeout || DEF_TIMEOUT\n , timer = timeout( function(){done(1, {\"message\" : \"timeout\"})}, xhrtme )\n , fail = setup.fail || function(){}\n , data = setup.data || {}\n , success = setup.success || function(){}\n , async = !(setup.blocking)\n , done = function(failed,response) {\n if (complete) return;\n complete = 1;\n\n clearTimeout(timer);\n\n if (xhr) {\n xhr.onerror = xhr.onload = null;\n xhr.abort && xhr.abort();\n xhr = null;\n }\n\n failed && fail(response);\n };\n\n // Send\n try {\n xhr = FDomainRequest() ||\n window.XDomainRequest &&\n new XDomainRequest() ||\n new XMLHttpRequest();\n\n xhr.onerror = xhr.onabort = function(e){ done(\n 1, e || (xhr && xhr.responseText) || { \"error\" : \"Network Connection Error\"}\n ) };\n xhr.onload = xhr.onloadend = finished;\n xhr.onreadystatechange = function() {\n if (xhr && xhr.readyState == 4) {\n switch(xhr.status) {\n case 200:\n break;\n default:\n try {\n response = JSON['parse'](xhr.responseText);\n done(1,response);\n }\n catch (r) { return done(1, {status : xhr.status, payload : null, message : xhr.responseText}); }\n return;\n }\n }\n }\n\n var url = build_url(setup.url,data);\n\n xhr.open( 'GET', url, async );\n if (async) xhr.timeout = xhrtme;\n xhr.send();\n }\n catch(eee) {\n done(0);\n XORIGN = 0;\n return xdr(setup);\n }\n\n // Return 'done'\n return done;\n}\n\n// Test Connection State\nfunction _is_online() {\n if (!('onLine' in navigator)) return 1;\n try { return navigator['onLine'] }\n catch (e) { return true }\n}\n\n\nfunction sendBeacon(url) {\n if (!('sendBeacon' in navigator)) return false;\n\n return navigator['sendBeacon'](url);\n}\n\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n/* =-========================= PUBNUB ===========================-= */\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n\nvar PDIV = $('pubnub') || 0\n, CREATE_PUBNUB = function(setup) {\n\n // Force JSONP if requested from user.\n if (setup['jsonp']) XORIGN = 0;\n else XORIGN = UA.indexOf('MSIE 6') == -1;\n\n var SUBSCRIBE_KEY = setup['subscribe_key'] || ''\n , KEEPALIVE = (+setup['keepalive'] || DEF_KEEPALIVE) * SECOND\n , UUID = setup['uuid'] || db['get'](SUBSCRIBE_KEY+'uuid')||'';\n\n var leave_on_unload = setup['leave_on_unload'] || 0;\n\n setup['xdr'] = xdr;\n setup['db'] = db;\n setup['error'] = setup['error'] || error;\n setup['_is_online'] = _is_online;\n setup['jsonp_cb'] = jsonp_cb;\n setup['hmac_SHA256']= get_hmac_SHA256;\n setup['crypto_obj'] = crypto_obj();\n setup['sendBeacon'] = sendBeacon;\n setup['params'] = { 'pnsdk' : PNSDK }\n\n var SELF = function(setup) {\n return CREATE_PUBNUB(setup);\n };\n\n var PN = PN_API(setup);\n\n for (var prop in PN) {\n if (PN.hasOwnProperty(prop)) {\n SELF[prop] = PN[prop];\n }\n }\n SELF['css'] = css;\n SELF['$'] = $;\n SELF['create'] = create;\n SELF['bind'] = bind;\n SELF['head'] = head;\n SELF['search'] = search;\n SELF['attr'] = attr;\n SELF['events'] = events;\n SELF['init'] = SELF;\n SELF['secure'] = SELF;\n SELF['crypto_obj'] = crypto_obj(); // export to instance\n\n\n // Add Leave Functions\n bind( 'beforeunload', window, function() {\n if (leave_on_unload) SELF['each-channel'](function(ch){ SELF['LEAVE']( ch.name, 0 ) });\n return true;\n } );\n\n // Return without Testing\n if (setup['notest']) return SELF;\n\n bind( 'offline', window, SELF['offline'] );\n bind( 'offline', document, SELF['offline'] );\n\n // Return PUBNUB Socket Object\n return SELF;\n};\nCREATE_PUBNUB['init'] = CREATE_PUBNUB;\nCREATE_PUBNUB['secure'] = CREATE_PUBNUB;\nCREATE_PUBNUB['crypto_obj'] = crypto_obj(); // export to constructor\n\n// Bind for PUBNUB Readiness to Subscribe\nif (document.readyState === 'complete') {\n timeout( ready, 0 );\n}\nelse {\n bind( 'load', window, function(){ timeout( ready, 0 ) } );\n}\n\nvar pdiv = PDIV || {};\n\n// CREATE A PUBNUB GLOBAL OBJECT\nPUBNUB = CREATE_PUBNUB({\n 'notest' : 1,\n 'publish_key' : attr( pdiv, 'pub-key' ),\n 'subscribe_key' : attr( pdiv, 'sub-key' ),\n 'ssl' : !document.location.href.indexOf('https') ||\n attr( pdiv, 'ssl' ) == 'on',\n 'origin' : attr( pdiv, 'origin' ),\n 'uuid' : attr( pdiv, 'uuid' )\n});\n\n// jQuery Interface\nwindow['jQuery'] && (window['jQuery']['PUBNUB'] = CREATE_PUBNUB);\n\n// For Modern JS + Testling.js - http://testling.com/\ntypeof(module) !== 'undefined' && (module['exports'] = PUBNUB) && ready();\n\nvar pubnubs = $('pubnubs') || 0;\n\n// LEAVE NOW IF NO PDIV.\nif (!PDIV) return;\n\n// PUBNUB Flash Socket\ncss( PDIV, { 'position' : 'absolute', 'top' : -SECOND } );\n\nif ('opera' in window || attr( PDIV, 'flash' )) PDIV['innerHTML'] =\n '';\n\n// Create Interface for Opera Flash\nPUBNUB['rdx'] = function( id, data ) {\n if (!data) return FDomainRequest[id]['onerror']();\n FDomainRequest[id]['responseText'] = unescape(data);\n FDomainRequest[id]['onload']();\n};\n\nfunction FDomainRequest() {\n if (!pubnubs || !pubnubs['get']) return 0;\n\n var fdomainrequest = {\n 'id' : FDomainRequest['id']++,\n 'send' : function() {},\n 'abort' : function() { fdomainrequest['id'] = {} },\n 'open' : function( method, url ) {\n FDomainRequest[fdomainrequest['id']] = fdomainrequest;\n pubnubs['get']( fdomainrequest['id'], url );\n }\n };\n\n return fdomainrequest;\n}\nFDomainRequest['id'] = SECOND;\n\n})();\n(function(){\n\n// ---------------------------------------------------------------------------\n// WEBSOCKET INTERFACE\n// ---------------------------------------------------------------------------\nvar WS = PUBNUB['ws'] = function( url, protocols ) {\n if (!(this instanceof WS)) return new WS( url, protocols );\n\n var self = this\n , url = self.url = url || ''\n , protocol = self.protocol = protocols || 'Sec-WebSocket-Protocol'\n , bits = url.split('/')\n , setup = {\n 'ssl' : bits[0] === 'wss:'\n ,'origin' : bits[2]\n ,'publish_key' : bits[3]\n ,'subscribe_key' : bits[4]\n ,'channel' : bits[5]\n };\n\n // READY STATES\n self['CONNECTING'] = 0; // The connection is not yet open.\n self['OPEN'] = 1; // The connection is open and ready to communicate.\n self['CLOSING'] = 2; // The connection is in the process of closing.\n self['CLOSED'] = 3; // The connection is closed or couldn't be opened.\n\n // CLOSE STATES\n self['CLOSE_NORMAL'] = 1000; // Normal Intended Close; completed.\n self['CLOSE_GOING_AWAY'] = 1001; // Closed Unexpecttedly.\n self['CLOSE_PROTOCOL_ERROR'] = 1002; // Server: Not Supported.\n self['CLOSE_UNSUPPORTED'] = 1003; // Server: Unsupported Protocol.\n self['CLOSE_TOO_LARGE'] = 1004; // Server: Too Much Data.\n self['CLOSE_NO_STATUS'] = 1005; // Server: No reason.\n self['CLOSE_ABNORMAL'] = 1006; // Abnormal Disconnect.\n\n // Events Default\n self['onclose'] = self['onerror'] =\n self['onmessage'] = self['onopen'] =\n self['onsend'] = function(){};\n\n // Attributes\n self['binaryType'] = '';\n self['extensions'] = '';\n self['bufferedAmount'] = 0;\n self['trasnmitting'] = false;\n self['buffer'] = [];\n self['readyState'] = self['CONNECTING'];\n\n // Close if no setup.\n if (!url) {\n self['readyState'] = self['CLOSED'];\n self['onclose']({\n 'code' : self['CLOSE_ABNORMAL'],\n 'reason' : 'Missing URL',\n 'wasClean' : true\n });\n return self;\n }\n\n // PubNub WebSocket Emulation\n self.pubnub = PUBNUB['init'](setup);\n self.pubnub.setup = setup;\n self.setup = setup;\n\n self.pubnub['subscribe']({\n 'restore' : false,\n 'channel' : setup['channel'],\n 'disconnect' : self['onerror'],\n 'reconnect' : self['onopen'],\n 'error' : function() {\n self['onclose']({\n 'code' : self['CLOSE_ABNORMAL'],\n 'reason' : 'Missing URL',\n 'wasClean' : false\n });\n },\n 'callback' : function(message) {\n self['onmessage']({ 'data' : message });\n },\n 'connect' : function() {\n self['readyState'] = self['OPEN'];\n self['onopen']();\n }\n });\n};\n\n// ---------------------------------------------------------------------------\n// WEBSOCKET SEND\n// ---------------------------------------------------------------------------\nWS.prototype.send = function(data) {\n var self = this;\n self.pubnub['publish']({\n 'channel' : self.pubnub.setup['channel'],\n 'message' : data,\n 'callback' : function(response) {\n self['onsend']({ 'data' : response });\n }\n });\n};\n\n// ---------------------------------------------------------------------------\n// WEBSOCKET CLOSE\n// ---------------------------------------------------------------------------\nWS.prototype.close = function() {\n var self = this;\n self.pubnub['unsubscribe']({ 'channel' : self.pubnub.setup['channel'] });\n self['readyState'] = self['CLOSED'];\n self['onclose']({});\n};\n\n})();\n/*\nCryptoJS v3.1.2\ncode.google.com/p/crypto-js\n(c) 2009-2013 by Jeff Mott. All rights reserved.\ncode.google.com/p/crypto-js/wiki/License\n*/\nvar CryptoJS=CryptoJS||function(h,s){var f={},g=f.lib={},q=function(){},m=g.Base={extend:function(a){q.prototype=this;var c=new q;a&&c.mixIn(a);c.hasOwnProperty(\"init\")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty(\"toString\")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},\nr=g.WordArray=m.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=s?c:4*a.length},toString:function(a){return(a||k).stringify(this)},concat:function(a){var c=this.words,d=a.words,b=this.sigBytes;a=a.sigBytes;this.clamp();if(b%4)for(var e=0;e>>2]|=(d[e>>>2]>>>24-8*(e%4)&255)<<24-8*((b+e)%4);else if(65535>>2]=d[e>>>2];else c.push.apply(c,d);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<\n32-8*(c%4);a.length=h.ceil(c/4)},clone:function(){var a=m.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],d=0;d>>2]>>>24-8*(b%4)&255;d.push((e>>>4).toString(16));d.push((e&15).toString(16))}return d.join(\"\")},parse:function(a){for(var c=a.length,d=[],b=0;b>>3]|=parseInt(a.substr(b,\n2),16)<<24-4*(b%8);return new r.init(d,c/2)}},n=l.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var d=[],b=0;b>>2]>>>24-8*(b%4)&255));return d.join(\"\")},parse:function(a){for(var c=a.length,d=[],b=0;b>>2]|=(a.charCodeAt(b)&255)<<24-8*(b%4);return new r.init(d,c)}},j=l.Utf8={stringify:function(a){try{return decodeURIComponent(escape(n.stringify(a)))}catch(c){throw Error(\"Malformed UTF-8 data\");}},parse:function(a){return n.parse(unescape(encodeURIComponent(a)))}},\nu=g.BufferedBlockAlgorithm=m.extend({reset:function(){this._data=new r.init;this._nDataBytes=0},_append:function(a){\"string\"==typeof a&&(a=j.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,d=c.words,b=c.sigBytes,e=this.blockSize,f=b/(4*e),f=a?h.ceil(f):h.max((f|0)-this._minBufferSize,0);a=f*e;b=h.min(4*a,b);if(a){for(var g=0;gn;){var j;a:{j=k;for(var u=h.sqrt(j),t=2;t<=u;t++)if(!(j%t)){j=!1;break a}j=!0}j&&(8>n&&(m[n]=l(h.pow(k,0.5))),r[n]=l(h.pow(k,1/3)),n++);k++}var a=[],f=f.SHA256=q.extend({_doReset:function(){this._hash=new g.init(m.slice(0))},_doProcessBlock:function(c,d){for(var b=this._hash.words,e=b[0],f=b[1],g=b[2],j=b[3],h=b[4],m=b[5],n=b[6],q=b[7],p=0;64>p;p++){if(16>p)a[p]=\nc[d+p]|0;else{var k=a[p-15],l=a[p-2];a[p]=((k<<25|k>>>7)^(k<<14|k>>>18)^k>>>3)+a[p-7]+((l<<15|l>>>17)^(l<<13|l>>>19)^l>>>10)+a[p-16]}k=q+((h<<26|h>>>6)^(h<<21|h>>>11)^(h<<7|h>>>25))+(h&m^~h&n)+r[p]+a[p];l=((e<<30|e>>>2)^(e<<19|e>>>13)^(e<<10|e>>>22))+(e&f^e&g^f&g);q=n;n=m;m=h;h=j+k|0;j=g;g=f;f=e;e=k+l|0}b[0]=b[0]+e|0;b[1]=b[1]+f|0;b[2]=b[2]+g|0;b[3]=b[3]+j|0;b[4]=b[4]+h|0;b[5]=b[5]+m|0;b[6]=b[6]+n|0;b[7]=b[7]+q|0},_doFinalize:function(){var a=this._data,d=a.words,b=8*this._nDataBytes,e=8*a.sigBytes;\nd[e>>>5]|=128<<24-e%32;d[(e+64>>>9<<4)+14]=h.floor(b/4294967296);d[(e+64>>>9<<4)+15]=b;a.sigBytes=4*d.length;this._process();return this._hash},clone:function(){var a=q.clone.call(this);a._hash=this._hash.clone();return a}});s.SHA256=q._createHelper(f);s.HmacSHA256=q._createHmacHelper(f)})(Math);\n\n// HMAC SHA256\n(function(){var h=CryptoJS,s=h.enc.Utf8;h.algo.HMAC=h.lib.Base.extend({init:function(f,g){f=this._hasher=new f.init;\"string\"==typeof g&&(g=s.parse(g));var h=f.blockSize,m=4*h;g.sigBytes>m&&(g=f.finalize(g));g.clamp();for(var r=this._oKey=g.clone(),l=this._iKey=g.clone(),k=r.words,n=l.words,j=0;j>>2]>>>24-8*(r%4)&255)<<16|(l[r+1>>>2]>>>24-8*((r+1)%4)&255)<<8|l[r+2>>>2]>>>24-8*((r+2)%4)&255,v=0;4>v&&r+0.75*v>>6*(3-v)&63));if(l=t.charAt(64))for(;d.length%4;)d.push(l);return d.join(\"\")},parse:function(d){var l=d.length,s=this._map,t=s.charAt(64);t&&(t=d.indexOf(t),-1!=t&&(l=t));for(var t=[],r=0,w=0;w<\nl;w++)if(w%4){var v=s.indexOf(d.charAt(w-1))<<2*(w%4),b=s.indexOf(d.charAt(w))>>>6-2*(w%4);t[r>>>2]|=(v|b)<<24-8*(r%4);r++}return p.create(t,r)},_map:\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\"}})();\n\n// BlockCipher\n(function(u){function p(b,n,a,c,e,j,k){b=b+(n&a|~n&c)+e+k;return(b<>>32-j)+n}function d(b,n,a,c,e,j,k){b=b+(n&c|a&~c)+e+k;return(b<>>32-j)+n}function l(b,n,a,c,e,j,k){b=b+(n^a^c)+e+k;return(b<>>32-j)+n}function s(b,n,a,c,e,j,k){b=b+(a^(n|~c))+e+k;return(b<>>32-j)+n}for(var t=CryptoJS,r=t.lib,w=r.WordArray,v=r.Hasher,r=t.algo,b=[],x=0;64>x;x++)b[x]=4294967296*u.abs(u.sin(x+1))|0;r=r.MD5=v.extend({_doReset:function(){this._hash=new w.init([1732584193,4023233417,2562383102,271733878])},\n_doProcessBlock:function(q,n){for(var a=0;16>a;a++){var c=n+a,e=q[c];q[c]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360}var a=this._hash.words,c=q[n+0],e=q[n+1],j=q[n+2],k=q[n+3],z=q[n+4],r=q[n+5],t=q[n+6],w=q[n+7],v=q[n+8],A=q[n+9],B=q[n+10],C=q[n+11],u=q[n+12],D=q[n+13],E=q[n+14],x=q[n+15],f=a[0],m=a[1],g=a[2],h=a[3],f=p(f,m,g,h,c,7,b[0]),h=p(h,f,m,g,e,12,b[1]),g=p(g,h,f,m,j,17,b[2]),m=p(m,g,h,f,k,22,b[3]),f=p(f,m,g,h,z,7,b[4]),h=p(h,f,m,g,r,12,b[5]),g=p(g,h,f,m,t,17,b[6]),m=p(m,g,h,f,w,22,b[7]),\nf=p(f,m,g,h,v,7,b[8]),h=p(h,f,m,g,A,12,b[9]),g=p(g,h,f,m,B,17,b[10]),m=p(m,g,h,f,C,22,b[11]),f=p(f,m,g,h,u,7,b[12]),h=p(h,f,m,g,D,12,b[13]),g=p(g,h,f,m,E,17,b[14]),m=p(m,g,h,f,x,22,b[15]),f=d(f,m,g,h,e,5,b[16]),h=d(h,f,m,g,t,9,b[17]),g=d(g,h,f,m,C,14,b[18]),m=d(m,g,h,f,c,20,b[19]),f=d(f,m,g,h,r,5,b[20]),h=d(h,f,m,g,B,9,b[21]),g=d(g,h,f,m,x,14,b[22]),m=d(m,g,h,f,z,20,b[23]),f=d(f,m,g,h,A,5,b[24]),h=d(h,f,m,g,E,9,b[25]),g=d(g,h,f,m,k,14,b[26]),m=d(m,g,h,f,v,20,b[27]),f=d(f,m,g,h,D,5,b[28]),h=d(h,f,\nm,g,j,9,b[29]),g=d(g,h,f,m,w,14,b[30]),m=d(m,g,h,f,u,20,b[31]),f=l(f,m,g,h,r,4,b[32]),h=l(h,f,m,g,v,11,b[33]),g=l(g,h,f,m,C,16,b[34]),m=l(m,g,h,f,E,23,b[35]),f=l(f,m,g,h,e,4,b[36]),h=l(h,f,m,g,z,11,b[37]),g=l(g,h,f,m,w,16,b[38]),m=l(m,g,h,f,B,23,b[39]),f=l(f,m,g,h,D,4,b[40]),h=l(h,f,m,g,c,11,b[41]),g=l(g,h,f,m,k,16,b[42]),m=l(m,g,h,f,t,23,b[43]),f=l(f,m,g,h,A,4,b[44]),h=l(h,f,m,g,u,11,b[45]),g=l(g,h,f,m,x,16,b[46]),m=l(m,g,h,f,j,23,b[47]),f=s(f,m,g,h,c,6,b[48]),h=s(h,f,m,g,w,10,b[49]),g=s(g,h,f,m,\nE,15,b[50]),m=s(m,g,h,f,r,21,b[51]),f=s(f,m,g,h,u,6,b[52]),h=s(h,f,m,g,k,10,b[53]),g=s(g,h,f,m,B,15,b[54]),m=s(m,g,h,f,e,21,b[55]),f=s(f,m,g,h,v,6,b[56]),h=s(h,f,m,g,x,10,b[57]),g=s(g,h,f,m,t,15,b[58]),m=s(m,g,h,f,D,21,b[59]),f=s(f,m,g,h,z,6,b[60]),h=s(h,f,m,g,C,10,b[61]),g=s(g,h,f,m,j,15,b[62]),m=s(m,g,h,f,A,21,b[63]);a[0]=a[0]+f|0;a[1]=a[1]+m|0;a[2]=a[2]+g|0;a[3]=a[3]+h|0},_doFinalize:function(){var b=this._data,n=b.words,a=8*this._nDataBytes,c=8*b.sigBytes;n[c>>>5]|=128<<24-c%32;var e=u.floor(a/\n4294967296);n[(c+64>>>9<<4)+15]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360;n[(c+64>>>9<<4)+14]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;b.sigBytes=4*(n.length+1);this._process();b=this._hash;n=b.words;for(a=0;4>a;a++)c=n[a],n[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return b},clone:function(){var b=v.clone.call(this);b._hash=this._hash.clone();return b}});t.MD5=v._createHelper(r);t.HmacMD5=v._createHmacHelper(r)})(Math);\n(function(){var u=CryptoJS,p=u.lib,d=p.Base,l=p.WordArray,p=u.algo,s=p.EvpKDF=d.extend({cfg:d.extend({keySize:4,hasher:p.MD5,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(d,r){for(var p=this.cfg,s=p.hasher.create(),b=l.create(),u=b.words,q=p.keySize,p=p.iterations;u.length>>2]&255}};d.BlockCipher=v.extend({cfg:v.cfg.extend({mode:b,padding:q}),reset:function(){v.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;this._mode=c.call(a,\nthis,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var n=d.CipherParams=l.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),b=(p.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;return(a?s.create([1398893684,\n1701076831]).concat(a).concat(b):b).toString(r)},parse:function(a){a=r.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=s.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return n.create({ciphertext:a,salt:c})}},a=d.SerializableCipher=l.extend({cfg:l.extend({format:b}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var l=a.createEncryptor(c,d);b=l.finalize(b);l=l.cfg;return n.create({ciphertext:b,key:c,iv:l.iv,algorithm:a,mode:l.mode,padding:l.padding,blockSize:a.blockSize,formatter:d.format})},\ndecrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return\"string\"==typeof a?b.parse(a,this):a}}),p=(p.kdf={}).OpenSSL={execute:function(a,b,c,d){d||(d=s.random(8));a=w.create({keySize:b+c}).compute(a,d);c=s.create(a.words.slice(b),4*c);a.sigBytes=4*b;return n.create({key:a,iv:c,salt:d})}},c=d.PasswordBasedCipher=a.extend({cfg:a.cfg.extend({kdf:p}),encrypt:function(b,c,d,l){l=this.cfg.extend(l);d=l.kdf.execute(d,\nb.keySize,b.ivSize);l.iv=d.iv;b=a.encrypt.call(this,b,c,d.key,l);b.mixIn(d);return b},decrypt:function(b,c,d,l){l=this.cfg.extend(l);c=this._parse(c,l.format);d=l.kdf.execute(d,b.keySize,b.ivSize,c.salt);l.iv=d.iv;return a.decrypt.call(this,b,c,d.key,l)}})}();\n\n// AES\n(function(){for(var u=CryptoJS,p=u.lib.BlockCipher,d=u.algo,l=[],s=[],t=[],r=[],w=[],v=[],b=[],x=[],q=[],n=[],a=[],c=0;256>c;c++)a[c]=128>c?c<<1:c<<1^283;for(var e=0,j=0,c=0;256>c;c++){var k=j^j<<1^j<<2^j<<3^j<<4,k=k>>>8^k&255^99;l[e]=k;s[k]=e;var z=a[e],F=a[z],G=a[F],y=257*a[k]^16843008*k;t[e]=y<<24|y>>>8;r[e]=y<<16|y>>>16;w[e]=y<<8|y>>>24;v[e]=y;y=16843009*G^65537*F^257*z^16843008*e;b[k]=y<<24|y>>>8;x[k]=y<<16|y>>>16;q[k]=y<<8|y>>>24;n[k]=y;e?(e=z^a[a[a[G^z]]],j^=a[a[j]]):e=j=1}var H=[0,1,2,4,8,\n16,32,64,128,27,54],d=d.AES=p.extend({_doReset:function(){for(var a=this._key,c=a.words,d=a.sigBytes/4,a=4*((this._nRounds=d+6)+1),e=this._keySchedule=[],j=0;j>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255]):(k=k<<8|k>>>24,k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255],k^=H[j/d|0]<<24);e[j]=e[j-d]^k}c=this._invKeySchedule=[];for(d=0;dd||4>=j?k:b[l[k>>>24]]^x[l[k>>>16&255]]^q[l[k>>>\n8&255]]^n[l[k&255]]},encryptBlock:function(a,b){this._doCryptBlock(a,b,this._keySchedule,t,r,w,v,l)},decryptBlock:function(a,c){var d=a[c+1];a[c+1]=a[c+3];a[c+3]=d;this._doCryptBlock(a,c,this._invKeySchedule,b,x,q,n,s);d=a[c+1];a[c+1]=a[c+3];a[c+3]=d},_doCryptBlock:function(a,b,c,d,e,j,l,f){for(var m=this._nRounds,g=a[b]^c[0],h=a[b+1]^c[1],k=a[b+2]^c[2],n=a[b+3]^c[3],p=4,r=1;r>>24]^e[h>>>16&255]^j[k>>>8&255]^l[n&255]^c[p++],s=d[h>>>24]^e[k>>>16&255]^j[n>>>8&255]^l[g&255]^c[p++],t=\nd[k>>>24]^e[n>>>16&255]^j[g>>>8&255]^l[h&255]^c[p++],n=d[n>>>24]^e[g>>>16&255]^j[h>>>8&255]^l[k&255]^c[p++],g=q,h=s,k=t;q=(f[g>>>24]<<24|f[h>>>16&255]<<16|f[k>>>8&255]<<8|f[n&255])^c[p++];s=(f[h>>>24]<<24|f[k>>>16&255]<<16|f[n>>>8&255]<<8|f[g&255])^c[p++];t=(f[k>>>24]<<24|f[n>>>16&255]<<16|f[g>>>8&255]<<8|f[h&255])^c[p++];n=(f[n>>>24]<<24|f[g>>>16&255]<<16|f[h>>>8&255]<<8|f[k&255])^c[p++];a[b]=q;a[b+1]=s;a[b+2]=t;a[b+3]=n},keySize:8});u.AES=p._createHelper(d)})();\n\n// Mode ECB\nCryptoJS.mode.ECB = (function () {\n var ECB = CryptoJS.lib.BlockCipherMode.extend();\n\n ECB.Encryptor = ECB.extend({\n processBlock: function (words, offset) {\n this._cipher.encryptBlock(words, offset);\n }\n });\n\n ECB.Decryptor = ECB.extend({\n processBlock: function (words, offset) {\n this._cipher.decryptBlock(words, offset);\n }\n });\n\n return ECB;\n}());// Moved to hmac-sha-256.js\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./bower_components/pubnub/web/pubnub.js\n ** module id = 10\n ** module chunks = 0\n **/","export default class Cache {\n\n static defaultPrefix = 'rc-';\n\n constructor(storage, prefix) {\n this.setPrefix(prefix);\n this._storage = storage;\n }\n\n setPrefix(prefix) {\n this._prefix = prefix || Cache.defaultPrefix;\n return this;\n }\n\n setItem(key, data) {\n this._storage[this._prefixKey(key)] = JSON.stringify(data);\n return this;\n }\n\n removeItem(key) {\n delete this._storage[this._prefixKey(key)];\n return this;\n }\n\n getItem(key) {\n var item = this._storage[this._prefixKey(key)];\n if (!item) return null;\n return JSON.parse(item);\n }\n\n clean() {\n\n for (var key in this._storage) {\n\n if (!this._storage.hasOwnProperty(key)) continue;\n\n if (key.indexOf(this._prefix) === 0) {\n delete this._storage[key];\n }\n\n }\n\n return this;\n\n }\n\n _prefixKey(key) {\n return this._prefix + key;\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Cache.js\n **/","export default class Observable {\n\n constructor() {\n this.off();\n }\n\n hasListeners(event) {\n return (event in this._listeners);\n }\n\n on(events, callback) {\n\n if (typeof events == 'string') events = [events];\n if (!events) throw new Error('No events to subscribe to');\n if (typeof callback !== 'function') throw new Error('Callback must be a function');\n\n events.forEach((event) => {\n\n if (!this.hasListeners(event)) this._listeners[event] = [];\n\n this._listeners[event].push(callback);\n\n });\n\n return this;\n\n }\n\n emit(event, ...args) {\n\n var result = null;\n\n if (!this.hasListeners(event)) return null;\n\n this._listeners[event].some((callback) => {\n\n result = callback.apply(this, args);\n return (result === false);\n\n });\n\n return result;\n\n }\n\n off(event, callback) {\n\n if (!event) {\n\n this._listeners = {};\n\n } else {\n\n if (!callback) {\n\n delete this._listeners[event];\n\n } else {\n\n if (!this.hasListeners(event)) return this;\n\n this._listeners[event].forEach((cb, i) => {\n\n if (cb === callback) delete this._listeners[event][i];\n\n });\n\n }\n\n }\n\n return this;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Observable.js\n **/","import {fetch, Request, Response, Headers, Promise} from '../core/Externals';\nimport {queryStringify} from '../core/Utils';\nimport {findHeaderName} from './Utils';\nimport Observable from '../core/Observable';\nimport ApiResponse from './ApiResponse';\n\nexport default class Client extends Observable {\n\n static _allowedMethods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'];\n\n events = {\n beforeRequest: 'beforeRequest',\n requestSuccess: 'requestSuccess',\n requestError: 'requestError'\n };\n\n /**\n * @param {Request} request\n * @return {Promise}\n */\n async sendRequest(request) {\n\n var apiResponse = new ApiResponse(request);\n\n try {\n\n //TODO Stop request if listeners return false\n this.emit(this.events.beforeRequest, apiResponse);\n\n apiResponse._response = await this._loadResponse(request);\n\n if (apiResponse._isMultipart() || apiResponse._isJson()) {\n apiResponse._text = await apiResponse.response().text();\n }\n\n if (!apiResponse.ok()) throw new Error('Response has unsuccessful status');\n\n this.emit(this.events.requestSuccess, apiResponse);\n\n return apiResponse;\n\n } catch (e) {\n\n if (!e.apiResponse) e = this.makeError(e, apiResponse);\n\n this.emit(this.events.requestError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @param {Request} request\n * @return {Promise}\n * @private\n */\n async _loadResponse(request) {\n return await fetch.call(null, request);\n }\n\n /**\n * Wraps the JS Error object with transaction information\n * @param {Error|IApiError} e\n * @param {ApiResponse} apiResponse\n * @return {IApiError}\n */\n makeError(e, apiResponse) {\n\n // Wrap only if regular error\n if (!e.hasOwnProperty('apiResponse') && !e.hasOwnProperty('originalMessage')) {\n\n e.apiResponse = apiResponse;\n e.originalMessage = e.message;\n e.message = (apiResponse && apiResponse.error(true)) || e.originalMessage;\n\n }\n\n return e;\n\n }\n\n /**\n *\n * @param {object} init\n * @param {object} [init.url]\n * @param {object} [init.body]\n * @param {string} [init.method]\n * @param {object} [init.query]\n * @param {object} [init.headers]\n * @return {Request}\n */\n createRequest(init) {\n\n init = init || {};\n init.headers = init.headers || {};\n\n // Sanity checks\n if (!init.url) throw new Error('Url is not defined');\n if (!init.method) init.method = 'GET';\n if (init.method && Client._allowedMethods.indexOf(init.method) < 0) throw new Error('Method has wrong value: ' + init.method);\n\n // Defaults\n init.credentials = init.credentials || 'include';\n init.mode = init.mode || 'cors';\n\n // Append Query String\n if (init.query) {\n init.url = init.url + (init.url.indexOf('?') > -1 ? '&' : '?') + queryStringify(init.query);\n }\n\n if (!(findHeaderName('Accept', init.headers))) {\n init.headers['Accept'] = ApiResponse._jsonContentType;\n }\n\n // Serialize body\n //TODO Check that body is a plain object\n if (typeof init.body !== 'string' || !init.body) {\n\n var contentTypeHeaderName = findHeaderName(ApiResponse._contentType, init.headers);\n\n if (!contentTypeHeaderName) {\n contentTypeHeaderName = ApiResponse._contentType;\n init.headers[contentTypeHeaderName] = ApiResponse._jsonContentType;\n }\n\n var contentType = init.headers[contentTypeHeaderName];\n\n // Assign a new encoded body\n if (contentType.indexOf(ApiResponse._jsonContentType) > -1) {\n init.body = JSON.stringify(init.body);\n } else if (contentType.indexOf(ApiResponse._urlencodedContentType) > -1) {\n init.body = queryStringify(init.body);\n }\n\n }\n\n // Create a request with encoded body\n var req = new Request(init.url, init);\n\n // Keep the original body accessible directly (for mocks)\n req.originalBody = init.body;\n\n return req;\n\n }\n\n}\n\n/**\n * @name IApiError\n * @property {string} stack\n * @property {string} originalMessage\n * @property {ApiResponse} apiResponse\n */\n\n\n/** WEBPACK FOOTER **\n ** ./src/http/Client.js\n **/","import {fetch, Request, Response, Headers, Promise} from '../core/Externals';\nimport * as utils from '../core/Utils';\n\n/**\n * Creates a response\n * @param stringBody\n * @param init\n * @return {Response}\n */\nexport function createResponse(stringBody, init) {\n\n init = init || {};\n\n var response = new Response(stringBody, init);\n\n //TODO Wait for https://github.com/bitinn/node-fetch/issues/38\n if (utils.isNodeJS()) {\n\n response._text = stringBody;\n response._decode = function() {\n return this._text;\n };\n\n }\n\n return response;\n\n}\n\nexport function findHeaderName(name, headers) {\n name = name.toLowerCase();\n return Object.keys(headers).reduce(function(res, key) {\n if (res) return res;\n if (name == key.toLowerCase()) return key;\n return res;\n }, null);\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/http/Utils.js\n **/","import {fetch, Request, Response, Headers, Promise} from '../core/Externals';\nimport * as utils from './Utils';\n\nexport default class ApiResponse {\n\n static _contentType = 'Content-Type';\n static _jsonContentType = 'application/json';\n static _multipartContentType = 'multipart/mixed';\n static _urlencodedContentType = 'application/x-www-form-urlencoded';\n static _headerSeparator = ':';\n static _bodySeparator = '\\n\\n';\n static _boundarySeparator = '--';\n\n /**\n * @param {Request} request\n * @param {Response} response\n * @param {string} responseText\n */\n constructor(request, response, responseText) {\n\n /** @type {Request} */\n this._request = request;\n\n /** @type {Response} */\n this._response = response;\n\n this._text = responseText;\n this._json = null;\n this._multipart = [];\n\n }\n\n /**\n * @return {Response}\n */\n response() {\n return this._response;\n }\n\n /**\n * @return {Request}\n */\n request() {\n return this._request;\n }\n\n /**\n * @return {boolean}\n */\n ok() {\n return this._response && this._response.ok;\n }\n\n /**\n * @return {string}\n */\n text() {\n if (!this._isJson() && !this._isMultipart()) throw new Error('Response is not text');\n return this._text;\n }\n\n /**\n * @return {object}\n */\n json() {\n if (!this._isJson()) throw new Error('Response is not JSON');\n if (!this._json) {\n this._json = this._text ? JSON.parse(this._text) : null;\n }\n return this._json;\n }\n\n /**\n * @param [skipOKCheck]\n * @return {string}\n */\n error(skipOKCheck) {\n\n if (this.ok() && !skipOKCheck) return null;\n\n var message = (this._response && this._response.status ? this._response.status + ' ' : '') +\n (this._response && this._response.statusText ? this._response.statusText : '');\n\n try {\n\n if (this.json().message) message = this.json().message;\n if (this.json().error_description) message = this.json().error_description;\n if (this.json().description) message = this.json().description;\n\n } catch (e) {}\n\n return message;\n\n }\n\n /**\n * @return {ApiResponse[]}\n */\n multipart() {\n\n if (!this._isMultipart()) throw new Error('Response is not multipart');\n\n if (!this._multipart.length) {\n\n // Step 1. Split multipart response\n\n var text = this.text();\n\n if (!text) throw new Error('No response body');\n\n var boundary = this._getContentType().match(/boundary=([^;]+)/i)[1];\n\n if (!boundary) throw new Error('Cannot find boundary');\n\n var parts = text.toString().split(ApiResponse._boundarySeparator + boundary);\n\n if (parts[0].trim() === '') parts.shift();\n if (parts[parts.length - 1].trim() == ApiResponse._boundarySeparator) parts.pop();\n\n if (parts.length < 1) throw new Error('No parts in body');\n\n // Step 2. Parse status info\n\n var statusInfo = ApiResponse.create(parts.shift(), this._response.status, this._response.statusText).json();\n\n // Step 3. Parse all other parts\n\n this._multipart = parts.map((part:string, i) => {\n\n var status = statusInfo.response[i].status;\n\n return ApiResponse.create(part, status);\n\n });\n\n }\n\n return this._multipart;\n\n }\n\n _isContentType(contentType) {\n return this._getContentType().indexOf(contentType) > -1;\n }\n\n _getContentType() {\n return this._response.headers.get(ApiResponse._contentType) || '';\n }\n\n _isMultipart() {\n return this._isContentType(ApiResponse._multipartContentType);\n }\n\n _isUrlEncoded() {\n return this._isContentType(ApiResponse._urlencodedContentType);\n }\n\n _isJson() {\n return this._isContentType(ApiResponse._jsonContentType);\n }\n\n /**\n * Method is used to create ApiResponse object from string parts of multipart/mixed response\n * @param {string} [text]\n * @param {number} [status]\n * @param {string} [statusText]\n * @return {ApiResponse}\n */\n static create(text, status, statusText) {\n\n text = text || '';\n status = status || 200;\n statusText = statusText || 'OK';\n\n text = text.replace(/\\r/g, '');\n\n var headers = new Headers(),\n headersAndBody = text.split(ApiResponse._bodySeparator),\n headersText = (headersAndBody.length > 1) ? headersAndBody.shift() : '';\n\n text = headersAndBody.join(ApiResponse._bodySeparator);\n\n (headersText || '')\n .split('\\n')\n .forEach((header:string) => {\n\n var split = header.trim().split(ApiResponse._headerSeparator),\n key = split.shift().trim(),\n value = split.join(ApiResponse._headerSeparator).trim();\n\n if (key) headers.append(key, value);\n\n });\n\n return new ApiResponse(null, utils.createResponse(text, {\n headers: headers,\n status: status,\n statusText: statusText\n }), text);\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/http/ApiResponse.js\n **/","import Registry from './Registry';\nimport {default as HttpClient} from '../http/Client';\n\nexport default class Client extends HttpClient {\n\n constructor() {\n super();\n this._registry = new Registry();\n }\n\n registry() {\n return this._registry;\n }\n\n async _loadResponse(request) {\n\n var mock = this._registry.find(request);\n\n return await mock.getResponse(request);\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/mocks/ClientMock.js\n **/","import Mock from './Mock';\n\nexport default class Registry {\n\n constructor() {\n this._mocks = [];\n }\n\n add(mock) {\n this._mocks.push(mock);\n return this;\n }\n\n clear() {\n this._mocks = [];\n return this;\n }\n\n find(request) {\n\n //console.log('Registry is looking for', request);\n\n var mock = this._mocks.shift();\n\n if (!mock) throw new Error('No mock in registry for request ' + request.method + ' ' + request.url);\n\n if (!mock.test(request)) throw new Error('Wrong request ' + request.method + ' ' + request.url +\n ' for expected mock ' + mock.method() + ' ' + mock.path());\n\n return mock;\n\n }\n\n apiCall(method:string, path:string, response:any, status, statusText) {\n\n this.add(new Mock(method, path, response, status, statusText));\n\n return this;\n\n }\n\n authentication() {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'access_token': 'ACCESS_TOKEN',\n 'token_type': 'bearer',\n 'expires_in': 3600,\n 'refresh_token': 'REFRESH_TOKEN',\n 'refresh_token_expires_in': 60480,\n 'scope': 'SMS RCM Foo Boo',\n 'expireTime': new Date().getTime() + 3600000\n });\n\n return this;\n\n }\n\n logout() {\n\n this.apiCall('POST', '/restapi/oauth/revoke', {});\n\n return this;\n\n }\n\n presenceLoad(id) {\n\n this.apiCall('GET', '/restapi/v1.0/account/~/extension/' + id + '/presence', {\n \"uri\": \"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/\" + id + \"/presence\",\n \"extension\": {\n \"uri\": \"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/\" + id,\n \"id\": id,\n \"extensionNumber\": \"101\"\n },\n \"activeCalls\": [],\n \"presenceStatus\": \"Available\",\n \"telephonyStatus\": \"Ringing\",\n \"userStatus\": \"Available\",\n \"dndStatus\": \"TakeAllCalls\",\n \"extensionId\": id\n });\n\n return this;\n\n }\n\n subscribeGeneric(expiresIn) {\n\n expiresIn = expiresIn || 15 * 60 * 60;\n\n var date = new Date();\n\n this.apiCall('POST', '/restapi/v1.0/subscription', {\n 'eventFilters': [\n '/restapi/v1.0/account/~/extension/~/presence'\n ],\n 'expirationTime': new Date(date.getTime() + (expiresIn * 1000)).toISOString(),\n 'expiresIn': expiresIn,\n 'deliveryMode': {\n 'transportType': 'PubNub',\n 'encryption': false,\n 'address': '123_foo',\n 'subscriberKey': 'sub-c-foo',\n 'secretKey': 'sec-c-bar'\n },\n 'id': 'foo-bar-baz',\n 'creationTime': date.toISOString(),\n 'status': 'Active',\n 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz'\n });\n\n return this;\n\n }\n\n subscribeOnPresence(id, detailed) {\n\n id = id || '1';\n\n var date = new Date();\n\n this.apiCall('POST', '/restapi/v1.0/subscription', {\n 'eventFilters': ['/restapi/v1.0/account/~/extension/' + id + '/presence' + (detailed ? '?detailedTelephonyState=true' : '')],\n 'expirationTime': new Date(date.getTime() + (15 * 60 * 60 * 1000)).toISOString(),\n 'deliveryMode': {\n 'transportType': 'PubNub',\n 'encryption': true,\n 'address': '123_foo',\n 'subscriberKey': 'sub-c-foo',\n 'secretKey': 'sec-c-bar',\n 'encryptionAlgorithm': 'AES',\n 'encryptionKey': 'VQwb6EVNcQPBhE/JgFZ2zw=='\n },\n 'creationTime': date.toISOString(),\n 'id': 'foo-bar-baz',\n 'status': 'Active',\n 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz'\n });\n\n return this;\n\n }\n\n tokenRefresh(failure) {\n\n if (!failure) {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'access_token': 'ACCESS_TOKEN_FROM_REFRESH',\n 'token_type': 'bearer',\n 'expires_in': 3600,\n 'refresh_token': 'REFRESH_TOKEN_FROM_REFRESH',\n 'refresh_token_expires_in': 60480,\n 'scope': 'SMS RCM Foo Boo'\n });\n\n } else {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'message': 'Wrong token',\n 'error_description': 'Wrong token',\n 'description': 'Wrong token'\n }, 400);\n\n }\n\n return this;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/mocks/Registry.js\n **/","import ApiResponse from '../http/ApiResponse';\nimport {delay} from '../core/Utils';\nimport {createResponse} from '../http/Utils';\n\nexport default class Mock {\n\n constructor(method, path, json, status, statusText, delay) {\n this._method = method.toUpperCase();\n this._path = path;\n this._json = json || {};\n this._delay = delay || 10;\n this._status = status || 200;\n this._statusText = statusText || 'OK';\n }\n\n path() {\n return this._path;\n }\n\n method() {\n return this._method;\n }\n\n test(request:Request) {\n\n return request.url.indexOf(this._path) > -1 &&\n request.method.toUpperCase() == this._method;\n\n }\n\n async getResponse(request) {\n\n await delay(this._delay);\n\n return this.createResponse(this._json);\n\n }\n\n createResponse(json, init) {\n\n init = init || {};\n\n init.status = init.status || this._status;\n init.statusText = init.statusText || this._statusText;\n\n var str = JSON.stringify(json),\n res = createResponse(str, init);\n\n res.headers.set(ApiResponse._contentType, ApiResponse._jsonContentType);\n\n return res;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/mocks/Mock.js\n **/","import Observable from '../core/Observable';\nimport Queue from './Queue';\nimport Auth from './Auth';\nimport {Promise} from '../core/Externals';\nimport {queryStringify, parseQueryString, delay} from '../core/Utils';\n\nexport default class Platform extends Observable {\n\n static _urlPrefix = '/restapi';\n static _apiVersion = 'v1.0';\n static _accessTokenTtl = null; // Platform server by default sets it to 60 * 60 = 1 hour\n static _refreshTokenTtl = 10 * 60 * 60; // 10 hours\n static _refreshTokenTtlRemember = 7 * 24 * 60 * 60; // 1 week\n static _tokenEndpoint = '/restapi/oauth/token';\n static _revokeEndpoint = '/restapi/oauth/revoke';\n static _authorizeEndpoint = '/restapi/oauth/authorize';\n static _refreshDelayMs = 100;\n static _cacheId = 'platform';\n static _clearCacheOnRefreshError = true;\n\n events = {\n beforeLogin: 'beforeLogin',\n loginSuccess: 'loginSuccess',\n loginError: 'loginError',\n beforeRefresh: 'beforeRefresh',\n refreshSuccess: 'refreshSuccess',\n refreshError: 'refreshError',\n beforeLogout: 'beforeLogout',\n logoutSuccess: 'logoutSuccess',\n logoutError: 'logoutError'\n };\n\n constructor(client, cache, server, appKey, appSecret) {\n\n super();\n\n this._server = server;\n this._appKey = appKey;\n this._appSecret = appSecret;\n\n /** @type {Cache} */\n this._cache = cache;\n\n /** @type {Client} */\n this._client = client;\n\n this._queue = new Queue(this._cache, Platform._cacheId + '-refresh');\n\n this._auth = new Auth(this._cache, Platform._cacheId);\n\n }\n\n /**\n * @return {Auth}\n */\n auth() {\n return this._auth;\n }\n\n /**\n * @return {Client}\n */\n client() {\n return this._client;\n }\n\n /**\n * @param {string} path\n * @param {object} [options]\n * @param {boolean} [options.addServer]\n * @param {string} [options.addMethod]\n * @param {boolean} [options.addToken]\n * @return {string}\n */\n createUrl(path, options) {\n\n path = path || '';\n options = options || {};\n\n var builtUrl = '',\n hasHttp = path.indexOf('http://') != -1 || path.indexOf('https://') != -1;\n\n if (options.addServer && !hasHttp) builtUrl += this._server;\n\n if (path.indexOf(Platform._urlPrefix) == -1 && !hasHttp) builtUrl += Platform._urlPrefix + '/' + Platform._apiVersion;\n\n builtUrl += path;\n\n if (options.addMethod || options.addToken) builtUrl += (path.indexOf('?') > -1 ? '&' : '?');\n\n if (options.addMethod) builtUrl += '_method=' + options.addMethod;\n if (options.addToken) builtUrl += (options.addMethod ? '&' : '') + 'access_token=' + this._auth.accessToken();\n\n return builtUrl;\n\n }\n\n /**\n * @param {string} options.redirectUri\n * @param {string} options.state\n * @param {string} options.brandId\n * @param {string} options.display\n * @param {string} options.prompt\n * @return {string}\n */\n authUrl(options) {\n\n options = options || {};\n\n return this.createUrl(Platform._authorizeEndpoint + '?' + queryStringify({\n 'response_type': 'code',\n 'redirect_uri': options.redirectUri || '',\n 'client_id': this._appKey,\n 'state': options.state || '',\n 'brand_id': options.brandId || '',\n 'display': options.display || '',\n 'prompt': options.prompt || ''\n }), {addServer: true})\n\n }\n\n /**\n * @param {string} url\n * @return {Object}\n */\n parseAuthRedirectUrl(url:string) {\n\n var qs = parseQueryString(url.split('?').reverse()[0]),\n error = qs.error_description || qs.error;\n\n if (error) {\n var e = new Error(error);\n e.error = qs.error;\n throw e;\n }\n\n return qs;\n\n }\n\n /**\n * @return {Promise}\n */\n async loggedIn() {\n\n try {\n await this._ensureAuthentication();\n return true;\n } catch (e) {\n return false;\n }\n\n }\n\n /**\n * @param {string} options.username\n * @param {string} options.password\n * @param {string} options.extension\n * @param {string} options.code\n * @param {string} options.redirectUri\n * @param {string} options.endpointId\n * @returns {Promise}\n */\n async login(options) {\n\n try {\n\n options = options || {};\n\n options.remember = options.remember || false;\n\n this.emit(this.events.beforeLogin);\n\n var body = {\n \"access_token_ttl\": Platform._accessTokenTtl,\n \"refresh_token_ttl\": options.remember ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl\n };\n\n if (!options.code) {\n\n body.grant_type = 'password';\n body.username = options.username;\n body.password = options.password;\n body.extension = options.extension || '';\n\n } else if (options.code) {\n\n body.grant_type = 'authorization_code';\n body.code = options.code;\n body.redirect_uri = options.redirectUri;\n //body.client_id = this.getCredentials().key; // not needed\n\n }\n\n if (options.endpointId) body.endpoint_id = options.endpointId;\n\n var apiResponse = await this._tokenRequest(Platform._tokenEndpoint, body),\n json = apiResponse.json();\n\n this._auth\n .setData(json)\n .setRemember(options.remember);\n\n this.emit(this.events.loginSuccess, apiResponse);\n\n return apiResponse;\n\n } catch (e) {\n\n this._cache.clean();\n\n this.emit(this.events.loginError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n async refresh() {\n\n try {\n\n this.emit(this.events.beforeRefresh);\n\n if (this._queue.isPaused()) {\n\n await this._queue.poll();\n\n if (!this._isAccessTokenValid()) {\n throw new Error('Automatic authentification timeout');\n }\n\n this.emit(this.events.refreshSuccess, null);\n\n return null;\n\n }\n\n this._queue.pause();\n\n // Make sure all existing AJAX calls had a chance to reach the server\n await delay(Platform._refreshDelayMs);\n\n // Perform sanity checks\n if (!this._auth.refreshToken()) throw new Error('Refresh token is missing');\n if (!this._auth.refreshTokenValid()) throw new Error('Refresh token has expired');\n if (!this._queue.isPaused()) throw new Error('Queue was resumed before refresh call');\n\n /** @type {ApiResponse} */\n var res = await this._tokenRequest(Platform._tokenEndpoint, {\n \"grant_type\": \"refresh_token\",\n \"refresh_token\": this._auth.refreshToken(),\n \"access_token_ttl\": Platform._accessTokenTtl,\n \"refresh_token_ttl\": this._auth.remember() ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl\n }),\n json = res.json();\n\n if (!json.access_token) {\n throw this._client.makeError(new Error('Malformed OAuth response'), res);\n }\n\n this._auth.setData(json);\n this._queue.resume();\n\n this.emit(this.events.refreshSuccess, res);\n\n return res;\n\n } catch (e) {\n\n e = this._client.makeError(e);\n\n if (Platform._clearCacheOnRefreshError) {\n this._cache.clean();\n }\n\n this.emit(this.events.refreshError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n async logout() {\n\n try {\n\n this.emit(this.events.beforeLogout);\n\n this._queue.pause();\n\n var res = await this._tokenRequest(Platform._revokeEndpoint, {\n token: this._auth.accessToken()\n });\n\n this._queue.resume();\n this._cache.clean();\n\n this.emit(this.events.logoutSuccess, res);\n\n return res;\n\n } catch (e) {\n\n this._queue.resume();\n\n this.emit(this.events.logoutError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @param {Request} request\n * @param {object} [options]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async inflateRequest(request, options) {\n\n options = options || {};\n\n if (options.skipAuthCheck) return request;\n\n await this._ensureAuthentication();\n\n request.headers.set('Authorization', this._authHeader());\n //request.url = this.createUrl(request.url, {addServer: true}); //FIXME Spec prevents this...\n\n //TODO Add User-Agent here\n\n return request;\n\n }\n\n /**\n * @param {Request} request\n * @param {object} [options]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async sendRequest(request, options) {\n\n try {\n\n request = await this.inflateRequest(request, options);\n\n return (await this._client.sendRequest(request));\n\n } catch (e) {\n\n // Guard is for errors that come from polling\n if (!e.apiResponse || !e.apiResponse.response() || (e.apiResponse.response().status != 401)) throw e;\n\n this._auth.cancelAccessToken();\n\n return (await this.sendRequest(request, options));\n\n }\n\n }\n\n /**\n * General purpose function to send anything to server\n * @param {object} [options.body]\n * @param {string} [options.url]\n * @param {string} [options.method]\n * @param {object} [options.query]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async send(options = {}) {\n\n //FIXME https://github.com/bitinn/node-fetch/issues/43\n options.url = this.createUrl(options.url, {addServer: true});\n\n return await this.sendRequest(this._client.createRequest(options), options);\n\n }\n\n /**\n * @param {string} url\n * @param {object} query\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async get(url, query, options) {\n options = options || {};\n options.method = 'GET';\n options.url = url;\n options.query = query;\n return await this.send(options);\n }\n\n /**\n * @param {string} url\n * @param {object} body\n * @param {object} query\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async post(url, body, query, options) {\n options = options || {};\n options.method = 'POST';\n options.url = url;\n options.query = query;\n options.body = body;\n return await this.send(options);\n }\n\n /**\n * @param {string} url\n * @param {object} body\n * @param {object} query\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async put(url, body, query, options) {\n options = options || {};\n options.method = 'PUT';\n options.url = url;\n options.query = query;\n options.body = body;\n return await this.send(options);\n }\n\n /**\n * @param {string} url\n * @param {string} query\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async 'delete'(url, query, options) {\n options = options || {};\n options.method = 'DELETE';\n options.url = url;\n options.query = query;\n return await this.send(options);\n }\n\n async _tokenRequest(path, body) {\n\n return await this.send({\n url: path,\n skipAuthCheck: true,\n body: body,\n method: 'POST',\n headers: {\n 'Authorization': 'Basic ' + this._apiKey(),\n 'Content-Type': 'application/x-www-form-urlencoded'\n }\n });\n\n }\n\n async _ensureAuthentication() {\n\n if (this._isAccessTokenValid()) return null;\n return await this.refresh();\n\n }\n\n _isAccessTokenValid() {\n\n return (this._auth.accessTokenValid() && !this._queue.isPaused());\n\n }\n\n _apiKey() {\n var apiKey = this._appKey + ':' + this._appSecret;\n return (typeof btoa == 'function') ? btoa(apiKey) : new Buffer(apiKey).toString('base64');\n }\n\n _authHeader() {\n var token = this._auth.accessToken();\n return this._auth.tokenType() + (token ? ' ' + token : '');\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/platform/Platform.js\n **/","import {Promise} from '../core/Externals';\nimport {poll, stopPolling} from '../core/Utils';\n\nexport default class Queue {\n\n static _pollInterval = 250;\n static _releaseTimeout = 5000;\n\n constructor(cache, cacheId) {\n\n this._cache = cache;\n this._cacheId = cacheId;\n this._promise = null;\n\n }\n\n isPaused() {\n\n var storage = this._cache,\n cacheId = this._cacheId,\n time = storage.getItem(cacheId);\n\n return !!time && Date.now() - parseInt(time) < Queue._releaseTimeout;\n }\n\n pause() {\n this._cache.setItem(this._cacheId, Date.now());\n return this;\n }\n\n resume() {\n this._cache.removeItem(this._cacheId);\n return this;\n }\n\n poll() {\n\n if (this._promise) return this._promise;\n\n this._promise = new Promise((resolve, reject) => {\n\n poll((next) => {\n\n if (this.isPaused()) return next();\n\n this._promise = null;\n\n this.resume(); // this is actually not needed but why not\n\n resolve(null);\n\n }, Queue._pollInterval);\n\n });\n\n return this._promise;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/platform/Queue.js\n **/","export default class Auth {\n\n static refreshHandicapMs:number = 60 * 1000; // 1 minute\n static forcedTokenType = 'forced';\n\n constructor(cache, cacheId:string) {\n\n /** @type {Cache} */\n this._cache = cache;\n this._cacheId = cacheId;\n\n }\n\n accessToken() {\n return this.data().access_token;\n }\n\n refreshToken() {\n return this.data().refresh_token;\n }\n\n tokenType() {\n return this.data().token_type;\n }\n\n /**\n * @return {{token_type: string, access_token: string, expires_in: number, refresh_token: string, refresh_token_expires_in: number}}\n */\n data() {\n\n return this._cache.getItem(this._cacheId) || {\n token_type: '',\n access_token: '',\n expires_in: 0,\n refresh_token: '',\n refresh_token_expires_in: 0\n };\n\n }\n\n /**\n * @param {object} newData\n * @return {Auth}\n */\n setData(newData) {\n\n newData = newData || {};\n\n var data = this.data();\n\n Object.keys(newData).forEach((key) => {\n data[key] = newData[key];\n });\n\n data.expire_time = Date.now() + (data.expires_in * 1000);\n data.refresh_token_expire_time = Date.now() + (data.refresh_token_expires_in * 1000);\n\n this._cache.setItem(this._cacheId, data);\n\n return this;\n\n }\n\n /**\n * Check if there is a valid (not expired) access token\n * @return {boolean}\n */\n accessTokenValid() {\n\n var authData = this.data();\n return (authData.token_type === Auth.forcedTokenType || (authData.expire_time - Auth.refreshHandicapMs > Date.now()));\n\n }\n\n /**\n * Check if there is a valid (not expired) access token\n * @return {boolean}\n */\n refreshTokenValid() {\n\n return (this.data().refresh_token_expire_time > Date.now());\n\n }\n\n /**\n * @return {Auth}\n */\n cancelAccessToken() {\n\n return this.setData({\n access_token: '',\n expires_in: 0\n });\n\n }\n\n /**\n * This method sets a special authentication mode used in Service Web\n * @return {Auth}\n */\n forceAuthentication() {\n\n this.setData({\n token_type: Auth.forcedTokenType,\n access_token: '',\n expires_in: 0,\n refresh_token: '',\n refresh_token_expires_in: 0\n });\n\n return this;\n\n }\n\n /**\n * @param remember\n * @return {Auth}\n */\n setRemember(remember) {\n\n return this.setData({remember: remember});\n\n }\n\n /**\n * @return {boolean}\n */\n remember() {\n\n return !!this.data().remember;\n\n }\n\n}\n\n//export interface IAuthData {\n// remember?:boolean;\n// token_type?:string;\n// access_token?:string;\n// expires_in?:number; // actually it's string\n// expire_time?:number;\n// refresh_token?:string;\n// refresh_token_expires_in?:number; // actually it's string\n// refresh_token_expire_time?:number;\n// scope?:string;\n//}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/platform/Auth.js\n **/","import PubnubMock from './PubnubMock.js';\nimport {PUBNUB} from '../core/Externals';\n\nexport default class PubnubMockFactory {\n\n constructor() {\n this.crypto_obj = PUBNUB.crypto_obj;\n }\n\n init(options:PUBNUBInitOptions) {\n return new PubnubMock(options);\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/pubnub/PubnubFactory.js\n **/","import Observable from '../core/Observable';\nimport {PUBNUB} from '../core/Externals';\n\nexport default class PubnubMock extends Observable {\n\n constructor(options) {\n super();\n this.options = options;\n this.crypto_obj = PUBNUB.crypto_obj;\n }\n\n ready() {}\n\n subscribe(options:PUBNUBSubscribeOptions) {\n this.on('message-' + options.channel, options.message);\n }\n\n unsubscribe(options:PUBNUBUnsubscribeOptions) {\n this.off('message-' + options.channel);\n }\n\n receiveMessage(msg, channel) {\n this.emit('message-' + channel, msg, 'env', channel);\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/pubnub/PubnubMock.js\n **/","import Observable from '../core/Observable';\nimport Client from '../http/Client';\nimport {poll, stopPolling} from '../core/Utils';\n\nexport default class Subscription extends Observable {\n\n static _renewHandicapMs = 2 * 60 * 1000;\n static _pollInterval = 10 * 1000;\n\n events = {\n notification: 'notification',\n removeSuccess: 'removeSuccess',\n removeError: 'removeError',\n renewSuccess: 'renewSuccess',\n renewError: 'renewError',\n subscribeSuccess: 'subscribeSuccess',\n subscribeError: 'subscribeError'\n };\n\n constructor(pubnubFactory, platform, cache) {\n\n super();\n\n this._pubnubFactory = pubnubFactory;\n this._platform = platform;\n this._cache = cache;\n this._pubnub = null;\n this._timeout = null;\n this._subscription = {};\n\n }\n\n /**\n * @return {boolean}\n */\n alive() {\n\n return !!(this._subscription.id &&\n this._subscription.deliveryMode &&\n this._subscription.deliveryMode.subscriberKey &&\n this._subscription.deliveryMode.address &&\n Date.now() < this.expirationTime());\n\n }\n\n expirationTime() {\n return new Date(this._subscription.expirationTime || 0).getTime() - Subscription._renewHandicapMs;\n }\n\n setSubscription(subscription) {\n\n subscription = subscription || {};\n\n this._clearTimeout();\n\n this._subscription = subscription;\n\n if (!this._pubnub) this._subscribeAtPubnub();\n\n this._setTimeout();\n\n return this;\n\n }\n\n subscription() {\n return this._subscription;\n }\n\n /**\n * Creates or updates subscription if there is an active one\n * @param {{events?:string[]}} [options] New array of events\n * @returns {Promise}\n */\n async register(options) {\n\n if (this.alive()) {\n return await this.renew(options);\n } else {\n return await this.subscribe(options);\n }\n\n }\n\n eventFilters() {\n return this._subscription.eventFilters || [];\n }\n\n /**\n * @param {string[]} events\n * @return {Subscription}\n */\n addEventFilters(events) {\n this.setEventFilters(this.eventFilters().concat(events));\n return this;\n }\n\n /**\n * @param {string[]} events\n * @return {Subscription}\n */\n setEventFilters(events) {\n this._subscription.eventFilters = events;\n return this;\n }\n\n /**\n * @param {{events?:string[]}} [options] New array of events\n * @returns {Promise}\n */\n async subscribe(options) {\n\n try {\n\n options = options || {};\n\n if (options.events) this.setEventFilters(options.events);\n\n this._clearTimeout();\n\n if (!this.eventFilters().length) throw new Error('Events are undefined');\n\n var response = await this._platform.post('/restapi/v1.0/subscription', {\n eventFilters: this._getFullEventFilters(),\n deliveryMode: {\n transportType: 'PubNub'\n }\n }),\n json = response.json();\n\n this.setSubscription(json)\n .emit(this.events.subscribeSuccess, response);\n\n return response;\n\n\n } catch (e) {\n\n e = this._platform.client().makeError(e);\n\n this.reset()\n .emit(this.events.subscribeError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @param {{events?:string[]}} [options] New array of events\n * @returns {Promise}\n */\n async renew(options) {\n\n try {\n\n options = options || {};\n\n if (options.events) this.setEventFilters(options.events);\n\n this._clearTimeout();\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n if (!this.eventFilters().length) throw new Error('Events are undefined');\n\n var response = await this._platform.put('/restapi/v1.0/subscription/' + this._subscription.id, {\n eventFilters: this._getFullEventFilters()\n });\n\n var json = response.json();\n\n this.setSubscription(json)\n .emit(this.events.renewSuccess, response);\n\n return response;\n\n } catch (e) {\n\n e = this._platform.client().makeError(e);\n\n this.reset()\n .emit(this.events.renewError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n async remove() {\n\n try {\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n var response = await this._platform.delete('/restapi/v1.0/subscription/' + this._subscription.id);\n\n this.reset()\n .emit(this.events.removeSuccess, response);\n\n return response;\n\n } catch (e) {\n\n e = this._platform.client().makeError(e);\n\n this.emit(this.events.removeError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * Remove subscription and disconnect from PUBNUB\n * This method resets subscription at client side but backend is not notified\n */\n reset() {\n this._clearTimeout();\n if (this.alive() && this._pubnub) this._pubnub.unsubscribe({channel: this._subscription.deliveryMode.address});\n this._subscription = {};\n return this;\n }\n\n /**\n *\n * @param {string} cacheKey\n * @param {string[]} events\n * @return {Subscription}\n */\n restoreFromCache(cacheKey, events) {\n\n this.on([this.events.subscribeSuccess, this.events.renewSuccess], () => {\n\n this._cache.setItem(cacheKey, this.subscription());\n\n });\n\n this.on(this.events.renewError, () => {\n\n this.reset()\n .setEventFilters(events)\n .register();\n\n });\n\n var cachedSubscriptionData = this._cache.getItem(cacheKey);\n\n if (cachedSubscriptionData) {\n try {\n this.setSubscription(cachedSubscriptionData);\n } catch (e) {}\n } else {\n this.setEventFilters(events);\n }\n\n return this;\n\n }\n\n _getFullEventFilters() {\n\n return this.eventFilters().map((event) => {\n return this._platform.createUrl(event);\n });\n\n }\n\n _setTimeout() {\n\n this._clearTimeout();\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n poll((next)=> {\n\n if (this.alive()) return next();\n\n this.renew();\n\n }, Subscription._pollInterval, this._timeout);\n\n return this;\n\n }\n\n _clearTimeout() {\n\n stopPolling(this._timeout);\n\n return this;\n\n }\n\n _decrypt(message:any) {\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n if (this._subscription.deliveryMode.encryptionKey) {\n\n var PUBNUB = this._pubnubFactory;\n\n message = PUBNUB.crypto_obj.decrypt(message, this._subscription.deliveryMode.encryptionKey, {\n encryptKey: false,\n keyEncoding: 'base64',\n keyLength: 128,\n mode: 'ecb'\n });\n\n }\n\n return message;\n\n }\n\n _notify(message:any) {\n\n this.emit(this.events.notification, this._decrypt(message));\n\n return this;\n\n }\n\n _subscribeAtPubnub():Subscription {\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n var PUBNUB = this._pubnubFactory;\n\n this._pubnub = PUBNUB.init({\n ssl: true,\n subscribe_key: this._subscription.deliveryMode.subscriberKey\n });\n\n this._pubnub.ready();\n\n this._pubnub.subscribe({\n channel: this._subscription.deliveryMode.address,\n message: this._notify.bind(this),\n connect: () => {}\n });\n\n return this;\n\n }\n\n}\n\n//export interface ISubscription {\n// id?:string;\n// uri?: string;\n// eventFilters?:string[];\n// expirationTime?:string; // 2014-03-12T19:54:35.613Z\n// expiresIn?:number;\n// deliveryMode?: {\n// transportType?:string;\n// encryption?:boolean;\n// address?:string;\n// subscriberKey?:string;\n// encryptionKey?:string;\n// secretKey?:string;\n// };\n// creationTime?:string; // 2014-03-12T19:54:35.613Z\n// status?:string; // Active\n//}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/subscription/Subscription.js\n **/","/**\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 // This invoke function is written in a style that assumes some\n // calling function (or Promise) will handle exceptions.\n function invoke(method, arg) {\n var result = generator[method](arg);\n var value = result.value;\n return value instanceof AwaitArgument\n ? Promise.resolve(value.arg).then(invokeNext, invokeThrow)\n : 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 return result;\n });\n }\n\n if (typeof process === \"object\" && process.domain) {\n invoke = process.domain.bind(invoke);\n }\n\n var invokeNext = invoke.bind(generator, \"next\");\n var invokeThrow = invoke.bind(generator, \"throw\");\n var invokeReturn = invoke.bind(generator, \"return\");\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return invoke(method, arg);\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 ) : new Promise(function (resolve) {\n resolve(callInvokeWithMethodAndArg());\n });\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\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/regenerator/runtime.js\n ** module id = 25\n ** module chunks = 0\n **/"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 376cc765ad2cf3304422","webpack:///./src/SDK.js","webpack:///./src/core/Utils.js","webpack:///./src/core/Externals.js","webpack:///./bower_components/es6-promise/promise.js","webpack:///(webpack)/~/node-libs-browser/~/timers-browserify/main.js","webpack:///(webpack)/~/node-libs-browser/~/process/browser.js","webpack:///(webpack)/buildin/module.js","webpack:///(webpack)/buildin/amd-define.js","webpack:///./bower_components/fetch/fetch.js","webpack:///./bower_components/pubnub/web/pubnub.js","webpack:///./src/core/Cache.js","webpack:///./src/core/Observable.js","webpack:///./src/core/Queue.js","webpack:///./src/http/Client.js","webpack:///./src/http/Utils.js","webpack:///./src/http/ApiResponse.js","webpack:///./src/mocks/ClientMock.js","webpack:///./src/mocks/Registry.js","webpack:///./src/mocks/Mock.js","webpack:///./src/platform/Platform.js","webpack:///./src/platform/Auth.js","webpack:///./src/pubnub/PubnubFactory.js","webpack:///./src/pubnub/PubnubMock.js","webpack:///./src/subscription/Subscription.js","webpack:///./src/subscription/CachedSubscription.js","webpack:///./~/regenerator/runtime.js"],"names":[],"mappings":"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AY,KAAK,WAAW,GAAI,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;;;;;;;8CCf9F;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA,2CAA2C;AAC3C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,2EAA2E;;AAE3E;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,8BAA8B,sBAAsB;;AAEpD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qBAAqB,+BAA+B;AACpD;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,uBAAuB,QAAQ;AAC/B;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,SAAS;AACT,uBAAuB,QAAQ;AAC/B;;AAEA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,kEAAkE,QAAQ;;AAE1E;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,kEAAkE,QAAQ;AAC1E;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,qCAAqC,QAAQ;;AAE7C;;AAEA,qBAAqB,wBAAwB;AAC7C;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;;AAEA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,qBAAqB,qEAAqE;AAC1F;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,qBAAqB,qEAAqE;AAC1F;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;;AAEA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,OAAO;AACP;;AAEA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;;AAEA;AACA,cAAc,SAAS;AACvB,cAAc,SAAS;AACvB;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA,cAAc,SAAS;AACvB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,oDAAyB,wCAAwC,EAAE;AACnE,KAAK;AACL;AACA,KAAK;AACL;AACA;;AAEA;AACA,CAAC;;;;;;;;;ACt8BD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,iBAAiB;;AAE5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA,E;;;;;;;AC3EA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,uBAAuB,sBAAsB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,2BAA2B;AAC3B;AACA;AACA;AACA,4BAA4B,UAAU;;;;;;;AC1FtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACTA,6BAA6B,mDAAmD;;;;;;;ACAhF;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP,KAAK;AACL;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA,KAAK;AACL;AACA;AACA,CAAC;;;;;;;AC5VD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,0CAA0C;;AAE1C;AACA,kBAAkB;AAClB,kBAAkB;AAClB;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,2BAA2B,YAAY;AACvC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,YAAY;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,0CAA0C;AAC1C,wBAAwB;AACxB,iCAAiC,MAAM,0BAA0B;AACjE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,2BAA2B,WAAW;AACtC;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,UAAU;AACtC;AACA;;AAEA;AACA;AACA,yCAAyC;AACzC;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,UAAU;;AAElC;AACA;AACA;AACA,mBAAmB;AACnB,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;AAGD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,6CAA6C,kBAAkB;AAC/D;AACA;AACA;AACA,mCAAmC,wBAAwB;AAC3D;AACA;;AAEA;AACA;AACA;AACA,gCAAgC,KAAK,KAAK,gBAAgB;AAC1D;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kCAAkC,EAAE;AACpC;AACA;AACA;;AAEA;AACA,sCAAsC,OAAO;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,4CAA4C,kBAAkB;AAC9D;AACA;AACA;AACA,wCAAwC,wBAAwB;AAChE;AACA;;;AAGA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,uBAAuB;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA,kBAAkB;AAClB;AACA;AACA,2CAA2C,YAAY;AACvD,CAAC,WAAW;;AAEZ;AACA,mBAAmB,YAAY;AAC/B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D,2DAA2D;AAC3D,gDAAgD,mBAAmB;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,wCAAwC,UAAU;AAClD,wCAAwC;AACxC;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B,uCAAuC;AACrE;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,mCAAmC;AACnC,SAAS;;AAET;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,mCAAmC;AACnC,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;;AAEb;;AAEA;AACA;AACA;;AAEA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;;;;AAIA;AACA;;;;;AAKA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;;AAGA;AACA;AACA;AACA,0CAA0C,yEAAyE;AACnH;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA,SAAS;AACT;;AAEA,0BAA0B;AAC1B;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;;AAEA;AACA,SAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,SAAS;;AAET;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA,SAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA,8CAA8C;AAC9C,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,iEAAiE;AAC9F;AACA;AACA;AACA;AACA,mCAAmC,qBAAqB;AACxD;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;;AAET;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,uCAAuC,kCAAkC;AACzE;AACA;AACA,aAAa;AACb,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA,uCAAuC,EAAE;AACzC;AACA;AACA;;AAEA,wBAAwB;;AAExB;;AAEA;AACA;AACA;AACA;AACA;AACA,+CAA+C,wBAAwB;AACvE,uCAAuC;AACvC,aAAa;AACb,SAAS;;AAET;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sBAAsB;;AAEtB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;;AAEb;AACA;AACA,SAAS;;AAET;AACA,gCAAgC,sBAAsB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B;;AAE9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,iBAAiB;;;AAG/D,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,iBAAiB;;AAE/D,iBAAiB;AACjB;;AAEA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA,8CAA8C;AAC9C,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,qBAAqB;;AAErB;AACA;;AAEA;AACA;AACA;AACA;AACA,sDAAsD,mCAAmC;AACzF;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA,6BAA6B,kBAAkB,EAAE;AACjD;AACA,qBAAqB;AACrB,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;;AAErB;AACA;;AAEA;AACA;AACA;AACA;AACA,4DAA4D,mCAAmC;AAC/F;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA,6BAA6B,wBAAwB,EAAE;AACvD;AACA,qBAAqB;AACrB,iBAAiB;AACjB;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,qBAAqB;AACrB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,4CAA4C,mCAAmC;;AAE/E;AACA;AACA;;;AAGA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,6BAA6B;AAC7B;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;AACA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA,6BAA6B;AAC7B;AACA,qFAAqF;AACrF;AACA;AACA,oDAAoD,aAAa;AACjE,uCAAuC;AACvC;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,+FAA+F;AAC/F,iCAAiC;AACjC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,SAAS;;AAET;AACA,6BAA6B,sCAAsC;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;;AAE5B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,+BAA+B,0BAA0B;;AAEzD;AACA;AACA,iE;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb,SAAS;;AAET;AACA,6CAA6C,sCAAsC;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;;AAE5B;AACA;AACA;;AAEA,+BAA+B,0BAA0B;;AAEzD;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,oBAAoB;;AAEhE;AACA;AACA;AACA;;AAEA,+BAA+B,0BAA0B;;AAEzD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;;AAEA,aAAa;;AAEb,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,0BAA0B;AACzD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,sBAAsB;;AAEtB;AACA;AACA,aAAa;AACb;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;;AAEb,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,wBAAwB;AACxB,+BAA+B,0BAA0B;AACzD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,4BAA4B;;AAE5B;AACA;;AAEA;;AAEA,+BAA+B,0BAA0B;;AAEzD;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,+CAA+C,8BAA8B;AAC7E,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC,gBAAgB,6DAA6D;AAC7E,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yFAAyF,uBAAuB;AAChH;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,yBAAyB,eAAe,uBAAuB;AAC5H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA,sBAAsB,yBAAyB;AAC/C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,YAAY;AACjB;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA,cAAc,sCAAsC;AACpD;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA,0BAA0B;;;AAG1B;AACA;AACA;AACA;AACA;AACA,qBAAqB;;;;AAIrB;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,iDAAiD,eAAe;AAChE;AACA;AACA;AACA;AACA,iBAAiB;AACjB,iCAAiC,yBAAyB;AAC1D;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,wCAAwC,SAAS,sBAAsB,EAAE;AACzE;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;;AAEA;;AAEA,iCAAiC;AACjC;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,uBAAuB,4CAA4C;AACnE,uBAAuB,gBAAgB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,SAAS,sBAAsB,EAAE;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,kDAAkD;AAClD,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,iBAAiB,gEAAgE,EAAE;AACtH;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf,eAAe;AACf;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;;AAE3B;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;;;AAGvC;AACA;AACA,+DAA+D,8BAA8B;AAC7F;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,2CAA2C;;AAE3C;AACA;AACA;AACA;AACA;AACA,qCAAqC,sBAAsB;AAC3D;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,YAAY,2CAA2C;;AAEvD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,+BAA+B;AAC/B,8BAA8B,0BAA0B,EAAE;AAC1D;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,CAAC;AACD;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2BAA2B;AAC3B,2BAA2B;AAC3B,2BAA2B;AAC3B,2BAA2B;;AAE3B;AACA,wCAAwC,0BAA0B;AAClE,wCAAwC;AACxC,wCAAwC;AACxC,wCAAwC;AACxC,wCAAwC;AACxC,wCAAwC;AACxC,wCAAwC;;AAExC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA,+BAA+B,mBAAmB;AAClD,SAAS;AACT;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,oBAAoB;AAChD;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA,gCAAgC,2CAA2C;AAC3E;AACA,sBAAsB;AACtB;;AAEA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,QAAQ,WAAW,eAAe,WAAW,mBAAmB,iBAAiB,YAAY,cAAc,6CAA6C,oCAAoC,EAAE,mBAAmB,cAAc,SAAS,mBAAmB,oBAAoB,0BAA0B,SAAS,kBAAkB,mBAAmB,mDAAmD,yDAAyD,kBAAkB,yCAAyC;AACniB,wBAAwB,mBAAmB,mBAAmB,gCAAgC,sBAAsB,6BAA6B,oBAAoB,2CAA2C,aAAa,aAAa,mBAAmB,IAAI,4DAA4D,+BAA+B,IAAI,yBAAyB,uBAAuB,iBAAiB,YAAY,kBAAkB,iCAAiC;AAChe,WAAW,qBAAqB,kBAAkB,yBAAyB,4BAA4B,SAAS,oBAAoB,iBAAiB,IAAI,qCAAqC,wBAAwB,YAAY,UAAU,sBAAsB,cAAc,aAAa,iBAAiB,IAAI,KAAK,gCAAgC,6BAA6B,4BAA4B,kBAAkB,mBAAmB,4BAA4B,IAAI;AACrd,mBAAmB,0BAA0B,aAAa,sBAAsB,cAAc,aAAa,iBAAiB,IAAI,2DAA2D,kBAAkB,mBAAmB,4BAA4B,IAAI,gDAAgD,wBAAwB,WAAW,sBAAsB,IAAI,kDAAkD,SAAS,sCAAsC,mBAAmB,iDAAiD;AAClhB,qCAAqC,iBAAiB,sBAAsB,mBAAmB,qBAAqB,mCAAmC,qBAAqB,6BAA6B,sBAAsB,oHAAoH,MAAM,eAAe,MAAM,YAAY,IAAI,+BAA+B,gBAAgB,cAAc,uBAAuB,kBAAkB;AACpe,2BAA2B,SAAS,kBAAkB,EAAE,mBAAmB,gCAAgC,4BAA4B,aAAa,kBAAkB,mBAAmB,gBAAgB,oBAAoB,gBAAgB,gBAAgB,YAAY,sBAAsB,mBAAmB,0BAA0B,wCAAwC,qBAAqB,mCAAmC,+BAA+B,qBAAqB;AAChe,kBAAkB,EAAE,gBAAgB,SAAS;;AAE7C;AACA,aAAa,qFAAqF,8BAA8B,SAAS,KAAK,EAAE,MAAM,GAAG,IAAI,wBAAwB,KAAK,eAAe,KAAK,QAAQ,KAAK,0DAA0D,IAAI,8BAA8B,oBAAoB,kCAAkC,+BAA+B,uFAAuF,KAAK,KAAK;AAC7e,SAAS,KAAK,uBAAuB,gGAAgG,sEAAsE,8DAA8D,IAAI,IAAI,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ,cAAc,cAAc,cAAc,cAAc,cAAc,cAAc,cAAc,cAAc,wBAAwB;AACzb,uBAAuB,0CAA0C,sBAAsB,sBAAsB,gBAAgB,kBAAkB,kBAAkB,yBAAyB,2BAA2B,UAAU,EAAE,4BAA4B,oCAAoC;;AAEjS;AACA,YAAY,4BAA4B,+BAA+B,mBAAmB,0BAA0B,mCAAmC,wBAAwB,gCAAgC,UAAU,8EAA8E,IAAI,qCAAqC,wBAAwB,aAAa,kBAAkB,mBAAmB,UAAU,qBAAqB,oBAAoB,uBAAuB,YAAY,sBAAsB;AACtgB,aAAa,gBAAgB,UAAU,iDAAiD,EAAE;;AAE1F;AACA,YAAY,iCAAiC,cAAc,sBAAsB,uCAAuC,UAAU,KAAK,YAAY,IAAI,wHAAwH,gBAAgB,qCAAqC,uBAAuB,WAAW,WAAW,kBAAkB,mBAAmB,0CAA0C,iCAAiC,qBAAqB;AACtf,EAAE,YAAY,6EAA6E,4BAA4B,IAAI,qBAAqB,2EAA2E;;AAE3N;AACA,aAAa,0BAA0B,mBAAmB,wBAAwB,0BAA0B,mBAAmB,wBAAwB,0BAA0B,gBAAgB,wBAAwB,0BAA0B,mBAAmB,wBAAwB,sEAAsE,KAAK,wCAAwC,kBAAkB,oBAAoB,oEAAoE;AAC3f,8BAA8B,YAAY,KAAK,KAAK,iBAAiB,qDAAqD;AAC1H;AACA;AACA,iUAAiU,cAAc,cAAc,cAAc,cAAc,wBAAwB,+DAA+D,uBAAuB;AACve,YAAY,oEAAoE,oEAAoE,0BAA0B,gBAAgB,aAAa,UAAU,QAAQ,IAAI,gEAAgE,SAAS,kBAAkB,yBAAyB,2BAA2B,UAAU,EAAE,yBAAyB,iCAAiC;AACtb,YAAY,4EAA4E,cAAc,oCAAoC,mBAAmB,4BAA4B,uBAAuB,yFAAyF,WAAW,EAAE,eAAe,8BAA8B,UAAU,YAAY,IAAI,8BAA8B,YAAY,eAAe,UAAU,EAAE,yBAAyB;AAC3d,IAAI;;AAEJ;AACA,iCAAiC,6HAA6H,6CAA6C,6CAA6C,+BAA+B,6CAA6C,sBAAsB,4BAA4B,kBAAkB,YAAY,aAAa,kBAAkB,mBAAmB,gBAAgB,qBAAqB,gBAAgB,uBAAuB;AAClhB,qBAAqB,mBAAmB,0BAA0B,kFAAkF,OAAO,wBAAwB,gDAAgD,yBAAyB,mDAAmD,EAAE,yBAAyB,uBAAuB,yBAAyB,aAAa,EAAE,eAAe,mBAAmB,eAAe,+BAA+B,YAAY,IAAI;AACze,KAAK,gCAAgC,8BAA8B,kCAAkC,+BAA+B,kCAAkC,oBAAoB,eAAe,YAAY,YAAY,sBAAsB,2BAA2B,iCAAiC,mBAAmB,oBAAoB,gCAAgC,EAAE,sBAAsB,2BAA2B,kDAAkD,oBAAoB;AACnf,OAAO,mBAAmB,EAAE,UAAU,WAAW,SAAS,kBAAkB,6DAA6D,IAAI,eAAe,gBAAgB,YAAY,mBAAmB,4CAA4C,wBAAwB,kBAAkB,iBAAiB,mBAAmB,mBAAmB,+BAA+B,iEAAiE,+CAA+C;AACve,iBAAiB,+BAA+B,6BAA6B,wBAAwB,uBAAuB,0CAA0C,iCAAiC,wBAAwB,oCAAoC,SAAS,aAAa,EAAE,+BAA+B,iBAAiB,cAAc,sBAAsB,2CAA2C,gBAAgB,WAAW,sBAAsB,mBAAmB,SAAS;AACve,gDAAgD,mBAAmB,aAAa,cAAc,uCAAuC,6BAA6B,cAAc,eAAe,iBAAiB,oBAAoB,GAAG,kCAAkC,cAAc,SAAS,4BAA4B,qBAAqB,6BAA6B,gBAAgB,QAAQ,iBAAiB,8GAA8G,EAAE;AACvgB,0BAA0B,qBAAqB,0BAA0B,qDAAqD,sBAAsB,4CAA4C,aAAa,WAAW,0BAA0B,mBAAmB,YAAY,YAAY,eAAe,iCAAiC,eAAe,iBAAiB,kBAAkB,GAAG,mCAAmC,kBAAkB,MAAM,4BAA4B,qBAAqB;AAC9e,oBAAoB,UAAU,mCAAmC,WAAW,SAAS,2BAA2B,qBAAqB,0BAA0B,6CAA6C,UAAU,yCAAyC,EAAE;;AAEjQ;AACA,YAAY,2GAA2G,MAAM,6BAA6B,oBAAoB,MAAM,KAAK,6CAA6C,OAAO,OAAO,+CAA+C,iBAAiB,kBAAkB,iBAAiB,OAAO,sCAAsC,iBAAiB,kBAAkB,iBAAiB,OAAO,sCAAsC;AACre,sCAAsC,oBAAoB,oGAAoG,IAAI,qBAAqB,KAAK,aAAa,yKAAyK,cAAc,0BAA0B,QAAQ,IAAI;AACta,oBAAoB,4BAA4B,oDAAoD,4BAA4B,aAAa,cAAc,SAAS,uDAAuD,SAAS,cAAc,SAAS,yCAAyC,sFAAsF,IAAI;AAC9X,wHAAwH,oEAAoE,oEAAoE,oEAAoE,oEAAoE,OAAO,SAAS,SAAS,SAAS,WAAW,EAAE,yBAAyB;;AAEhd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,CAAC,IAAI,2B;;;;;;;;;;;;;;;IC36FgB,KAAK;iBAAL,KAAK;;eAEC,KAAK;;;;AAEjB,aAJM,KAAK,CAIV,OAAO,EAAE,MAAM,EAAE;8BAJZ,KAAK;;AAKlB,YAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AACvB,YAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;KAC3B;;AAPgB,SAAK,WAStB,SAAS,sBAAC,MAAM,EAAE;AACd,YAAI,CAAC,OAAO,GAAG,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC;AAC7C,eAAO,IAAI,CAAC;KACf;;AAZgB,SAAK,WActB,OAAO,oBAAC,GAAG,EAAE,IAAI,EAAE;AACf,YAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAC3D,eAAO,IAAI,CAAC;KACf;;AAjBgB,SAAK,WAmBtB,UAAU,uBAAC,GAAG,EAAE;AACZ,eAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3C,eAAO,IAAI,CAAC;KACf;;AAtBgB,SAAK,WAwBtB,OAAO,oBAAC,GAAG,EAAE;AACT,YAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/C,YAAI,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC;AACvB,eAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;KAC3B;;AA5BgB,SAAK,WA8BtB,KAAK,oBAAG;;AAEJ,aAAK,IAAI,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE;;AAE3B,gBAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,SAAS;;AAEjD,gBAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACjC,uBAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;aAC7B;SAEJ;;AAED,eAAO,IAAI,CAAC;KAEf;;AA5CgB,SAAK,WA8CtB,UAAU,uBAAC,GAAG,EAAE;AACZ,eAAO,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;KAC7B;;WAhDgB,KAAK;;;qBAAL,KAAK;;;;;;;;;;;;;ICAL,UAAU;AAEhB,aAFM,UAAU,GAEb;8BAFG,UAAU;;AAGvB,YAAI,CAAC,GAAG,EAAE,CAAC;KACd;;AAJgB,cAAU,WAM3B,YAAY,yBAAC,KAAK,EAAE;AAChB,eAAQ,KAAK,IAAI,IAAI,CAAC,UAAU,CAAE;KACrC;;AARgB,cAAU,WAU3B,EAAE,eAAC,MAAM,EAAE,QAAQ,EAAE;;;AAEjB,YAAI,OAAO,MAAM,IAAI,QAAQ,EAAE,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC;AACjD,YAAI,CAAC,MAAM,EAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;AAC1D,YAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;;AAEnF,cAAM,CAAC,OAAO,CAAC,UAAC,KAAK,EAAK;;AAEtB,gBAAI,CAAC,MAAK,YAAY,CAAC,KAAK,CAAC,EAAE,MAAK,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;;AAE3D,kBAAK,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SAEzC,CAAC,CAAC;;AAEH,eAAO,IAAI,CAAC;KAEf;;AA1BgB,cAAU,WA4B3B,IAAI,iBAAC,KAAK,EAAW;;;0CAAN,IAAI;AAAJ,gBAAI;;;AAEf,YAAI,MAAM,GAAG,IAAI,CAAC;;AAElB,YAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,OAAO,IAAI,CAAC;;AAE3C,YAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAC,QAAQ,EAAK;;AAEtC,kBAAM,GAAG,QAAQ,CAAC,KAAK,SAAO,IAAI,CAAC,CAAC;AACpC,mBAAQ,MAAM,KAAK,KAAK,CAAE;SAE7B,CAAC,CAAC;;AAEH,eAAO,MAAM,CAAC;KAEjB;;AA3CgB,cAAU,WA6C3B,GAAG,gBAAC,KAAK,EAAE,QAAQ,EAAE;;;AAEjB,YAAI,CAAC,KAAK,EAAE;;AAER,gBAAI,CAAC,UAAU,GAAG,EAAE,CAAC;SAExB,MAAM;;AAEH,gBAAI,CAAC,QAAQ,EAAE;;AAEX,uBAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;aAEjC,MAAM;;AAEH,oBAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,OAAO,IAAI,CAAC;;AAE3C,oBAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,UAAC,EAAE,EAAE,CAAC,EAAK;;AAEtC,wBAAI,EAAE,KAAK,QAAQ,EAAE,OAAO,OAAK,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;iBAEzD,CAAC,CAAC;aAEN;SAEJ;;AAED,eAAO,IAAI,CAAC;KAEf;;WAzEgB,UAAU;;;qBAAV,UAAU;;;;;;;;;;;;;;;yCCAT,CAAmB;;iCACT,CAAS;;IAEpB,KAAK;iBAAL,KAAK;;eAEC,GAAG;;;;eACD,IAAI;;;;AAElB,aALM,KAAK,CAKV,KAAK,EAAE,OAAO,EAAE;8BALX,KAAK;;AAOlB,YAAI,CAAC,MAAM,GAAG,KAAK,CAAC;AACpB,YAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;AACxB,YAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;KAExB;;AAXgB,SAAK,WAatB,QAAQ,uBAAG;;AAEP,YAAI,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;;AAE9C,eAAO,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,eAAe,CAAC;KACxE;;AAlBgB,SAAK,WAoBtB,KAAK,oBAAG;AACJ,YAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AAC/C,eAAO,IAAI,CAAC;KACf;;AAvBgB,SAAK,WAyBtB,MAAM,qBAAG;AACL,YAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACtC,eAAO,IAAI,CAAC;KACf;;AA5BgB,SAAK,WA8BtB,IAAI,mBAAG;;;AAEH,YAAI,IAAI,CAAC,QAAQ,EAAE,OAAO,IAAI,CAAC,QAAQ,CAAC;;AAExC,YAAI,CAAC,QAAQ,GAAG,2BAAY,UAAC,OAAO,EAAE,MAAM,EAAK;;AAE7C,wBAAK,UAAC,IAAI,EAAK;;AAEX,oBAAI,MAAK,QAAQ,EAAE,EAAE,OAAO,IAAI,EAAE,CAAC;;AAEnC,sBAAK,QAAQ,GAAG,IAAI,CAAC;;AAErB,sBAAK,MAAM,EAAE,CAAC;;AAEd,uBAAO,CAAC,IAAI,CAAC,CAAC;aAEjB,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;SAE3B,CAAC,CAAC;;AAEH,eAAO,IAAI,CAAC,QAAQ,CAAC;KAExB;;WApDgB,KAAK;;;qBAAL,KAAK;;;;;;;;;;;;;;;;;;;yCCH+B,CAAmB;;qCAC/C,CAAe;;iCACf,EAAS;;0CACf,EAAoB;;;;uCACnB,EAAe;;;;IAElB,MAAM;cAAN,MAAM;;aAAN,MAAM;8BAAN,MAAM;;;;aAIvB,MAAM,GAAG;AACL,yBAAa,EAAE,eAAe;AAC9B,0BAAc,EAAE,gBAAgB;AAChC,wBAAY,EAAE,cAAc;SAC/B;;;;;;;;;;;;;;;AARgB,UAAM,WAcjB,WAAW,wBAAC,OAAO;YAEjB,WAAW;;;;AAAX,+BAAW,GAAG,6BAAgB,OAAO,CAAC;;;;AAKtC,wBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;;;oDAEpB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;;;AAAzD,+BAAW,CAAC,SAAS;;0BAEjB,WAAW,CAAC,YAAY,EAAE,IAAI,WAAW,CAAC,OAAO,EAAE;;;;;;oDACzB,WAAW,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE;;;AAAvD,+BAAW,CAAC,KAAK;;;wBAGhB,WAAW,CAAC,EAAE,EAAE;;;;;0BAAQ,IAAI,KAAK,CAAC,kCAAkC,CAAC;;;;AAE1E,wBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;;wDAE5C,WAAW;;;;;;AAIlB,wBAAI,CAAC,eAAE,WAAW,EAAE,iBAAI,IAAI,CAAC,SAAS,iBAAI,WAAW,CAAC,CAAC;;AAEvD,wBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,iBAAI,CAAC;;;;;;;;;KAM9C;;;;;;;;AA7CgB,UAAM,WAoDjB,aAAa,0BAAC,OAAO;;;;;oDACV,qBAAM,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC;;;;;;;;;;KACzC;;;;;;;;;AAtDgB,UAAM,WA8DvB,SAAS,sBAAC,CAAC,EAAE,WAAW,EAAE;;;AAGtB,YAAI,CAAC,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,iBAAiB,CAAC,EAAE;;AAE1E,aAAC,CAAC,WAAW,GAAG,WAAW,CAAC;AAC5B,aAAC,CAAC,eAAe,GAAG,CAAC,CAAC,OAAO,CAAC;AAC9B,aAAC,CAAC,OAAO,GAAI,WAAW,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,IAAK,CAAC,CAAC,eAAe,CAAC;SAE7E;;AAED,eAAO,CAAC,CAAC;KAEZ;;;;;;;;;;;;;AA3EgB,UAAM,WAuFvB,aAAa,0BAAC,IAAI,EAAE;;AAEhB,YAAI,GAAG,IAAI,IAAI,EAAE,CAAC;AAClB,YAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;;;AAGlC,YAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;AACrD,YAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;AACtC,YAAI,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;;;AAG9H,YAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,SAAS,CAAC;AACjD,YAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC;;;AAGhC,YAAI,IAAI,CAAC,KAAK,EAAE;AACZ,gBAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,0BAAe,IAAI,CAAC,KAAK,CAAC,CAAC;SAC/F;;AAED,YAAI,CAAE,sBAAe,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAE,EAAE;AAC3C,gBAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,yBAAY,gBAAgB,CAAC;SACzD;;;;AAID,YAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;;AAE7C,gBAAI,qBAAqB,GAAG,sBAAe,yBAAY,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;;AAEnF,gBAAI,CAAC,qBAAqB,EAAE;AACxB,qCAAqB,GAAG,yBAAY,YAAY,CAAC;AACjD,oBAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,GAAG,yBAAY,gBAAgB,CAAC;aACtE;;AAED,gBAAI,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;;;AAGtD,gBAAI,WAAW,CAAC,OAAO,CAAC,yBAAY,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE;AACxD,oBAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACzC,MAAM,IAAI,WAAW,CAAC,OAAO,CAAC,yBAAY,sBAAsB,CAAC,GAAG,CAAC,CAAC,EAAE;AACrE,oBAAI,CAAC,IAAI,GAAG,0BAAe,IAAI,CAAC,IAAI,CAAC,CAAC;aACzC;SAEJ;;;AAGD,YAAI,GAAG,GAAG,2BAAY,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;;;AAGtC,WAAG,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC;;AAE7B,eAAO,GAAG,CAAC;KAEd;;iBA5IgB,MAAM;;eAEE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC;;;;WAFpE,MAAM;;;qBAAN,MAAM;;;;;;;;;;;;;;;yCCN8B,CAAmB;;qCACrD,CAAe;;IAA1B,KAAK;;;;;;;;;AAQV,SAAS,cAAc,CAAC,UAAU,EAAE,IAAI,EAAE;;AAE7C,QAAI,GAAG,IAAI,IAAI,EAAE,CAAC;;AAElB,QAAI,QAAQ,GAAG,4BAAa,UAAU,EAAE,IAAI,CAAC,CAAC;;;AAG9C,QAAI,KAAK,CAAC,QAAQ,EAAE,EAAE;;AAElB,gBAAQ,CAAC,KAAK,GAAG,UAAU,CAAC;AAC5B,gBAAQ,CAAC,OAAO,GAAG,YAAW;AAC1B,mBAAO,IAAI,CAAC,KAAK,CAAC;SACrB,CAAC;KAEL;;AAED,WAAO,QAAQ,CAAC;CAEnB;;AAEM,SAAS,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE;AAC1C,QAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;AAC1B,WAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,UAAS,GAAG,EAAE,GAAG,EAAE;AAClD,YAAI,GAAG,EAAE,OAAO,GAAG,CAAC;AACpB,YAAI,IAAI,IAAI,GAAG,CAAC,WAAW,EAAE,EAAE,OAAO,GAAG,CAAC;AAC1C,eAAO,GAAG,CAAC;KACd,EAAE,IAAI,CAAC,CAAC;;;;;;;;;;;;;;;;;yCCnC4C,CAAmB;;iCACrD,EAAS;;IAApB,KAAK;;IAEI,WAAW;iBAAX,WAAW;;eAEN,cAAc;;;;eACV,kBAAkB;;;;eACb,iBAAiB;;;;eAChB,mCAAmC;;;;eACzC,GAAG;;;;eACL,MAAM;;;;eACF,IAAI;;;;;;;;;;AAOrB,aAfM,WAAW,CAehB,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE;8BAf5B,WAAW;;;AAkBxB,YAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;;;AAGxB,YAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;;AAE1B,YAAI,CAAC,KAAK,GAAG,YAAY,CAAC;AAC1B,YAAI,CAAC,KAAK,GAAG,IAAI,CAAC;AAClB,YAAI,CAAC,UAAU,GAAG,EAAE,CAAC;KAExB;;;;;;AA3BgB,eAAW,WAgC5B,QAAQ,uBAAG;AACP,eAAO,IAAI,CAAC,SAAS,CAAC;KACzB;;;;;;AAlCgB,eAAW,WAuC5B,OAAO,sBAAG;AACN,eAAO,IAAI,CAAC,QAAQ,CAAC;KACxB;;;;;;AAzCgB,eAAW,WA8C5B,EAAE,iBAAG;AACD,eAAO,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;KAC9C;;;;;;AAhDgB,eAAW,WAqD5B,IAAI,mBAAG;AACH,YAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;AACrF,eAAO,IAAI,CAAC,KAAK,CAAC;KACrB;;;;;;AAxDgB,eAAW,WA6D5B,IAAI,mBAAG;AACH,YAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;AAC7D,YAAI,CAAC,IAAI,CAAC,KAAK,EAAE;AACb,gBAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;SAC3D;AACD,eAAO,IAAI,CAAC,KAAK,CAAC;KACrB;;;;;;;AAnEgB,eAAW,WAyE5B,KAAK,kBAAC,WAAW,EAAE;;AAEf,YAAI,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,IAAI,CAAC;;AAE3C,YAAI,OAAO,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,GAAG,GAAG,EAAE,KAC1E,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;;AAE7F,YAAI;;AAEA,gBAAI,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC;AACvD,gBAAI,IAAI,CAAC,IAAI,EAAE,CAAC,iBAAiB,EAAE,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,iBAAiB,CAAC;AAC3E,gBAAI,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC;SAElE,CAAC,OAAO,CAAC,EAAE,EAAE;;AAEd,eAAO,OAAO,CAAC;KAElB;;;;;;AA1FgB,eAAW,WA+F5B,SAAS,wBAAG;;AAER,YAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;;AAEvE,YAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;;;;AAIzB,gBAAI,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;;AAEvB,gBAAI,CAAC,IAAI,EAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;;AAE/C,gBAAI,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;;AAEpE,gBAAI,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;;AAEvD,gBAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,kBAAkB,GAAG,QAAQ,CAAC,CAAC;;AAE7E,gBAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;AAC1C,gBAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,WAAW,CAAC,kBAAkB,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;;AAElF,gBAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;;;;AAI1D,gBAAI,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;;;;AAI5G,gBAAI,CAAC,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,UAAC,IAAI,EAAS,CAAC,EAAK;;AAE5C,oBAAI,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;;AAE3C,uBAAO,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;aAE3C,CAAC,CAAC;SAEN;;AAED,eAAO,IAAI,CAAC,UAAU,CAAC;KAE1B;;AAxIgB,eAAW,WA0I5B,cAAc,2BAAC,WAAW,EAAE;AACxB,eAAO,IAAI,CAAC,eAAe,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;KAC3D;;AA5IgB,eAAW,WA8I5B,eAAe,8BAAG;AACd,eAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;KACrE;;AAhJgB,eAAW,WAkJ5B,YAAY,2BAAG;AACX,eAAO,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC;KACjE;;AApJgB,eAAW,WAsJ5B,aAAa,4BAAG;AACZ,eAAO,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC;KAClE;;AAxJgB,eAAW,WA0J5B,OAAO,sBAAG;AACN,eAAO,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;KAC5D;;;;;;;;;;AA5JgB,eAAW,CAqKrB,MAAM,mBAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE;;AAEpC,YAAI,GAAG,IAAI,IAAI,EAAE,CAAC;AAClB,cAAM,GAAG,MAAM,IAAI,GAAG,CAAC;AACvB,kBAAU,GAAG,UAAU,IAAI,IAAI,CAAC;;AAEhC,YAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;;AAE/B,YAAI,OAAO,GAAG,4BAAa;YACvB,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,cAAc,CAAC;YACvD,WAAW,GAAI,cAAc,CAAC,MAAM,GAAG,CAAC,GAAI,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;;AAE5E,YAAI,GAAG,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;;AAEvD,SAAC,WAAW,IAAI,EAAE,EACb,KAAK,CAAC,IAAI,CAAC,CACX,OAAO,CAAC,UAAC,MAAM,EAAY;;AAExB,gBAAI,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,gBAAgB,CAAC;gBACzD,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE;gBAC1B,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,IAAI,EAAE,CAAC;;AAE5D,gBAAI,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;SAEvC,CAAC,CAAC;;AAEP,eAAO,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE;AACpD,mBAAO,EAAE,OAAO;AAChB,kBAAM,EAAE,MAAM;AACd,sBAAU,EAAE,UAAU;SACzB,CAAC,EAAE,IAAI,CAAC,CAAC;KAEb;;WArMgB,WAAW;;;qBAAX,WAAW;;;;;;;;;;;;;;;;;oCCHX,EAAY;;;;sCACG,EAAgB;;;;IAE/B,MAAM;cAAN,MAAM;;AAEZ,aAFM,MAAM,GAET;8BAFG,MAAM;;AAGnB,8BAAO,CAAC;AACR,YAAI,CAAC,SAAS,GAAG,2BAAc,CAAC;KACnC;;AALgB,UAAM,WAOvB,QAAQ,uBAAG;AACP,eAAO,IAAI,CAAC,SAAS,CAAC;KACzB;;AATgB,UAAM,WAWjB,aAAa,0BAAC,OAAO;YAEnB,IAAI;;;;AAAJ,wBAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;;oDAE1B,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;;;;;;;;;;KAEzC;;WAjBgB,MAAM;;;qBAAN,MAAM;;;;;;;;;;;;;;;gCCHV,EAAQ;;;;IAEJ,QAAQ;AAEd,aAFM,QAAQ,GAEX;8BAFG,QAAQ;;AAGrB,YAAI,CAAC,MAAM,GAAG,EAAE,CAAC;KACpB;;AAJgB,YAAQ,WAMzB,GAAG,gBAAC,IAAI,EAAE;AACN,YAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACvB,eAAO,IAAI,CAAC;KACf;;AATgB,YAAQ,WAWzB,KAAK,oBAAG;AACJ,YAAI,CAAC,MAAM,GAAG,EAAE,CAAC;AACjB,eAAO,IAAI,CAAC;KACf;;AAdgB,YAAQ,WAgBzB,IAAI,iBAAC,OAAO,EAAE;;;;AAIV,YAAI,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;;AAE/B,YAAI,CAAC,IAAI,EAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,GAAG,OAAO,CAAC,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;;AAEpG,YAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,GAAG,OAAO,CAAC,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,GAAG,GACrD,qBAAqB,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;;AAEpG,eAAO,IAAI,CAAC;KAEf;;AA7BgB,YAAQ,WA+BzB,OAAO,oBAAC,MAAa,EAAE,IAAW,EAAE,QAAY,EAAE,MAAM,EAAE,UAAU,EAAE;;AAElE,YAAI,CAAC,GAAG,CAAC,sBAAS,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;;AAE/D,eAAO,IAAI,CAAC;KAEf;;AArCgB,YAAQ,WAuCzB,cAAc,6BAAG;;AAEb,YAAI,CAAC,OAAO,CAAC,MAAM,EAAE,sBAAsB,EAAE;AACzC,0BAAc,EAAE,cAAc;AAC9B,wBAAY,EAAE,QAAQ;AACtB,wBAAY,EAAE,IAAI;AAClB,2BAAe,EAAE,eAAe;AAChC,sCAA0B,EAAE,KAAK;AACjC,mBAAO,EAAE,iBAAiB;AAC1B,wBAAY,EAAE,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,OAAO;SAC/C,CAAC,CAAC;;AAEH,eAAO,IAAI,CAAC;KAEf;;AArDgB,YAAQ,WAuDzB,MAAM,qBAAG;;AAEL,YAAI,CAAC,OAAO,CAAC,MAAM,EAAE,uBAAuB,EAAE,EAAE,CAAC,CAAC;;AAElD,eAAO,IAAI,CAAC;KAEf;;AA7DgB,YAAQ,WA+DzB,YAAY,yBAAC,EAAE,EAAE;;AAEb,YAAI,CAAC,OAAO,CAAC,KAAK,EAAE,oCAAoC,GAAG,EAAE,GAAG,WAAW,EAAE;AACzE,iBAAK,EAAE,sEAAsE,GAAG,EAAE,GAAG,WAAW;AAChG,uBAAW,EAAE;AACT,qBAAK,EAAE,sEAAsE,GAAG,EAAE;AAClF,oBAAI,EAAE,EAAE;AACR,iCAAiB,EAAE,KAAK;aAC3B;AACD,yBAAa,EAAE,EAAE;AACjB,4BAAgB,EAAE,WAAW;AAC7B,6BAAiB,EAAE,SAAS;AAC5B,wBAAY,EAAE,WAAW;AACzB,uBAAW,EAAE,cAAc;AAC3B,yBAAa,EAAE,EAAE;SACpB,CAAC,CAAC;;AAEH,eAAO,IAAI,CAAC;KAEf;;AAlFgB,YAAQ,WAoFzB,gBAAgB,6BAAC,SAAS,EAAE;;AAExB,iBAAS,GAAG,SAAS,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;AAEtC,YAAI,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;;AAEtB,YAAI,CAAC,OAAO,CAAC,MAAM,EAAE,4BAA4B,EAAE;AAC/C,0BAAc,EAAE,CACZ,8CAA8C,CACjD;AACD,4BAAgB,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAI,SAAS,GAAG,IAAK,CAAC,CAAC,WAAW,EAAE;AAC7E,uBAAW,EAAE,SAAS;AACtB,0BAAc,EAAE;AACZ,+BAAe,EAAE,QAAQ;AACzB,4BAAY,EAAE,KAAK;AACnB,yBAAS,EAAE,SAAS;AACpB,+BAAe,EAAE,WAAW;AAC5B,2BAAW,EAAE,WAAW;aAC3B;AACD,gBAAI,EAAE,aAAa;AACnB,0BAAc,EAAE,IAAI,CAAC,WAAW,EAAE;AAClC,oBAAQ,EAAE,QAAQ;AAClB,iBAAK,EAAE,wEAAwE;SAClF,CAAC,CAAC;;AAEH,eAAO,IAAI,CAAC;KAEf;;AA/GgB,YAAQ,WAiHzB,mBAAmB,gCAAC,EAAE,EAAE,QAAQ,EAAE;;AAE9B,UAAE,GAAG,EAAE,IAAI,GAAG,CAAC;;AAEf,YAAI,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;;AAEtB,YAAI,CAAC,OAAO,CAAC,MAAM,EAAE,4BAA4B,EAAE;AAC/C,0BAAc,EAAE,CAAC,oCAAoC,GAAG,EAAE,GAAG,WAAW,IAAI,QAAQ,GAAG,8BAA8B,GAAG,EAAE,CAAC,CAAC;AAC5H,4BAAgB,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAK,CAAC,CAAC,WAAW,EAAE;AAChF,0BAAc,EAAE;AACZ,+BAAe,EAAE,QAAQ;AACzB,4BAAY,EAAE,IAAI;AAClB,yBAAS,EAAE,SAAS;AACpB,+BAAe,EAAE,WAAW;AAC5B,2BAAW,EAAE,WAAW;AACxB,qCAAqB,EAAE,KAAK;AAC5B,+BAAe,EAAE,0BAA0B;aAC9C;AACD,0BAAc,EAAE,IAAI,CAAC,WAAW,EAAE;AAClC,gBAAI,EAAE,aAAa;AACnB,oBAAQ,EAAE,QAAQ;AAClB,iBAAK,EAAE,wEAAwE;SAClF,CAAC,CAAC;;AAEH,eAAO,IAAI,CAAC;KAEf;;AA3IgB,YAAQ,WA6IzB,YAAY,yBAAC,OAAO,EAAE;;AAElB,YAAI,CAAC,OAAO,EAAE;;AAEV,gBAAI,CAAC,OAAO,CAAC,MAAM,EAAE,sBAAsB,EAAE;AACzC,8BAAc,EAAE,2BAA2B;AAC3C,4BAAY,EAAE,QAAQ;AACtB,4BAAY,EAAE,IAAI;AAClB,+BAAe,EAAE,4BAA4B;AAC7C,0CAA0B,EAAE,KAAK;AACjC,uBAAO,EAAE,iBAAiB;aAC7B,CAAC,CAAC;SAEN,MAAM;;AAEH,gBAAI,CAAC,OAAO,CAAC,MAAM,EAAE,sBAAsB,EAAE;AACzC,yBAAS,EAAE,aAAa;AACxB,mCAAmB,EAAE,aAAa;AAClC,6BAAa,EAAE,aAAa;aAC/B,EAAE,GAAG,CAAC,CAAC;SAEX;;AAED,eAAO,IAAI,CAAC;KAEf;;WAtKgB,QAAQ;;;qBAAR,QAAQ;;;;;;;;;;;;;;;2CCFL,EAAqB;;;;qCACzB,CAAe;;qCACN,EAAe;;IAEvB,IAAI;AAEV,aAFM,IAAI,CAET,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE;8BAF1C,IAAI;;AAGjB,YAAI,CAAC,OAAO,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;AACpC,YAAI,CAAC,KAAK,GAAG,IAAI,CAAC;AAClB,YAAI,CAAC,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;AACxB,YAAI,CAAC,MAAM,GAAG,KAAK,IAAI,EAAE,CAAC;AAC1B,YAAI,CAAC,OAAO,GAAG,MAAM,IAAI,GAAG,CAAC;AAC7B,YAAI,CAAC,WAAW,GAAG,UAAU,IAAI,IAAI,CAAC;KACzC;;AATgB,QAAI,WAWrB,IAAI,mBAAG;AACH,eAAO,IAAI,CAAC,KAAK,CAAC;KACrB;;AAbgB,QAAI,WAerB,MAAM,qBAAG;AACL,eAAO,IAAI,CAAC,OAAO,CAAC;KACvB;;AAjBgB,QAAI,WAmBrB,IAAI,iBAAC,OAAe,EAAE;;AAElB,eAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IACpC,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC;KAEvD;;AAxBgB,QAAI,WA0Bf,WAAW,wBAAC,OAAO;;;;;oDAEf,iBAAM,IAAI,CAAC,MAAM,CAAC;;;wDAEjB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;;;;;;;KAEzC;;AAhCgB,QAAI,WAkCrB,cAAc,2BAAC,IAAI,EAAE,IAAI,EAAE;;AAEvB,YAAI,GAAG,IAAI,IAAI,EAAE,CAAC;;AAElB,YAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC;AAC1C,YAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC;;AAEtD,YAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1B,GAAG,GAAG,0BAAe,GAAG,EAAE,IAAI,CAAC,CAAC;;AAEpC,WAAG,CAAC,OAAO,CAAC,GAAG,CAAC,6BAAY,YAAY,EAAE,6BAAY,gBAAgB,CAAC,CAAC;;AAExE,eAAO,GAAG,CAAC;KAEd;;WAhDgB,IAAI;;;qBAAJ,IAAI;;;;;;;;;;;;;;;;;;;0CCJF,EAAoB;;;;qCACzB,EAAe;;;;gCAChB,EAAQ;;;;yCACH,CAAmB;;qCACa,CAAe;;IAEhD,QAAQ;cAAR,QAAQ;;iBAAR,QAAQ;;eAEL,UAAU;;;;eACT,MAAM;;;;eACF,IAAI;;;;;eACH,EAAE,GAAG,EAAE,GAAG,EAAE;;;;;eACJ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;;;;;eAC1B,sBAAsB;;;;eACrB,uBAAuB;;;;eACpB,0BAA0B;;;;eAC7B,GAAG;;;;eACV,UAAU;;;;eACO,IAAI;;;;AAc5B,aA1BM,QAAQ,CA0Bb,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE;8BA1BrC,QAAQ;;AA4BrB,8BAAO,CAAC;;aAdZ,MAAM,GAAG;AACL,uBAAW,EAAE,aAAa;AAC1B,wBAAY,EAAE,cAAc;AAC5B,sBAAU,EAAE,YAAY;AACxB,yBAAa,EAAE,eAAe;AAC9B,0BAAc,EAAE,gBAAgB;AAChC,wBAAY,EAAE,cAAc;AAC5B,wBAAY,EAAE,cAAc;AAC5B,yBAAa,EAAE,eAAe;AAC9B,uBAAW,EAAE,aAAa;SAC7B;AAMG,YAAI,CAAC,OAAO,GAAG,MAAM,CAAC;AACtB,YAAI,CAAC,OAAO,GAAG,MAAM,CAAC;AACtB,YAAI,CAAC,UAAU,GAAG,SAAS,CAAC;;;AAG5B,YAAI,CAAC,MAAM,GAAG,KAAK,CAAC;;;AAGpB,YAAI,CAAC,OAAO,GAAG,MAAM,CAAC;;AAEtB,YAAI,CAAC,MAAM,GAAG,2BAAU,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,GAAG,UAAU,CAAC,CAAC;;AAErE,YAAI,CAAC,KAAK,GAAG,sBAAS,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;KAEzD;;;;;;AA5CgB,YAAQ,WAiDzB,IAAI,mBAAG;AACH,eAAO,IAAI,CAAC,KAAK,CAAC;KACrB;;;;;;AAnDgB,YAAQ,WAwDzB,MAAM,qBAAG;AACL,eAAO,IAAI,CAAC,OAAO,CAAC;KACvB;;;;;;;;;;;AA1DgB,YAAQ,WAoEzB,SAAS,sBAAC,IAAI,EAAE,OAAO,EAAE;;AAErB,YAAI,GAAG,IAAI,IAAI,EAAE,CAAC;AAClB,eAAO,GAAG,OAAO,IAAI,EAAE,CAAC;;AAExB,YAAI,QAAQ,GAAG,EAAE;YACb,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;;AAE9E,YAAI,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,EAAE,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC;;AAE5D,YAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,IAAI,QAAQ,CAAC,UAAU,GAAG,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC;;AAEtH,gBAAQ,IAAI,IAAI,CAAC;;AAEjB,YAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,QAAQ,IAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,GAAI,CAAC;;AAE5F,YAAI,OAAO,CAAC,SAAS,EAAE,QAAQ,IAAI,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;AAClE,YAAI,OAAO,CAAC,QAAQ,EAAE,QAAQ,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,GAAG,GAAG,EAAE,IAAI,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;;AAE9G,eAAO,QAAQ,CAAC;KAEnB;;;;;;;;;;;AAzFgB,YAAQ,WAmGzB,OAAO,oBAAC,OAAO,EAAE;;AAEb,eAAO,GAAG,OAAO,IAAI,EAAE,CAAC;;AAExB,eAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,kBAAkB,GAAG,GAAG,GAAG,0BAAe;AACjE,2BAAe,EAAE,MAAM;AACvB,0BAAc,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE;AACzC,uBAAW,EAAE,IAAI,CAAC,OAAO;AACzB,mBAAO,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE;AAC5B,sBAAU,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;AACjC,qBAAS,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;AAChC,oBAAQ,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;SACjC,CAAC,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC;KAE7B;;;;;;;AAjHgB,YAAQ,WAuHzB,oBAAoB,iCAAC,GAAU,EAAE;;AAE7B,YAAI,EAAE,GAAG,4BAAiB,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YAClD,KAAK,GAAG,EAAE,CAAC,iBAAiB,IAAI,EAAE,CAAC,KAAK,CAAC;;AAE7C,YAAI,KAAK,EAAE;AACP,gBAAI,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;AACzB,aAAC,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC;AACnB,kBAAM,CAAC,CAAC;SACX;;AAED,eAAO,EAAE,CAAC;KAEb;;;;;;AApIgB,YAAQ,WAyInB,QAAQ;;;;;;oDAGA,IAAI,CAAC,qBAAqB,EAAE;;;wDAC3B,IAAI;;;;;wDAEJ,KAAK;;;;;;;KAGnB;;;;;;;;;;;;AAlJgB,YAAQ,WA6JnB,KAAK,kBAAC,OAAO;YAUP,IAAI,EAuBJ,WAAW,EACX,IAAI;;;;;;AA9BR,2BAAO,GAAG,OAAO,IAAI,EAAE,CAAC;;AAExB,2BAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC;;AAE7C,wBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;;AAE/B,wBAAI,GAAG;AACP,0CAAkB,EAAE,QAAQ,CAAC,eAAe;AAC5C,2CAAmB,EAAE,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,wBAAwB,GAAG,QAAQ,CAAC,gBAAgB;qBACxG;;AAED,wBAAI,CAAC,OAAO,CAAC,IAAI,EAAE;;AAEf,4BAAI,CAAC,UAAU,GAAG,UAAU,CAAC;AAC7B,4BAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;AACjC,4BAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;AACjC,4BAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;qBAE5C,MAAM,IAAI,OAAO,CAAC,IAAI,EAAE;;AAErB,4BAAI,CAAC,UAAU,GAAG,oBAAoB,CAAC;AACvC,4BAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;AACzB,4BAAI,CAAC,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;;qBAG3C;;AAED,wBAAI,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;;;oDAEtC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC;;;AAArE,+BAAW;AACX,wBAAI,GAAG,WAAW,CAAC,IAAI,EAAE;;AAE7B,wBAAI,CAAC,KAAK,CACL,OAAO,CAAC,IAAI,CAAC,CACb,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;;AAEnC,wBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;;wDAE1C,WAAW;;;;;;AAIlB,wBAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;;AAEpB,wBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,iBAAI,CAAC;;;;;;;;;KAM5C;;;;;;AAnNgB,YAAQ,WAwNnB,OAAO;YA+BD,GAAG,EAMH,IAAI;;;;;;AAjCR,wBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;;yBAEjC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;;;;;;oDAEhB,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;;;wBAEnB,IAAI,CAAC,mBAAmB,EAAE;;;;;0BACrB,IAAI,KAAK,CAAC,oCAAoC,CAAC;;;;AAGzD,wBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;;wDAErC,IAAI;;;;AAIf,wBAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;;;;oDAGd,iBAAM,QAAQ,CAAC,eAAe,CAAC;;;wBAGhC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;;;;;0BAAQ,IAAI,KAAK,CAAC,0BAA0B,CAAC;;;wBACtE,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE;;;;;0BAAQ,IAAI,KAAK,CAAC,2BAA2B,CAAC;;;wBAC5E,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;;;;;0BAAQ,IAAI,KAAK,CAAC,uCAAuC,CAAC;;;;oDAGrE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,EAAE;AACpD,oCAAY,EAAE,eAAe;AAC7B,uCAAe,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AAC1C,0CAAkB,EAAE,QAAQ,CAAC,eAAe;AAC5C,2CAAmB,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC,wBAAwB,GAAG,QAAQ,CAAC,gBAAgB;qBAC7G,CAAC;;;AALF,uBAAG;AAMH,wBAAI,GAAG,GAAG,CAAC,IAAI,EAAE;;wBAEhB,IAAI,CAAC,YAAY;;;;;0BACZ,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,EAAE,GAAG,CAAC;;;;AAG5E,wBAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzB,wBAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;;AAErB,wBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;;wDAEpC,GAAG;;;;;;AAIV,qCAAI,IAAI,CAAC,OAAO,CAAC,SAAS,gBAAG,CAAC;;AAE9B,wBAAI,QAAQ,CAAC,yBAAyB,EAAE;AACpC,4BAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;qBACvB;;AAED,wBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,iBAAI,CAAC;;;;;;;;;KAM9C;;;;;;AAxRgB,YAAQ,WA6RnB,MAAM;YAQA,GAAG;;;;;;AAJP,wBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;;AAEpC,wBAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;;;oDAEJ,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,eAAe,EAAE;AACzD,6BAAK,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;qBAClC,CAAC;;;AAFE,uBAAG;;AAIP,wBAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;AACrB,wBAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;;AAEpB,wBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;;wDAEnC,GAAG;;;;;;AAIV,wBAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;;AAErB,wBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,iBAAI,CAAC;;;;;;;;;KAM7C;;;;;;;;;AA1TgB,YAAQ,WAkUnB,cAAc,2BAAC,OAAO,EAAE,OAAO;;;;;AAEjC,2BAAO,GAAG,OAAO,IAAI,EAAE,CAAC;;yBAEpB,OAAO,CAAC,aAAa;;;;;wDAAS,OAAO;;;;oDAEnC,IAAI,CAAC,qBAAqB,EAAE;;;;AAElC,2BAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;;;;;wDAKlD,OAAO;;;;;;;KAEjB;;;;;;;;;AAjVgB,YAAQ,WAyVnB,WAAW,wBAAC,OAAO,EAAE,OAAO;;;;;;oDAIV,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC;;;AAArD,2BAAO;;oDAEO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;;;;;;;;;0BAK3C,CAAC,eAAE,WAAW,IAAI,CAAC,eAAE,WAAW,CAAC,QAAQ,EAAE,IAAK,eAAE,WAAW,CAAC,QAAQ,EAAE,CAAC,MAAM,IAAI,GAAG,CAAC;;;;;;;;;AAE3F,wBAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;;;oDAEjB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC;;;;;;;;;;KAIvD;;;;;;;;;;;;;AA5WgB,YAAQ,WAwXnB,IAAI;YAAC,OAAO,yDAAG,EAAE;;;;;;AAGnB,2BAAO,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;;;oDAEhD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;;;;;;;;;;KAE9E;;;;;;;;;;;AA/XgB,YAAQ,WAyYnB,GAAG,gBAAC,GAAG,EAAE,KAAK,EAAE,OAAO;;;;AACzB,2BAAO,GAAG,OAAO,IAAI,EAAE,CAAC;AACxB,2BAAO,CAAC,MAAM,GAAG,KAAK,CAAC;AACvB,2BAAO,CAAC,GAAG,GAAG,GAAG,CAAC;AAClB,2BAAO,CAAC,KAAK,GAAG,KAAK,CAAC;;oDACT,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;;;;;;;;;;KAClC;;;;;;;;;;;;AA/YgB,YAAQ,WA0ZnB,IAAI,iBAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO;;;;AAChC,2BAAO,GAAG,OAAO,IAAI,EAAE,CAAC;AACxB,2BAAO,CAAC,MAAM,GAAG,MAAM,CAAC;AACxB,2BAAO,CAAC,GAAG,GAAG,GAAG,CAAC;AAClB,2BAAO,CAAC,KAAK,GAAG,KAAK,CAAC;AACtB,2BAAO,CAAC,IAAI,GAAG,IAAI,CAAC;;oDACP,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;;;;;;;;;;KAClC;;;;;;;;;;;;AAjagB,YAAQ,WA4anB,GAAG,gBAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO;;;;AAC/B,2BAAO,GAAG,OAAO,IAAI,EAAE,CAAC;AACxB,2BAAO,CAAC,MAAM,GAAG,KAAK,CAAC;AACvB,2BAAO,CAAC,GAAG,GAAG,GAAG,CAAC;AAClB,2BAAO,CAAC,KAAK,GAAG,KAAK,CAAC;AACtB,2BAAO,CAAC,IAAI,GAAG,IAAI,CAAC;;oDACP,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;;;;;;;;;;KAClC;;;;;;;;;;;AAnbgB,YAAQ,WA6bnB,QAAQ,qBAAC,GAAG,EAAE,KAAK,EAAE,OAAO;;;;AAC9B,2BAAO,GAAG,OAAO,IAAI,EAAE,CAAC;AACxB,2BAAO,CAAC,MAAM,GAAG,QAAQ,CAAC;AAC1B,2BAAO,CAAC,GAAG,GAAG,GAAG,CAAC;AAClB,2BAAO,CAAC,KAAK,GAAG,KAAK,CAAC;;oDACT,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;;;;;;;;;;KAClC;;AAncgB,YAAQ,WAqcnB,aAAa,0BAAC,IAAI,EAAE,IAAI;;;;;oDAEb,IAAI,CAAC,IAAI,CAAC;AACnB,2BAAG,EAAE,IAAI;AACT,qCAAa,EAAE,IAAI;AACnB,4BAAI,EAAE,IAAI;AACV,8BAAM,EAAE,MAAM;AACd,+BAAO,EAAE;AACL,2CAAe,EAAE,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE;AAC1C,0CAAc,EAAE,mCAAmC;yBACtD;qBACJ,CAAC;;;;;;;;;;KAEL;;AAldgB,YAAQ,WAodnB,qBAAqB;;;;yBAEnB,IAAI,CAAC,mBAAmB,EAAE;;;;;wDAAS,IAAI;;;;oDAC9B,IAAI,CAAC,OAAO,EAAE;;;;;;;;;;KAE9B;;AAzdgB,YAAQ,WA2dzB,mBAAmB,kCAAG;;AAElB,eAAQ,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAE;KAErE;;AA/dgB,YAAQ,WAiezB,OAAO,sBAAG;AACN,YAAI,MAAM,GAAG,IAAI,CAAC,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC;AAClD,eAAQ,OAAO,IAAI,IAAI,UAAU,GAAI,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;KAC7F;;AApegB,YAAQ,WAsezB,WAAW,0BAAG;AACV,YAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;AACrC,eAAO,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,KAAK,GAAG,GAAG,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC;KAC9D;;WAzegB,QAAQ;;;qBAAR,QAAQ;;;;;;;;;;;;;;;;;;;;;ICNR,IAAI;iBAAJ,IAAI;;eAEa,EAAE,GAAG,IAAI;;;;;eAClB,QAAQ;;;;AAEtB,aALM,IAAI,CAKT,KAAK,EAAE,OAAc,EAAE;8BALlB,IAAI;;;AAQjB,YAAI,CAAC,MAAM,GAAG,KAAK,CAAC;AACpB,YAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;KAE3B;;;;;;;;;;;;;;AAXgB,QAAI,WAarB,WAAW,0BAAG;AACV,eAAO,IAAI,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC;KACnC;;AAfgB,QAAI,WAiBrB,YAAY,2BAAG;AACX,eAAO,IAAI,CAAC,IAAI,EAAE,CAAC,aAAa,CAAC;KACpC;;AAnBgB,QAAI,WAqBrB,SAAS,wBAAG;AACR,eAAO,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC;KACjC;;;;;;AAvBgB,QAAI,WA4BrB,IAAI,mBAAG;;AAEH,eAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI;AACrC,sBAAU,EAAE,EAAE;AACd,wBAAY,EAAE,EAAE;AAChB,sBAAU,EAAE,CAAC;AACb,yBAAa,EAAE,EAAE;AACjB,oCAAwB,EAAE,CAAC;SAC9B,CAAC;KAET;;;;;;;AAtCgB,QAAI,WA4CrB,OAAO,oBAAC,OAAO,EAAE;;AAEb,eAAO,GAAG,OAAO,IAAI,EAAE,CAAC;;AAExB,YAAI,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;;AAEvB,cAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,UAAC,GAAG,EAAK;AAClC,gBAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;SAC5B,CAAC,CAAC;;AAEH,YAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAI,IAAI,CAAC,UAAU,GAAG,IAAK,CAAC;AACzD,YAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAI,IAAI,CAAC,wBAAwB,GAAG,IAAK,CAAC;;AAErF,YAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;;AAEzC,eAAO,IAAI,CAAC;KAEf;;;;;;;AA7DgB,QAAI,WAmErB,gBAAgB,+BAAG;;AAEf,YAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;AAC3B,eAAQ,QAAQ,CAAC,UAAU,KAAK,IAAI,CAAC,eAAe,IAAK,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAG,CAAE;KAEzH;;;;;;;AAxEgB,QAAI,WA8ErB,iBAAiB,gCAAG;;AAEhB,eAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,yBAAyB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAE;KAE/D;;;;;;AAlFgB,QAAI,WAuFrB,iBAAiB,gCAAG;;AAEhB,eAAO,IAAI,CAAC,OAAO,CAAC;AAChB,wBAAY,EAAE,EAAE;AAChB,sBAAU,EAAE,CAAC;SAChB,CAAC,CAAC;KAEN;;;;;;;AA9FgB,QAAI,WAoGrB,mBAAmB,kCAAG;;AAElB,YAAI,CAAC,OAAO,CAAC;AACT,sBAAU,EAAE,IAAI,CAAC,eAAe;AAChC,wBAAY,EAAE,EAAE;AAChB,sBAAU,EAAE,CAAC;AACb,yBAAa,EAAE,EAAE;AACjB,oCAAwB,EAAE,CAAC;SAC9B,CAAC,CAAC;;AAEH,eAAO,IAAI,CAAC;KAEf;;;;;;;AAhHgB,QAAI,WAsHrB,WAAW,wBAAC,QAAQ,EAAE;;AAElB,eAAO,IAAI,CAAC,OAAO,CAAC,EAAC,QAAQ,EAAE,QAAQ,EAAC,CAAC,CAAC;KAE7C;;;;;;AA1HgB,QAAI,WA+HrB,QAAQ,uBAAG;;AAEP,eAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC;KAEjC;;WAnIgB,IAAI;;;qBAAJ,IAAI;;;;;;;;;;;;;;;wCCAF,EAAiB;;;;yCACnB,CAAmB;;IAEnB,iBAAiB;AAEvB,aAFM,iBAAiB,GAEpB;8BAFG,iBAAiB;;AAG9B,YAAI,CAAC,UAAU,GAAG,sBAAO,UAAU,CAAC;KACvC;;AAJgB,qBAAiB,WAMlC,IAAI,iBAAC,OAAyB,EAAE;AAC5B,eAAO,8BAAe,OAAO,CAAC,CAAC;KAClC;;WARgB,iBAAiB;;;qBAAjB,iBAAiB;;;;;;;;;;;;;;;;;0CCHf,EAAoB;;;;yCACtB,CAAmB;;IAEnB,UAAU;cAAV,UAAU;;AAEhB,aAFM,UAAU,CAEf,OAAO,EAAE;8BAFJ,UAAU;;AAGvB,8BAAO,CAAC;AACR,YAAI,CAAC,OAAO,GAAG,OAAO,CAAC;AACvB,YAAI,CAAC,UAAU,GAAG,sBAAO,UAAU,CAAC;KACvC;;AANgB,cAAU,WAQ3B,KAAK,oBAAG,EAAE;;AARO,cAAU,WAU3B,SAAS,sBAAC,OAA8B,EAAE;AACtC,YAAI,CAAC,EAAE,CAAC,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;KAC1D;;AAZgB,cAAU,WAc3B,WAAW,wBAAC,OAAgC,EAAE;AAC1C,YAAI,CAAC,GAAG,CAAC,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;KAC1C;;AAhBgB,cAAU,WAkB3B,cAAc,2BAAC,GAAG,EAAE,OAAO,EAAE;AACzB,YAAI,CAAC,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;KACxD;;WApBgB,UAAU;;;qBAAV,UAAU;;;;;;;;;;;;;;;;;;;0CCHR,EAAoB;;;;sCACxB,EAAgB;;;;qCACI,CAAe;;IAEjC,YAAY;cAAZ,YAAY;;iBAAZ,YAAY;;eAEH,CAAC,GAAG,EAAE,GAAG,IAAI;;;;eAChB,EAAE,GAAG,IAAI;;;;AAYrB,aAfM,YAAY,CAejB,aAAa,EAAE,QAAQ,EAAE;8BAfpB,YAAY;;AAiBzB,8BAAO,CAAC;;aAZZ,MAAM,GAAG;AACL,wBAAY,EAAE,cAAc;AAC5B,yBAAa,EAAE,eAAe;AAC9B,uBAAW,EAAE,aAAa;AAC1B,wBAAY,EAAE,cAAc;AAC5B,sBAAU,EAAE,YAAY;AACxB,4BAAgB,EAAE,kBAAkB;AACpC,0BAAc,EAAE,gBAAgB;SACnC;AAMG,YAAI,CAAC,cAAc,GAAG,aAAa,CAAC;AACpC,YAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;AAC1B,YAAI,CAAC,OAAO,GAAG,IAAI,CAAC;AACpB,YAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;AACrB,YAAI,CAAC,aAAa,GAAG,EAAE,CAAC;KAE3B;;;;;;;;;;;;;;;;;;;;AAzBgB,gBAAY,WA2B7B,UAAU,yBAAE;;AAER,eAAO,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,IACrB,IAAI,CAAC,aAAa,CAAC,YAAY,IAC/B,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,aAAa,IAC7C,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;KAEtD;;;;;;AAlCgB,gBAAY,WAuC7B,KAAK,oBAAG;;AAEJ,eAAO,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;KAElE;;AA3CgB,gBAAY,WA6C7B,cAAc,6BAAG;AACb,eAAO,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,YAAY,CAAC,gBAAgB,CAAC;KACrG;;AA/CgB,gBAAY,WAiD7B,eAAe,4BAAC,YAAY,EAAE;;AAE1B,oBAAY,GAAG,YAAY,IAAI,EAAE,CAAC;;AAElC,YAAI,CAAC,aAAa,EAAE,CAAC;;AAErB,YAAI,CAAC,aAAa,GAAG,YAAY,CAAC;;AAElC,YAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC;;AAE7C,YAAI,CAAC,WAAW,EAAE,CAAC;;AAEnB,eAAO,IAAI,CAAC;KAEf;;AA/DgB,gBAAY,WAiE7B,YAAY,2BAAG;AACX,eAAO,IAAI,CAAC,aAAa,CAAC;KAC7B;;;;;;;AAnEgB,gBAAY,WAyEvB,QAAQ;;;;yBAEN,IAAI,CAAC,KAAK,EAAE;;;;;;oDACC,IAAI,CAAC,KAAK,EAAE;;;;;;;oDAEZ,IAAI,CAAC,SAAS,EAAE;;;;;;;;;;KAGpC;;AAjFgB,gBAAY,WAmF7B,YAAY,2BAAG;AACX,eAAO,IAAI,CAAC,aAAa,CAAC,YAAY,IAAI,EAAE,CAAC;KAChD;;;;;;;AArFgB,gBAAY,WA2F7B,eAAe,4BAAC,MAAM,EAAE;AACpB,YAAI,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;AACzD,eAAO,IAAI,CAAC;KACf;;;;;;;AA9FgB,gBAAY,WAoG7B,eAAe,4BAAC,MAAM,EAAE;AACpB,YAAI,CAAC,aAAa,CAAC,YAAY,GAAG,MAAM,CAAC;AACzC,eAAO,IAAI,CAAC;KACf;;;;;;AAvGgB,gBAAY,WA4GvB,SAAS;YAQH,QAAQ,EAMR,IAAI;;;;;;AAVR,wBAAI,CAAC,aAAa,EAAE,CAAC;;wBAEhB,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM;;;;;0BAAQ,IAAI,KAAK,CAAC,sBAAsB,CAAC;;;;oDAEnD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,4BAA4B,EAAE;AAC/D,oCAAY,EAAE,IAAI,CAAC,oBAAoB,EAAE;AACzC,oCAAY,EAAE;AACV,yCAAa,EAAE,QAAQ;yBAC1B;qBACJ,CAAC;;;AALF,4BAAQ;AAMR,wBAAI,GAAG,QAAQ,CAAC,IAAI,EAAE;;AAE1B,wBAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CACrB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;;wDAE3C,QAAQ;;;;;;AAKf,qCAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,SAAS,gBAAG,CAAC;;AAEzC,wBAAI,CAAC,KAAK,EAAE,CACP,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,iBAAI,CAAC;;;;;;;;;KAMhD;;;;;;AA7IgB,gBAAY,WAkJvB,KAAK;YAUC,QAAQ,EAIR,IAAI;;;;;;AAVR,wBAAI,CAAC,aAAa,EAAE,CAAC;;wBAEhB,IAAI,CAAC,KAAK,EAAE;;;;;0BAAQ,IAAI,KAAK,CAAC,2BAA2B,CAAC;;;wBAE1D,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM;;;;;0BAAQ,IAAI,KAAK,CAAC,sBAAsB,CAAC;;;;oDAEnD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,6BAA6B,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE;AAC3F,oCAAY,EAAE,IAAI,CAAC,oBAAoB,EAAE;qBAC5C,CAAC;;;AAFE,4BAAQ;AAIR,wBAAI,GAAG,QAAQ,CAAC,IAAI,EAAE;;AAE1B,wBAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CACrB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;;wDAEvC,QAAQ;;;;;;AAIf,qCAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,SAAS,gBAAG,CAAC;;AAEzC,wBAAI,CAAC,KAAK,EAAE,CACP,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,iBAAI,CAAC;;;;;;;;;KAM5C;;;;;;AAlLgB,gBAAY,WAuLvB,MAAM;YAMA,QAAQ;;;;;;wBAFP,IAAI,CAAC,UAAU,EAAE;;;;;0BAAQ,IAAI,KAAK,CAAC,iBAAiB,CAAC;;;;oDAErC,IAAI,CAAC,SAAS,UAAO,CAAC,6BAA6B,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;;;AAA7F,4BAAQ;;AAEZ,wBAAI,CAAC,KAAK,EAAE,CACP,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;;wDAExC,QAAQ;;;;;;AAIf,qCAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,SAAS,gBAAG,CAAC;;AAEzC,wBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,iBAAI,CAAC;;;;;;;;;KAM7C;;;;;;AA9MgB,gBAAY,WAmN7B,WAAW,0BAAG;;AAEV,eAAO,IAAI,CAAC,KAAK,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;KAExE;;;;;;;AAvNgB,gBAAY,WA6N7B,KAAK,oBAAG;AACJ,YAAI,CAAC,aAAa,EAAE,CAAC;AACrB,YAAI,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,OAAO,EAAC,CAAC,CAAC;AACpH,YAAI,CAAC,aAAa,GAAG,EAAE,CAAC;AACxB,eAAO,IAAI,CAAC;KACf;;AAlOgB,gBAAY,WAoO7B,oBAAoB,mCAAG;;;AAEnB,eAAO,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,UAAC,KAAK,EAAK;AACtC,mBAAO,MAAK,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;SAC1C,CAAC,CAAC;KAEN;;AA1OgB,gBAAY,WA4O7B,WAAW,0BAAG;;;AAEV,YAAI,CAAC,aAAa,EAAE,CAAC;;AAErB,YAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;;AAEhE,wBAAK,UAAC,IAAI,EAAI;;AAEV,gBAAI,OAAK,KAAK,EAAE,EAAE,OAAO,IAAI,EAAE,CAAC;;AAEhC,mBAAK,KAAK,EAAE,CAAC;SAEhB,EAAE,YAAY,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;;AAE9C,eAAO,IAAI,CAAC;KAEf;;AA5PgB,gBAAY,WA8P7B,aAAa,4BAAG;;AAEZ,+BAAY,IAAI,CAAC,QAAQ,CAAC,CAAC;;AAE3B,eAAO,IAAI,CAAC;KAEf;;AApQgB,gBAAY,WAsQ7B,QAAQ,qBAAC,OAAW,EAAE;;AAElB,YAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;;AAE3D,YAAI,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,aAAa,EAAE;;AAE/C,gBAAI,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC;;AAEjC,mBAAO,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,aAAa,EAAE;AACxF,0BAAU,EAAE,KAAK;AACjB,2BAAW,EAAE,QAAQ;AACrB,yBAAS,EAAE,GAAG;AACd,oBAAI,EAAE,KAAK;aACd,CAAC,CAAC;SAEN;;AAED,eAAO,OAAO,CAAC;KAElB;;AAzRgB,gBAAY,WA2R7B,OAAO,oBAAC,OAAW,EAAE;;AAEjB,YAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;;AAE5D,eAAO,IAAI,CAAC;KAEf;;AAjSgB,gBAAY,WAmS7B,kBAAkB,iCAAgB;;AAE9B,YAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;;AAEhE,YAAI,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC;;AAEjC,YAAI,CAAC,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC;AACvB,eAAG,EAAE,IAAI;AACT,yBAAa,EAAE,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,aAAa;SAC/D,CAAC,CAAC;;AAEH,YAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;;AAErB,YAAI,CAAC,OAAO,CAAC,SAAS,CAAC;AACnB,mBAAO,EAAE,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,OAAO;AAChD,mBAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;AAChC,mBAAO,EAAE,mBAAM,EAAE;SACpB,CAAC,CAAC;;AAEH,eAAO,IAAI,CAAC;KAEf;;WAxTgB,YAAY;;;qBAAZ,YAAY;;;;;;;;;;;;;;;;;;;yCCJR,EAAgB;;;;qCACvB,EAAe;;;;IAEZ,kBAAkB;cAAlB,kBAAkB;;AAExB,aAFM,kBAAkB,CAEvB,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;;;8BAFrC,kBAAkB;;AAI/B,iCAAM,aAAa,EAAE,QAAQ,CAAC,CAAC;;AAE/B,YAAI,CAAC,MAAM,GAAG,KAAK,CAAC;AACpB,YAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;AAC1B,YAAI,CAAC,WAAW,GAAG,2BAAU,IAAI,CAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC,CAAC;AAC/D,YAAI,CAAC,iBAAiB,GAAG,2BAAU,IAAI,CAAC,MAAM,EAAE,QAAQ,GAAG,cAAc,CAAC,CAAC;;AAE3E,YAAI,CAAC,MAAM,gBACJ,IAAI,CAAC,MAAM;AACd,8BAAkB,EAAE,oBAAoB;AACxC,4BAAgB,EAAE,kBAAkB;AACpC,oCAAwB,EAAE,0BAA0B;AACpD,kCAAsB,EAAE,wBAAwB;UACnD,CAAC;;AAEF,YAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,YAAM;AAClC,kBAAK,WAAW,EAAE,CAAC;SACtB,CAAC,CAAC;;AAEH,YAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,YAAM;AACpE,kBAAK,MAAM,CAAC,OAAO,CAAC,MAAK,SAAS,EAAE,MAAK,YAAY,EAAE,CAAC,CAAC;SAC5D,CAAC,CAAC;;AAEH,YAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,YAAM;AACrC,kBAAK,MAAM,CAAC,UAAU,CAAC,MAAK,SAAS,CAAC,CAAC;SAC1C,CAAC,CAAC;KAEN;;;;;;;;;;;;;AA/BgB,sBAAkB,WA2C7B,MAAM,mBAAC,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY;YAoBxD,GAAG;;;;;;yBAhBH,KAAK,CAAC,QAAQ,EAAE;;;;;;oDAEV,KAAK,CAAC,IAAI,EAAE;;;wBAEb,IAAI,CAAC,KAAK,EAAE;;;;;0BACP,IAAI,KAAK,CAAC,YAAY,CAAC;;;;AAGjC,wBAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;;wDAEvB,IAAI;;;;AAIf,yBAAK,CAAC,KAAK,EAAE,CAAC;;;oDAEE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;;;AAA/B,uBAAG;;AAEP,yBAAK,CAAC,MAAM,EAAE,CAAC;;AAEf,wBAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;;wDAEtB,GAAG;;;;;;AAIV,wBAAI,CAAC,IAAI,CAAC,UAAU,iBAAI,CAAC;;;;;;;;;KAMhC;;;;;;AA/EgB,sBAAkB,WAoFnC,KAAK,oBAAG;;AAEJ,eAAO,IAAI,CAAC,MAAM,CACd,wBAAM,KAAK,EACX,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAC9B,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAC5B,+CAA+C,CAClD,CAAC;KAEL;;;;;;AA9FgB,sBAAkB,WAmGnC,WAAW,0BAAG;;AAEV,eAAO,IAAI,CAAC,MAAM,CACd,wBAAM,WAAW,EACjB,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,MAAM,CAAC,wBAAwB,EACpC,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAClC,qDAAqD,CACxD,CAAC;KAEL;;;;;;;AA7GgB,sBAAkB,WAmHnC,OAAO,oBAAC,MAAM,EAAE;;AAEZ,YAAI,sBAAsB,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;;AAEjE,YAAI,sBAAsB,EAAE;AACxB,gBAAI;AACA,oBAAI,CAAC,eAAe,CAAC,sBAAsB,CAAC,CAAC;aAChD,CAAC,OAAO,CAAC,EAAE,EAAE;SACjB,MAAM;AACH,gBAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;SAChC;;AAED,eAAO,IAAI,CAAC;KAEf;;WAjIgB,kBAAkB;;;qBAAlB,kBAAkB;;;;;;;ACHvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,KAAK;AACL,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,WAAW;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS;AACT;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAiC,kBAAkB;AACnD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,iBAAiB;;AAEjB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,YAAY;AACZ;AACA;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,8CAA8C,QAAQ;AACtD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA,WAAW;AACX;AACA;AACA;;AAEA,WAAW;AACX;AACA;AACA;;AAEA,WAAW;AACX;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,8CAA8C,QAAQ;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;;AAEL;AACA,8CAA8C,QAAQ;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,8CAA8C,QAAQ;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA","file":"ringcentral-bundle.js","sourcesContent":["(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[\"SDK\"] = factory();\n\telse\n\t\troot[\"RingCentral\"] = root[\"RingCentral\"] || {}, root[\"RingCentral\"][\"SDK\"] = factory();\n})(this, function() {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\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 = \"/build/\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 376cc765ad2cf3304422\n **/","import * as Utils from './core/Utils';\nimport Cache from './core/Cache';\nimport * as Externals from './core/Externals';\nimport Observable from './core/Observable';\nimport Queue from './core/Queue';\n\nimport Client from './http/Client';\nimport ApiResponse from './http/ApiResponse';\nimport * as HttpUtils from './http/Utils';\n\nimport {default as ClientMock} from './mocks/ClientMock';\nimport Mock from './mocks/Mock';\nimport Registry from './mocks/Registry';\n\nimport Platform from './platform/Platform';\nimport Auth from './platform/Auth';\n\nimport PubnubMockFactory from './pubnub/PubnubFactory';\n\nimport Subscription from './subscription/Subscription';\nimport CachedSubscription from './subscription/CachedSubscription';\n\nrequire(\"regenerator/runtime\");\n\nexport default class SDK {\n\n static version = '2.0.0';\n\n static server = {\n sandbox: 'https://platform.devtest.ringcentral.com',\n production: 'https://platform.ringcentral.com'\n };\n\n /**\n * @constructor\n * @param {object} [options]\n * @param {string} [options.server]\n * @param {string} [options.cachePrefix]\n * @param {string} [options.appSecret]\n * @param {string} [options.appKey]\n * @param {string} [options.appName]\n * @param {string} [options.appVersion]\n * @param {string} [options.pubnubFactory]\n * @param {string} [options.client]\n */\n constructor(options) {\n\n options = options || {};\n\n this._cache = new Cache(Externals.localStorage, options.cachePrefix);\n\n this._client = options.client || new Client();\n\n this._platform = new Platform(this._client, this._cache, options.server, options.appKey, options.appSecret);\n\n this._pubnubFactory = options.pubnubFactory || Externals.PUBNUB;\n\n }\n\n /**\n * @return {Platform}\n */\n platform() {\n return this._platform;\n }\n\n /**\n * @return {Subscription}\n */\n createSubscription() {\n return new Subscription(this._pubnubFactory, this._platform);\n }\n\n /**\n * @return {CachedSubscription}\n */\n createCachedSubscription(cacheKey) {\n return new CachedSubscription(this._pubnubFactory, this._platform, this._cache, cacheKey);\n }\n\n /**\n * @return {Cache}\n */\n cache() {\n return this._cache;\n }\n\n static core = {\n Cache: Cache,\n Observable: Observable,\n Utils: Utils,\n Externals: Externals,\n Queue: Queue\n };\n\n static http = {\n Client: Client,\n ApiResponse: ApiResponse,\n Utils: HttpUtils\n };\n\n static platform = {\n Auth: Auth,\n Platform: Platform\n };\n\n static subscription = {\n Subscription: Subscription\n };\n\n static mocks = {\n Client: ClientMock,\n Registry: Registry,\n Mock: Mock\n };\n\n static pubnub = {\n PubnubMockFactory: PubnubMockFactory\n };\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/SDK.js\n **/","import {Promise} from './Externals.js';\n\n/**\n * TODO Replace with something better\n * @see https://github.com/joyent/node/blob/master/lib/querystring.js\n * @param {object} parameters\n * @returns {string}\n */\nexport function queryStringify(parameters) {\n\n var array = [];\n\n parameters = parameters || {};\n\n Object.keys(parameters).forEach((k) => {\n\n var v = parameters[k];\n\n if (isArray(v)) {\n v.forEach((vv) => {\n array.push(encodeURIComponent(k) + '=' + encodeURIComponent(vv));\n });\n } else {\n array.push(encodeURIComponent(k) + '=' + encodeURIComponent(v));\n }\n\n });\n\n return array.join('&');\n\n}\n\n/**\n * TODO Replace with something better\n * @see https://github.com/joyent/node/blob/master/lib/querystring.js\n * @param {string} queryString\n * @returns {object}\n */\nexport function parseQueryString(queryString) {\n\n var argsParsed = {};\n\n queryString.split('&').forEach((arg) => {\n\n arg = decodeURIComponent(arg);\n\n if (arg.indexOf('=') == -1) {\n\n argsParsed[arg.trim()] = true;\n\n } else {\n\n var pair = arg.split('='),\n key = pair[0].trim(),\n value = pair[1].trim();\n\n if (key in argsParsed) {\n if (key in argsParsed && !isArray(argsParsed[key])) argsParsed[key] = [argsParsed[key]];\n argsParsed[key].push(value);\n } else {\n argsParsed[key] = value;\n }\n\n }\n\n });\n\n return argsParsed;\n\n}\n\n/**\n * @param obj\n * @return {boolean}\n */\nexport function isFunction(obj) {\n return typeof obj === \"function\";\n}\n\n/**\n * @param obj\n * @return {boolean}\n */\nexport function isArray(obj) {\n return Array.isArray ? Array.isArray(obj) : typeof obj === \"array\";\n}\n\n/**\n * @param fn\n * @param interval\n * @param timeout\n */\nexport function poll(fn, interval, timeout) { //NodeJS.Timer|number\n\n module.exports.stopPolling(timeout);\n\n interval = interval || 1000;\n\n var next = (delay) => {\n\n delay = delay || interval;\n\n interval = delay;\n\n return setTimeout(() => {\n\n fn(next, delay);\n\n }, delay);\n\n };\n\n return next();\n\n}\n\nexport function stopPolling(timeout) {\n if (timeout) clearTimeout(timeout);\n}\n\nexport function isNodeJS() {\n return (typeof process !== 'undefined');\n}\n\nexport function isBrowser() {\n return (typeof window !== 'undefined');\n}\n\nexport function delay(timeout) {\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n resolve(null);\n }, timeout);\n });\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Utils.js\n **/","import ES6Promise from 'es6-promise';\nimport nodeFetch from 'node-fetch';\nimport pubnub from 'pubnub';\n\nvar root = (new Function('return this'))();\n\nexport var Promise = (ES6Promise && ES6Promise.Promise) || root.Promise;\n\nexport var fetch = root.fetch || nodeFetch;\nexport var Request = root.Request || fetch.Request;\nexport var Response = root.Response || fetch.Response;\nexport var Headers = root.Headers || fetch.Headers;\n\nexport var PUBNUB = root.PUBNUB || pubnub;\n\nexport var localStorage = (typeof root.localStorage !== 'undefined') ? root.localStorage : {};\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Externals.js\n **/","/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license Licensed under MIT license\n * See https://raw.githubusercontent.com/jakearchibald/es6-promise/master/LICENSE\n * @version 2.2.0\n */\n\n(function() {\n \"use strict\";\n function lib$es6$promise$utils$$objectOrFunction(x) {\n return typeof x === 'function' || (typeof x === 'object' && x !== null);\n }\n\n function lib$es6$promise$utils$$isFunction(x) {\n return typeof x === 'function';\n }\n\n function lib$es6$promise$utils$$isMaybeThenable(x) {\n return typeof x === 'object' && x !== null;\n }\n\n var lib$es6$promise$utils$$_isArray;\n if (!Array.isArray) {\n lib$es6$promise$utils$$_isArray = function (x) {\n return Object.prototype.toString.call(x) === '[object Array]';\n };\n } else {\n lib$es6$promise$utils$$_isArray = Array.isArray;\n }\n\n var lib$es6$promise$utils$$isArray = lib$es6$promise$utils$$_isArray;\n var lib$es6$promise$asap$$len = 0;\n var lib$es6$promise$asap$$toString = {}.toString;\n var lib$es6$promise$asap$$vertxNext;\n var lib$es6$promise$asap$$customSchedulerFn;\n\n function lib$es6$promise$asap$$asap(callback, arg) {\n lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len] = callback;\n lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len + 1] = arg;\n lib$es6$promise$asap$$len += 2;\n if (lib$es6$promise$asap$$len === 2) {\n // If len is 2, 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 if (lib$es6$promise$asap$$customSchedulerFn) {\n lib$es6$promise$asap$$customSchedulerFn(lib$es6$promise$asap$$flush);\n } else {\n lib$es6$promise$asap$$scheduleFlush();\n }\n }\n }\n\n var lib$es6$promise$asap$$default = lib$es6$promise$asap$$asap;\n function lib$es6$promise$asap$$setScheduler(scheduleFn) {\n lib$es6$promise$asap$$customSchedulerFn = scheduleFn;\n }\n\n var lib$es6$promise$asap$$browserWindow = (typeof window !== 'undefined') ? window : undefined;\n var lib$es6$promise$asap$$browserGlobal = lib$es6$promise$asap$$browserWindow || {};\n var lib$es6$promise$asap$$BrowserMutationObserver = lib$es6$promise$asap$$browserGlobal.MutationObserver || lib$es6$promise$asap$$browserGlobal.WebKitMutationObserver;\n var lib$es6$promise$asap$$isNode = typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n // test for web worker but not in IE10\n var lib$es6$promise$asap$$isWorker = typeof Uint8ClampedArray !== 'undefined' &&\n typeof importScripts !== 'undefined' &&\n typeof MessageChannel !== 'undefined';\n\n // node\n function lib$es6$promise$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$es6$promise$asap$$flush);\n };\n }\n\n // vertx\n function lib$es6$promise$asap$$useVertxTimer() {\n return function() {\n lib$es6$promise$asap$$vertxNext(lib$es6$promise$asap$$flush);\n };\n }\n\n function lib$es6$promise$asap$$useMutationObserver() {\n var iterations = 0;\n var observer = new lib$es6$promise$asap$$BrowserMutationObserver(lib$es6$promise$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$es6$promise$asap$$useMessageChannel() {\n var channel = new MessageChannel();\n channel.port1.onmessage = lib$es6$promise$asap$$flush;\n return function () {\n channel.port2.postMessage(0);\n };\n }\n\n function lib$es6$promise$asap$$useSetTimeout() {\n return function() {\n setTimeout(lib$es6$promise$asap$$flush, 1);\n };\n }\n\n var lib$es6$promise$asap$$queue = new Array(1000);\n function lib$es6$promise$asap$$flush() {\n for (var i = 0; i < lib$es6$promise$asap$$len; i+=2) {\n var callback = lib$es6$promise$asap$$queue[i];\n var arg = lib$es6$promise$asap$$queue[i+1];\n\n callback(arg);\n\n lib$es6$promise$asap$$queue[i] = undefined;\n lib$es6$promise$asap$$queue[i+1] = undefined;\n }\n\n lib$es6$promise$asap$$len = 0;\n }\n\n function lib$es6$promise$asap$$attemptVertex() {\n try {\n var r = require;\n var vertx = r('vertx');\n lib$es6$promise$asap$$vertxNext = vertx.runOnLoop || vertx.runOnContext;\n return lib$es6$promise$asap$$useVertxTimer();\n } catch(e) {\n return lib$es6$promise$asap$$useSetTimeout();\n }\n }\n\n var lib$es6$promise$asap$$scheduleFlush;\n // Decide what async method to use to triggering processing of queued callbacks:\n if (lib$es6$promise$asap$$isNode) {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useNextTick();\n } else if (lib$es6$promise$asap$$BrowserMutationObserver) {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMutationObserver();\n } else if (lib$es6$promise$asap$$isWorker) {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMessageChannel();\n } else if (lib$es6$promise$asap$$browserWindow === undefined && typeof require === 'function') {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$attemptVertex();\n } else {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useSetTimeout();\n }\n\n function lib$es6$promise$$internal$$noop() {}\n\n var lib$es6$promise$$internal$$PENDING = void 0;\n var lib$es6$promise$$internal$$FULFILLED = 1;\n var lib$es6$promise$$internal$$REJECTED = 2;\n\n var lib$es6$promise$$internal$$GET_THEN_ERROR = new lib$es6$promise$$internal$$ErrorObject();\n\n function lib$es6$promise$$internal$$selfFullfillment() {\n return new TypeError(\"You cannot resolve a promise with itself\");\n }\n\n function lib$es6$promise$$internal$$cannotReturnOwn() {\n return new TypeError('A promises callback cannot return that same promise.');\n }\n\n function lib$es6$promise$$internal$$getThen(promise) {\n try {\n return promise.then;\n } catch(error) {\n lib$es6$promise$$internal$$GET_THEN_ERROR.error = error;\n return lib$es6$promise$$internal$$GET_THEN_ERROR;\n }\n }\n\n function lib$es6$promise$$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$es6$promise$$internal$$handleForeignThenable(promise, thenable, then) {\n lib$es6$promise$asap$$default(function(promise) {\n var sealed = false;\n var error = lib$es6$promise$$internal$$tryThen(then, thenable, function(value) {\n if (sealed) { return; }\n sealed = true;\n if (thenable !== value) {\n lib$es6$promise$$internal$$resolve(promise, value);\n } else {\n lib$es6$promise$$internal$$fulfill(promise, value);\n }\n }, function(reason) {\n if (sealed) { return; }\n sealed = true;\n\n lib$es6$promise$$internal$$reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && error) {\n sealed = true;\n lib$es6$promise$$internal$$reject(promise, error);\n }\n }, promise);\n }\n\n function lib$es6$promise$$internal$$handleOwnThenable(promise, thenable) {\n if (thenable._state === lib$es6$promise$$internal$$FULFILLED) {\n lib$es6$promise$$internal$$fulfill(promise, thenable._result);\n } else if (thenable._state === lib$es6$promise$$internal$$REJECTED) {\n lib$es6$promise$$internal$$reject(promise, thenable._result);\n } else {\n lib$es6$promise$$internal$$subscribe(thenable, undefined, function(value) {\n lib$es6$promise$$internal$$resolve(promise, value);\n }, function(reason) {\n lib$es6$promise$$internal$$reject(promise, reason);\n });\n }\n }\n\n function lib$es6$promise$$internal$$handleMaybeThenable(promise, maybeThenable) {\n if (maybeThenable.constructor === promise.constructor) {\n lib$es6$promise$$internal$$handleOwnThenable(promise, maybeThenable);\n } else {\n var then = lib$es6$promise$$internal$$getThen(maybeThenable);\n\n if (then === lib$es6$promise$$internal$$GET_THEN_ERROR) {\n lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$GET_THEN_ERROR.error);\n } else if (then === undefined) {\n lib$es6$promise$$internal$$fulfill(promise, maybeThenable);\n } else if (lib$es6$promise$utils$$isFunction(then)) {\n lib$es6$promise$$internal$$handleForeignThenable(promise, maybeThenable, then);\n } else {\n lib$es6$promise$$internal$$fulfill(promise, maybeThenable);\n }\n }\n }\n\n function lib$es6$promise$$internal$$resolve(promise, value) {\n if (promise === value) {\n lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$selfFullfillment());\n } else if (lib$es6$promise$utils$$objectOrFunction(value)) {\n lib$es6$promise$$internal$$handleMaybeThenable(promise, value);\n } else {\n lib$es6$promise$$internal$$fulfill(promise, value);\n }\n }\n\n function lib$es6$promise$$internal$$publishRejection(promise) {\n if (promise._onerror) {\n promise._onerror(promise._result);\n }\n\n lib$es6$promise$$internal$$publish(promise);\n }\n\n function lib$es6$promise$$internal$$fulfill(promise, value) {\n if (promise._state !== lib$es6$promise$$internal$$PENDING) { return; }\n\n promise._result = value;\n promise._state = lib$es6$promise$$internal$$FULFILLED;\n\n if (promise._subscribers.length !== 0) {\n lib$es6$promise$asap$$default(lib$es6$promise$$internal$$publish, promise);\n }\n }\n\n function lib$es6$promise$$internal$$reject(promise, reason) {\n if (promise._state !== lib$es6$promise$$internal$$PENDING) { return; }\n promise._state = lib$es6$promise$$internal$$REJECTED;\n promise._result = reason;\n\n lib$es6$promise$asap$$default(lib$es6$promise$$internal$$publishRejection, promise);\n }\n\n function lib$es6$promise$$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$es6$promise$$internal$$FULFILLED] = onFulfillment;\n subscribers[length + lib$es6$promise$$internal$$REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n lib$es6$promise$asap$$default(lib$es6$promise$$internal$$publish, parent);\n }\n }\n\n function lib$es6$promise$$internal$$publish(promise) {\n var subscribers = promise._subscribers;\n var settled = promise._state;\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$es6$promise$$internal$$invokeCallback(settled, child, callback, detail);\n } else {\n callback(detail);\n }\n }\n\n promise._subscribers.length = 0;\n }\n\n function lib$es6$promise$$internal$$ErrorObject() {\n this.error = null;\n }\n\n var lib$es6$promise$$internal$$TRY_CATCH_ERROR = new lib$es6$promise$$internal$$ErrorObject();\n\n function lib$es6$promise$$internal$$tryCatch(callback, detail) {\n try {\n return callback(detail);\n } catch(e) {\n lib$es6$promise$$internal$$TRY_CATCH_ERROR.error = e;\n return lib$es6$promise$$internal$$TRY_CATCH_ERROR;\n }\n }\n\n function lib$es6$promise$$internal$$invokeCallback(settled, promise, callback, detail) {\n var hasCallback = lib$es6$promise$utils$$isFunction(callback),\n value, error, succeeded, failed;\n\n if (hasCallback) {\n value = lib$es6$promise$$internal$$tryCatch(callback, detail);\n\n if (value === lib$es6$promise$$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$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$cannotReturnOwn());\n return;\n }\n\n } else {\n value = detail;\n succeeded = true;\n }\n\n if (promise._state !== lib$es6$promise$$internal$$PENDING) {\n // noop\n } else if (hasCallback && succeeded) {\n lib$es6$promise$$internal$$resolve(promise, value);\n } else if (failed) {\n lib$es6$promise$$internal$$reject(promise, error);\n } else if (settled === lib$es6$promise$$internal$$FULFILLED) {\n lib$es6$promise$$internal$$fulfill(promise, value);\n } else if (settled === lib$es6$promise$$internal$$REJECTED) {\n lib$es6$promise$$internal$$reject(promise, value);\n }\n }\n\n function lib$es6$promise$$internal$$initializePromise(promise, resolver) {\n try {\n resolver(function resolvePromise(value){\n lib$es6$promise$$internal$$resolve(promise, value);\n }, function rejectPromise(reason) {\n lib$es6$promise$$internal$$reject(promise, reason);\n });\n } catch(e) {\n lib$es6$promise$$internal$$reject(promise, e);\n }\n }\n\n function lib$es6$promise$enumerator$$Enumerator(Constructor, input) {\n var enumerator = this;\n\n enumerator._instanceConstructor = Constructor;\n enumerator.promise = new Constructor(lib$es6$promise$$internal$$noop);\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$es6$promise$$internal$$fulfill(enumerator.promise, enumerator._result);\n } else {\n enumerator.length = enumerator.length || 0;\n enumerator._enumerate();\n if (enumerator._remaining === 0) {\n lib$es6$promise$$internal$$fulfill(enumerator.promise, enumerator._result);\n }\n }\n } else {\n lib$es6$promise$$internal$$reject(enumerator.promise, enumerator._validationError());\n }\n }\n\n lib$es6$promise$enumerator$$Enumerator.prototype._validateInput = function(input) {\n return lib$es6$promise$utils$$isArray(input);\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._validationError = function() {\n return new Error('Array Methods must be provided an Array');\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._init = function() {\n this._result = new Array(this.length);\n };\n\n var lib$es6$promise$enumerator$$default = lib$es6$promise$enumerator$$Enumerator;\n\n lib$es6$promise$enumerator$$Enumerator.prototype._enumerate = function() {\n var enumerator = this;\n\n var length = enumerator.length;\n var promise = enumerator.promise;\n var input = enumerator._input;\n\n for (var i = 0; promise._state === lib$es6$promise$$internal$$PENDING && i < length; i++) {\n enumerator._eachEntry(input[i], i);\n }\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._eachEntry = function(entry, i) {\n var enumerator = this;\n var c = enumerator._instanceConstructor;\n\n if (lib$es6$promise$utils$$isMaybeThenable(entry)) {\n if (entry.constructor === c && entry._state !== lib$es6$promise$$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] = entry;\n }\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._settledAt = function(state, i, value) {\n var enumerator = this;\n var promise = enumerator.promise;\n\n if (promise._state === lib$es6$promise$$internal$$PENDING) {\n enumerator._remaining--;\n\n if (state === lib$es6$promise$$internal$$REJECTED) {\n lib$es6$promise$$internal$$reject(promise, value);\n } else {\n enumerator._result[i] = value;\n }\n }\n\n if (enumerator._remaining === 0) {\n lib$es6$promise$$internal$$fulfill(promise, enumerator._result);\n }\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._willSettleAt = function(promise, i) {\n var enumerator = this;\n\n lib$es6$promise$$internal$$subscribe(promise, undefined, function(value) {\n enumerator._settledAt(lib$es6$promise$$internal$$FULFILLED, i, value);\n }, function(reason) {\n enumerator._settledAt(lib$es6$promise$$internal$$REJECTED, i, reason);\n });\n };\n function lib$es6$promise$promise$all$$all(entries) {\n return new lib$es6$promise$enumerator$$default(this, entries).promise;\n }\n var lib$es6$promise$promise$all$$default = lib$es6$promise$promise$all$$all;\n function lib$es6$promise$promise$race$$race(entries) {\n /*jshint validthis:true */\n var Constructor = this;\n\n var promise = new Constructor(lib$es6$promise$$internal$$noop);\n\n if (!lib$es6$promise$utils$$isArray(entries)) {\n lib$es6$promise$$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$es6$promise$$internal$$resolve(promise, value);\n }\n\n function onRejection(reason) {\n lib$es6$promise$$internal$$reject(promise, reason);\n }\n\n for (var i = 0; promise._state === lib$es6$promise$$internal$$PENDING && i < length; i++) {\n lib$es6$promise$$internal$$subscribe(Constructor.resolve(entries[i]), undefined, onFulfillment, onRejection);\n }\n\n return promise;\n }\n var lib$es6$promise$promise$race$$default = lib$es6$promise$promise$race$$race;\n function lib$es6$promise$promise$resolve$$resolve(object) {\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$es6$promise$$internal$$noop);\n lib$es6$promise$$internal$$resolve(promise, object);\n return promise;\n }\n var lib$es6$promise$promise$resolve$$default = lib$es6$promise$promise$resolve$$resolve;\n function lib$es6$promise$promise$reject$$reject(reason) {\n /*jshint validthis:true */\n var Constructor = this;\n var promise = new Constructor(lib$es6$promise$$internal$$noop);\n lib$es6$promise$$internal$$reject(promise, reason);\n return promise;\n }\n var lib$es6$promise$promise$reject$$default = lib$es6$promise$promise$reject$$reject;\n\n var lib$es6$promise$promise$$counter = 0;\n\n function lib$es6$promise$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$es6$promise$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 var lib$es6$promise$promise$$default = lib$es6$promise$promise$$Promise;\n /**\n Promise objects represent the eventual result of an asynchronous operation. The\n primary way of interacting with a promise is through its `then` method, which\n registers callbacks to receive either a promise’s eventual value or the reason\n why the promise cannot be fulfilled.\n\n Terminology\n -----------\n\n - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n - `thenable` is an object or function that defines a `then` method.\n - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n - `exception` is a value that is thrown using the throw statement.\n - `reason` is a value that indicates why a promise was rejected.\n - `settled` the final resting state of a promise, fulfilled or rejected.\n\n A promise can be in one of three states: pending, fulfilled, or rejected.\n\n Promises that are fulfilled have a fulfillment value and are in the fulfilled\n state. Promises that are rejected have a rejection reason and are in the\n rejected state. A fulfillment value is never a thenable.\n\n Promises can also be said to *resolve* a value. If this value is also a\n promise, then the original promise's settled state will match the value's\n settled state. So a promise that *resolves* a promise that rejects will\n itself reject, and a promise that *resolves* a promise that fulfills will\n itself fulfill.\n\n\n Basic Usage:\n ------------\n\n ```js\n var promise = new Promise(function(resolve, reject) {\n // on success\n resolve(value);\n\n // on failure\n reject(reason);\n });\n\n promise.then(function(value) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Advanced Usage:\n ---------------\n\n Promises shine when abstracting away asynchronous interactions such as\n `XMLHttpRequest`s.\n\n ```js\n function getJSON(url) {\n return new Promise(function(resolve, reject){\n var xhr = new XMLHttpRequest();\n\n xhr.open('GET', url);\n xhr.onreadystatechange = handler;\n xhr.responseType = 'json';\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send();\n\n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200) {\n resolve(this.response);\n } else {\n reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n }\n }\n };\n });\n }\n\n getJSON('/posts.json').then(function(json) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Unlike callbacks, promises are great composable primitives.\n\n ```js\n Promise.all([\n getJSON('/posts'),\n getJSON('/comments')\n ]).then(function(values){\n values[0] // => postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class Promise\n @param {function} resolver\n Useful for tooling.\n @constructor\n */\n function lib$es6$promise$promise$$Promise(resolver) {\n this._id = lib$es6$promise$promise$$counter++;\n this._state = undefined;\n this._result = undefined;\n this._subscribers = [];\n\n if (lib$es6$promise$$internal$$noop !== resolver) {\n if (!lib$es6$promise$utils$$isFunction(resolver)) {\n lib$es6$promise$promise$$needsResolver();\n }\n\n if (!(this instanceof lib$es6$promise$promise$$Promise)) {\n lib$es6$promise$promise$$needsNew();\n }\n\n lib$es6$promise$$internal$$initializePromise(this, resolver);\n }\n }\n\n lib$es6$promise$promise$$Promise.all = lib$es6$promise$promise$all$$default;\n lib$es6$promise$promise$$Promise.race = lib$es6$promise$promise$race$$default;\n lib$es6$promise$promise$$Promise.resolve = lib$es6$promise$promise$resolve$$default;\n lib$es6$promise$promise$$Promise.reject = lib$es6$promise$promise$reject$$default;\n lib$es6$promise$promise$$Promise._setScheduler = lib$es6$promise$asap$$setScheduler;\n lib$es6$promise$promise$$Promise._asap = lib$es6$promise$asap$$default;\n\n lib$es6$promise$promise$$Promise.prototype = {\n constructor: lib$es6$promise$promise$$Promise,\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 Useful for tooling.\n @return {Promise}\n */\n then: function(onFulfillment, onRejection) {\n var parent = this;\n var state = parent._state;\n\n if (state === lib$es6$promise$$internal$$FULFILLED && !onFulfillment || state === lib$es6$promise$$internal$$REJECTED && !onRejection) {\n return this;\n }\n\n var child = new this.constructor(lib$es6$promise$$internal$$noop);\n var result = parent._result;\n\n if (state) {\n var callback = arguments[state - 1];\n lib$es6$promise$asap$$default(function(){\n lib$es6$promise$$internal$$invokeCallback(state, child, callback, result);\n });\n } else {\n lib$es6$promise$$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 Useful for tooling.\n @return {Promise}\n */\n 'catch': function(onRejection) {\n return this.then(null, onRejection);\n }\n };\n function lib$es6$promise$polyfill$$polyfill() {\n var local;\n\n if (typeof global !== 'undefined') {\n local = global;\n } else if (typeof self !== 'undefined') {\n local = self;\n } else {\n try {\n local = Function('return this')();\n } catch (e) {\n throw new Error('polyfill failed because global object is unavailable in this environment');\n }\n }\n\n var P = local.Promise;\n\n if (P && Object.prototype.toString.call(P.resolve()) === '[object Promise]' && !P.cast) {\n return;\n }\n\n local.Promise = lib$es6$promise$promise$$default;\n }\n var lib$es6$promise$polyfill$$default = lib$es6$promise$polyfill$$polyfill;\n\n var lib$es6$promise$umd$$ES6Promise = {\n 'Promise': lib$es6$promise$promise$$default,\n 'polyfill': lib$es6$promise$polyfill$$default\n };\n\n /* global define:true module:true window: true */\n if (typeof define === 'function' && define['amd']) {\n define(function() { return lib$es6$promise$umd$$ES6Promise; });\n } else if (typeof module !== 'undefined' && module['exports']) {\n module['exports'] = lib$es6$promise$umd$$ES6Promise;\n } else if (typeof this !== 'undefined') {\n this['ES6Promise'] = lib$es6$promise$umd$$ES6Promise;\n }\n\n lib$es6$promise$polyfill$$default();\n}).call(this);\n\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./bower_components/es6-promise/promise.js\n ** module id = 4\n ** module chunks = 0\n **/","var nextTick = require('process/browser.js').nextTick;\nvar apply = Function.prototype.apply;\nvar slice = Array.prototype.slice;\nvar immediateIds = {};\nvar nextImmediateId = 0;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n return new Timeout(apply.call(setInterval, window, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) { timeout.close(); };\n\nfunction Timeout(id, clearFn) {\n this._id = id;\n this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n this._clearFn.call(window, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n clearTimeout(item._idleTimeoutId);\n\n var msecs = item._idleTimeout;\n if (msecs >= 0) {\n item._idleTimeoutId = setTimeout(function onTimeout() {\n if (item._onTimeout)\n item._onTimeout();\n }, msecs);\n }\n};\n\n// That's not how node.js implements it but the exposed api is the same.\nexports.setImmediate = typeof setImmediate === \"function\" ? setImmediate : function(fn) {\n var id = nextImmediateId++;\n var args = arguments.length < 2 ? false : slice.call(arguments, 1);\n\n immediateIds[id] = true;\n\n nextTick(function onNextTick() {\n if (immediateIds[id]) {\n // fn.call() is faster so we optimize for the common use-case\n // @see http://jsperf.com/call-apply-segu\n if (args) {\n fn.apply(null, args);\n } else {\n fn.call(null);\n }\n // Prevent ids from leaking\n exports.clearImmediate(id);\n }\n });\n\n return id;\n};\n\nexports.clearImmediate = typeof clearImmediate === \"function\" ? clearImmediate : function(id) {\n delete immediateIds[id];\n};\n\n\n/*****************\n ** WEBPACK FOOTER\n ** (webpack)/~/node-libs-browser/~/timers-browserify/main.js\n ** module id = 5\n ** module chunks = 0\n **/","// shim for using process in browser\n\nvar process = module.exports = {};\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = setTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n clearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n setTimeout(drainQueue, 0);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** (webpack)/~/node-libs-browser/~/process/browser.js\n ** module id = 6\n ** module chunks = 0\n **/","module.exports = function(module) {\r\n\tif(!module.webpackPolyfill) {\r\n\t\tmodule.deprecate = function() {};\r\n\t\tmodule.paths = [];\r\n\t\t// module.parent = undefined by default\r\n\t\tmodule.children = [];\r\n\t\tmodule.webpackPolyfill = 1;\r\n\t}\r\n\treturn module;\r\n}\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** (webpack)/buildin/module.js\n ** module id = 7\n ** module chunks = 0\n **/","module.exports = function() { throw new Error(\"define cannot be used indirect\"); };\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** (webpack)/buildin/amd-define.js\n ** module id = 8\n ** module chunks = 0\n **/","(function() {\n 'use strict';\n\n if (self.fetch) {\n return\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n }\n\n function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var list = this.map[name]\n if (!list) {\n list = []\n this.map[name] = list\n }\n list.push(value)\n }\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n }\n\n Headers.prototype.get = function(name) {\n var values = this.map[normalizeName(name)]\n return values ? values[0] : null\n }\n\n Headers.prototype.getAll = function(name) {\n return this.map[normalizeName(name)] || []\n }\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n }\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = [normalizeValue(value)]\n }\n\n Headers.prototype.forEach = function(callback, thisArg) {\n Object.getOwnPropertyNames(this.map).forEach(function(name) {\n this.map[name].forEach(function(value) {\n callback.call(thisArg, value, name, this)\n }, this)\n }, this)\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n reader.readAsArrayBuffer(blob)\n return fileReaderReady(reader)\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader()\n reader.readAsText(blob)\n return fileReaderReady(reader)\n }\n\n var support = {\n blob: 'FileReader' in self && 'Blob' in self && (function() {\n try {\n new Blob();\n return true\n } catch(e) {\n return false\n }\n })(),\n formData: 'FormData' in self\n }\n\n function Body() {\n this.bodyUsed = false\n\n\n this._initBody = function(body) {\n this._bodyInit = body\n if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (!body) {\n this._bodyText = ''\n } else {\n throw new Error('unsupported BodyInit type')\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n } else {\n this.text = function() {\n var rejected = consumed(this)\n return rejected ? rejected : Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return (methods.indexOf(upcased) > -1) ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {}\n var body = options.body\n if (Request.prototype.isPrototypeOf(input)) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n if (!body) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n } else {\n this.url = input\n }\n\n this.credentials = options.credentials || this.credentials || 'omit'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n }\n\n function decode(body) {\n var form = new FormData()\n body.trim().split('&').forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n }\n\n function headers(xhr) {\n var head = new Headers()\n var pairs = xhr.getAllResponseHeaders().trim().split('\\n')\n pairs.forEach(function(header) {\n var split = header.trim().split(':')\n var key = split.shift().trim()\n var value = split.join(':').trim()\n head.append(key, value)\n })\n return head\n }\n\n Body.call(Request.prototype)\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {}\n }\n\n this._initBody(bodyInit)\n this.type = 'default'\n this.url = null\n this.status = options.status\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = options.statusText\n this.headers = options.headers instanceof Headers ? options.headers : new Headers(options.headers)\n this.url = options.url || ''\n }\n\n Body.call(Response.prototype)\n\n self.Headers = Headers;\n self.Request = Request;\n self.Response = Response;\n\n self.fetch = function(input, init) {\n var request\n if (Request.prototype.isPrototypeOf(input) && !init) {\n request = input\n } else {\n request = new Request(input, init)\n }\n\n return new Promise(function(resolve, reject) {\n var xhr = new XMLHttpRequest()\n\n function responseURL() {\n if ('responseURL' in xhr) {\n return xhr.responseURL\n }\n\n // Avoid security warnings on getResponseHeader when not allowed by CORS\n if (/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())) {\n return xhr.getResponseHeader('X-Request-URL')\n }\n\n return;\n }\n\n xhr.onload = function() {\n var status = (xhr.status === 1223) ? 204 : xhr.status\n if (status < 100 || status > 599) {\n reject(new TypeError('Network request failed'))\n return\n }\n var options = {\n status: status,\n statusText: xhr.statusText,\n headers: headers(xhr),\n url: responseURL()\n }\n var body = 'response' in xhr ? xhr.response : xhr.responseText;\n resolve(new Response(body, options))\n }\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.open(request.method, request.url, true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob'\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n }\n self.fetch.polyfill = true\n})();\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./bower_components/fetch/fetch.js\n ** module id = 9\n ** module chunks = 0\n **/","// Version: 3.7.14\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n/* =-========================= JSON =============================-= */\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n\n(window['JSON'] && window['JSON']['stringify']) || (function () {\n window['JSON'] || (window['JSON'] = {});\n\n function toJSON(key) {\n try { return this.valueOf() }\n catch(e) { return null }\n }\n\n var cx = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n escapable = /[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n gap,\n indent,\n meta = { // table of character substitutions\n '\\b': '\\\\b',\n '\\t': '\\\\t',\n '\\n': '\\\\n',\n '\\f': '\\\\f',\n '\\r': '\\\\r',\n '\"' : '\\\\\"',\n '\\\\': '\\\\\\\\'\n },\n rep;\n\n function quote(string) {\n escapable.lastIndex = 0;\n return escapable.test(string) ?\n '\"' + string.replace(escapable, function (a) {\n var c = meta[a];\n return typeof c === 'string' ? c :\n '\\\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n }) + '\"' :\n '\"' + string + '\"';\n }\n\n function str(key, holder) {\n var i, // The loop counter.\n k, // The member key.\n v, // The member value.\n length,\n partial,\n mind = gap,\n value = holder[key];\n\n if (value && typeof value === 'object') {\n value = toJSON.call( value, key );\n }\n\n if (typeof rep === 'function') {\n value = rep.call(holder, key, value);\n }\n\n switch (typeof value) {\n case 'string':\n return quote(value);\n\n case 'number':\n return isFinite(value) ? String(value) : 'null';\n\n case 'boolean':\n case 'null':\n return String(value);\n\n case 'object':\n\n if (!value) {\n return 'null';\n }\n\n gap += indent;\n partial = [];\n\n if (Object.prototype.toString.apply(value) === '[object Array]') {\n\n length = value.length;\n for (i = 0; i < length; i += 1) {\n partial[i] = str(i, value) || 'null';\n }\n\n v = partial.length === 0 ? '[]' :\n gap ? '[\\n' + gap +\n partial.join(',\\n' + gap) + '\\n' +\n mind + ']' :\n '[' + partial.join(',') + ']';\n gap = mind;\n return v;\n }\n if (rep && typeof rep === 'object') {\n length = rep.length;\n for (i = 0; i < length; i += 1) {\n k = rep[i];\n if (typeof k === 'string') {\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? ': ' : ':') + v);\n }\n }\n }\n } else {\n for (k in value) {\n if (Object.hasOwnProperty.call(value, k)) {\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? ': ' : ':') + v);\n }\n }\n }\n }\n\n v = partial.length === 0 ? '{}' :\n gap ? '{\\n' + gap + partial.join(',\\n' + gap) + '\\n' +\n mind + '}' : '{' + partial.join(',') + '}';\n gap = mind;\n return v;\n }\n }\n\n if (typeof JSON['stringify'] !== 'function') {\n JSON['stringify'] = function (value, replacer, space) {\n var i;\n gap = '';\n indent = '';\n\n if (typeof space === 'number') {\n for (i = 0; i < space; i += 1) {\n indent += ' ';\n }\n } else if (typeof space === 'string') {\n indent = space;\n }\n rep = replacer;\n if (replacer && typeof replacer !== 'function' &&\n (typeof replacer !== 'object' ||\n typeof replacer.length !== 'number')) {\n throw new Error('JSON.stringify');\n }\n return str('', {'': value});\n };\n }\n\n if (typeof JSON['parse'] !== 'function') {\n // JSON is parsed on the server for security.\n JSON['parse'] = function (text) {return eval('('+text+')')};\n }\n}());\nvar NOW = 1\n, READY = false\n, READY_BUFFER = []\n, PRESENCE_SUFFIX = '-pnpres'\n, DEF_WINDOWING = 10 // MILLISECONDS.\n, DEF_TIMEOUT = 10000 // MILLISECONDS.\n, DEF_SUB_TIMEOUT = 310 // SECONDS.\n, DEF_KEEPALIVE = 60 // SECONDS (FOR TIMESYNC).\n, SECOND = 1000 // A THOUSAND MILLISECONDS.\n, URLBIT = '/'\n, PARAMSBIT = '&'\n, PRESENCE_HB_THRESHOLD = 5\n, PRESENCE_HB_DEFAULT = 30\n, SDK_VER = '3.7.14'\n, REPL = /{([\\w\\-]+)}/g;\n\n/**\n * UTILITIES\n */\nfunction unique() { return'x'+ ++NOW+''+(+new Date) }\nfunction rnow() { return+new Date }\n\n/**\n * NEXTORIGIN\n * ==========\n * var next_origin = nextorigin();\n */\nvar nextorigin = (function() {\n var max = 20\n , ori = Math.floor(Math.random() * max);\n return function( origin, failover ) {\n return origin.indexOf('pubsub.') > 0\n && origin.replace(\n 'pubsub', 'ps' + (\n failover ? generate_uuid().split('-')[0] :\n (++ori < max? ori : ori=1)\n ) ) || origin;\n }\n})();\n\n\n/**\n * Build Url\n * =======\n *\n */\nfunction build_url( url_components, url_params ) {\n var url = url_components.join(URLBIT)\n , params = [];\n\n if (!url_params) return url;\n\n each( url_params, function( key, value ) {\n var value_str = (typeof value == 'object')?JSON['stringify'](value):value;\n (typeof value != 'undefined' &&\n value != null && encode(value_str).length > 0\n ) && params.push(key + \"=\" + encode(value_str));\n } );\n\n url += \"?\" + params.join(PARAMSBIT);\n return url;\n}\n\n/**\n * UPDATER\n * =======\n * var timestamp = unique();\n */\nfunction updater( fun, rate ) {\n var timeout\n , last = 0\n , runnit = function() {\n if (last + rate > rnow()) {\n clearTimeout(timeout);\n timeout = setTimeout( runnit, rate );\n }\n else {\n last = rnow();\n fun();\n }\n };\n\n return runnit;\n}\n\n/**\n * GREP\n * ====\n * var list = grep( [1,2,3], function(item) { return item % 2 } )\n */\nfunction grep( list, fun ) {\n var fin = [];\n each( list || [], function(l) { fun(l) && fin.push(l) } );\n return fin\n}\n\n/**\n * SUPPLANT\n * ========\n * var text = supplant( 'Hello {name}!', { name : 'John' } )\n */\nfunction supplant( str, values ) {\n return str.replace( REPL, function( _, match ) {\n return values[match] || _\n } );\n}\n\n/**\n * timeout\n * =======\n * timeout( function(){}, 100 );\n */\nfunction timeout( fun, wait ) {\n return setTimeout( fun, wait );\n}\n\n/**\n * uuid\n * ====\n * var my_uuid = generate_uuid();\n */\nfunction generate_uuid(callback) {\n var u = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,\n function(c) {\n var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);\n return v.toString(16);\n });\n if (callback) callback(u);\n return u;\n}\n\nfunction isArray(arg) {\n return !!arg && typeof arg !== 'string' && (Array.isArray && Array.isArray(arg) || typeof(arg.length) === \"number\")\n //return !!arg && (Array.isArray && Array.isArray(arg) || typeof(arg.length) === \"number\")\n}\n\n/**\n * EACH\n * ====\n * each( [1,2,3], function(item) { } )\n */\nfunction each( o, f) {\n if ( !o || !f ) return;\n\n if ( isArray(o) )\n for ( var i = 0, l = o.length; i < l; )\n f.call( o[i], o[i], i++ );\n else\n for ( var i in o )\n o.hasOwnProperty &&\n o.hasOwnProperty(i) &&\n f.call( o[i], i, o[i] );\n}\n\n/**\n * MAP\n * ===\n * var list = map( [1,2,3], function(item) { return item + 1 } )\n */\nfunction map( list, fun ) {\n var fin = [];\n each( list || [], function( k, v ) { fin.push(fun( k, v )) } );\n return fin;\n}\n\n\nfunction pam_encode(str) {\n return encodeURIComponent(str).replace(/[!'()*~]/g, function(c) {\n return '%' + c.charCodeAt(0).toString(16).toUpperCase();\n });\n}\n\n/**\n * ENCODE\n * ======\n * var encoded_data = encode('path');\n */\nfunction encode(path) { return encodeURIComponent(path) }\n\n/**\n * Generate Subscription Channel List\n * ==================================\n * generate_channel_list(channels_object);\n */\nfunction generate_channel_list(channels, nopresence) {\n var list = [];\n each( channels, function( channel, status ) {\n if (nopresence) {\n if(channel.search('-pnpres') < 0) {\n if (status.subscribed) list.push(channel);\n }\n } else {\n if (status.subscribed) list.push(channel);\n }\n });\n return list.sort();\n}\n\n/**\n * Generate Subscription Channel Groups List\n * ==================================\n * generate_channel_group_list(channels_groups object);\n */\nfunction generate_channel_group_list(channel_groups, nopresence) {\n var list = [];\n each(channel_groups, function( channel_group, status ) {\n if (nopresence) {\n if(channel_group.search('-pnpres') < 0) {\n if (status.subscribed) list.push(channel_group);\n }\n } else {\n if (status.subscribed) list.push(channel_group);\n }\n });\n return list.sort();\n}\n\n// PUBNUB READY TO CONNECT\nfunction ready() { timeout( function() {\n if (READY) return;\n READY = 1;\n each( READY_BUFFER, function(connect) { connect() } );\n}, SECOND ); }\n\nfunction PNmessage(args) {\n msg = args || {'apns' : {}},\n msg['getPubnubMessage'] = function() {\n var m = {};\n\n if (Object.keys(msg['apns']).length) {\n m['pn_apns'] = {\n 'aps' : {\n 'alert' : msg['apns']['alert'] ,\n 'badge' : msg['apns']['badge']\n }\n }\n for (var k in msg['apns']) {\n m['pn_apns'][k] = msg['apns'][k];\n }\n var exclude1 = ['badge','alert'];\n for (var k in exclude1) {\n delete m['pn_apns'][exclude1[k]];\n }\n }\n\n\n\n if (msg['gcm']) {\n m['pn_gcm'] = {\n 'data' : msg['gcm']\n }\n }\n\n for (var k in msg) {\n m[k] = msg[k];\n }\n var exclude = ['apns','gcm','publish', 'channel','callback','error'];\n for (var k in exclude) {\n delete m[exclude[k]];\n }\n\n return m;\n };\n msg['publish'] = function() {\n\n var m = msg.getPubnubMessage();\n\n if (msg['pubnub'] && msg['channel']) {\n msg['pubnub'].publish({\n 'message' : m,\n 'channel' : msg['channel'],\n 'callback' : msg['callback'],\n 'error' : msg['error']\n })\n }\n };\n return msg;\n}\n\nfunction PN_API(setup) {\n var SUB_WINDOWING = +setup['windowing'] || DEF_WINDOWING\n , SUB_TIMEOUT = (+setup['timeout'] || DEF_SUB_TIMEOUT) * SECOND\n , KEEPALIVE = (+setup['keepalive'] || DEF_KEEPALIVE) * SECOND\n , TIME_CHECK = setup['timecheck'] || 0\n , NOLEAVE = setup['noleave'] || 0\n , PUBLISH_KEY = setup['publish_key']\n , SUBSCRIBE_KEY = setup['subscribe_key']\n , AUTH_KEY = setup['auth_key'] || ''\n , SECRET_KEY = setup['secret_key'] || ''\n , hmac_SHA256 = setup['hmac_SHA256']\n , SSL = setup['ssl'] ? 's' : ''\n , ORIGIN = 'http'+SSL+'://'+(setup['origin']||'pubsub.pubnub.com')\n , STD_ORIGIN = nextorigin(ORIGIN)\n , SUB_ORIGIN = nextorigin(ORIGIN)\n , CONNECT = function(){}\n , PUB_QUEUE = []\n , CLOAK = true\n , TIME_DRIFT = 0\n , SUB_CALLBACK = 0\n , SUB_CHANNEL = 0\n , SUB_RECEIVER = 0\n , SUB_RESTORE = setup['restore'] || 0\n , SUB_BUFF_WAIT = 0\n , TIMETOKEN = 0\n , RESUMED = false\n , CHANNELS = {}\n , CHANNEL_GROUPS = {}\n , SUB_ERROR = function(){}\n , STATE = {}\n , PRESENCE_HB_TIMEOUT = null\n , PRESENCE_HB = validate_presence_heartbeat(\n setup['heartbeat'] || setup['pnexpires'] || 0, setup['error']\n )\n , PRESENCE_HB_INTERVAL = setup['heartbeat_interval'] || (PRESENCE_HB / 2) -1\n , PRESENCE_HB_RUNNING = false\n , NO_WAIT_FOR_PENDING = setup['no_wait_for_pending']\n , COMPATIBLE_35 = setup['compatible_3.5'] || false\n , xdr = setup['xdr']\n , params = setup['params'] || {}\n , error = setup['error'] || function() {}\n , _is_online = setup['_is_online'] || function() { return 1 }\n , jsonp_cb = setup['jsonp_cb'] || function() { return 0 }\n , db = setup['db'] || {'get': function(){}, 'set': function(){}}\n , CIPHER_KEY = setup['cipher_key']\n , UUID = setup['uuid'] || ( !setup['unique_uuid'] && db && db['get'](SUBSCRIBE_KEY+'uuid') || '')\n , USE_INSTANCEID = setup['instance_id'] || false\n , INSTANCEID = ''\n , shutdown = setup['shutdown']\n , use_send_beacon = (typeof setup['use_send_beacon'] != 'undefined')?setup['use_send_beacon']:true\n , sendBeacon = (use_send_beacon)?setup['sendBeacon']:null\n , _poll_timer\n , _poll_timer2;\n\n if (PRESENCE_HB === 2) PRESENCE_HB_INTERVAL = 1;\n\n var crypto_obj = setup['crypto_obj'] ||\n {\n 'encrypt' : function(a,key){ return a},\n 'decrypt' : function(b,key){return b}\n };\n\n function _get_url_params(data) {\n if (!data) data = {};\n each( params , function( key, value ) {\n if (!(key in data)) data[key] = value;\n });\n return data;\n }\n\n function _object_to_key_list(o) {\n var l = []\n each( o , function( key, value ) {\n l.push(key);\n });\n return l;\n }\n function _object_to_key_list_sorted(o) {\n return _object_to_key_list(o).sort();\n }\n\n function _get_pam_sign_input_from_params(params) {\n var si = \"\";\n var l = _object_to_key_list_sorted(params);\n\n for (var i in l) {\n var k = l[i]\n si += k + \"=\" + pam_encode(params[k]) ;\n if (i != l.length - 1) si += \"&\"\n }\n return si;\n }\n\n function validate_presence_heartbeat(heartbeat, cur_heartbeat, error) {\n var err = false;\n\n if (typeof heartbeat === 'undefined') {\n return cur_heartbeat;\n }\n\n if (typeof heartbeat === 'number') {\n if (heartbeat > PRESENCE_HB_THRESHOLD || heartbeat == 0)\n err = false;\n else\n err = true;\n } else if(typeof heartbeat === 'boolean'){\n if (!heartbeat) {\n return 0;\n } else {\n return PRESENCE_HB_DEFAULT;\n }\n } else {\n err = true;\n }\n\n if (err) {\n error && error(\"Presence Heartbeat value invalid. Valid range ( x > \" + PRESENCE_HB_THRESHOLD + \" or x = 0). Current Value : \" + (cur_heartbeat || PRESENCE_HB_THRESHOLD));\n return cur_heartbeat || PRESENCE_HB_THRESHOLD;\n } else return heartbeat;\n }\n\n function encrypt(input, key) {\n return crypto_obj['encrypt'](input, key || CIPHER_KEY) || input;\n }\n function decrypt(input, key) {\n return crypto_obj['decrypt'](input, key || CIPHER_KEY) ||\n crypto_obj['decrypt'](input, CIPHER_KEY) ||\n input;\n }\n\n function error_common(message, callback) {\n callback && callback({ 'error' : message || \"error occurred\"});\n error && error(message);\n }\n function _presence_heartbeat() {\n\n clearTimeout(PRESENCE_HB_TIMEOUT);\n\n if (!PRESENCE_HB_INTERVAL || PRESENCE_HB_INTERVAL >= 500 ||\n PRESENCE_HB_INTERVAL < 1 ||\n (!generate_channel_list(CHANNELS,true).length && !generate_channel_group_list(CHANNEL_GROUPS, true).length ) )\n {\n PRESENCE_HB_RUNNING = false;\n return;\n }\n\n PRESENCE_HB_RUNNING = true;\n SELF['presence_heartbeat']({\n 'callback' : function(r) {\n PRESENCE_HB_TIMEOUT = timeout( _presence_heartbeat, (PRESENCE_HB_INTERVAL) * SECOND );\n },\n 'error' : function(e) {\n error && error(\"Presence Heartbeat unable to reach Pubnub servers.\" + JSON.stringify(e));\n PRESENCE_HB_TIMEOUT = timeout( _presence_heartbeat, (PRESENCE_HB_INTERVAL) * SECOND );\n }\n });\n }\n\n function start_presence_heartbeat() {\n !PRESENCE_HB_RUNNING && _presence_heartbeat();\n }\n\n function publish(next) {\n\n if (NO_WAIT_FOR_PENDING) {\n if (!PUB_QUEUE.length) return;\n } else {\n if (next) PUB_QUEUE.sending = 0;\n if ( PUB_QUEUE.sending || !PUB_QUEUE.length ) return;\n PUB_QUEUE.sending = 1;\n }\n\n xdr(PUB_QUEUE.shift());\n }\n function each_channel_group(callback) {\n var count = 0;\n\n each( generate_channel_group_list(CHANNEL_GROUPS), function(channel_group) {\n var chang = CHANNEL_GROUPS[channel_group];\n\n if (!chang) return;\n\n count++;\n (callback||function(){})(chang);\n } );\n\n return count;\n }\n\n function each_channel(callback) {\n var count = 0;\n\n each( generate_channel_list(CHANNELS), function(channel) {\n var chan = CHANNELS[channel];\n\n if (!chan) return;\n\n count++;\n (callback||function(){})(chan);\n } );\n\n return count;\n }\n function _invoke_callback(response, callback, err) {\n if (typeof response == 'object') {\n if (response['error']) {\n var callback_data = {};\n\n if (response['message']) {\n callback_data['message'] = response['message'];\n }\n\n if (response['payload']) {\n callback_data['payload'] = response['payload'];\n }\n\n err && err(callback_data);\n return;\n\n }\n if (response['payload']) {\n if (response['next_page'])\n callback && callback(response['payload'], response['next_page']);\n else\n callback && callback(response['payload']);\n return;\n }\n }\n callback && callback(response);\n }\n\n function _invoke_error(response,err) {\n\n if (typeof response == 'object' && response['error']) {\n var callback_data = {};\n\n if (response['message']) {\n callback_data['message'] = response['message'];\n }\n\n if (response['payload']) {\n callback_data['payload'] = response['payload'];\n }\n \n err && err(callback_data);\n return;\n } else {\n err && err(response);\n }\n }\n function CR(args, callback, url1, data) {\n var callback = args['callback'] || callback\n , err = args['error'] || error\n , jsonp = jsonp_cb();\n\n data = data || {};\n \n if (!data['auth']) {\n data['auth'] = args['auth_key'] || AUTH_KEY;\n }\n \n var url = [\n STD_ORIGIN, 'v1', 'channel-registration',\n 'sub-key', SUBSCRIBE_KEY\n ];\n\n url.push.apply(url,url1);\n \n if (jsonp) data['callback'] = jsonp;\n \n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : url\n });\n\n }\n\n // Announce Leave Event\n var SELF = {\n 'LEAVE' : function( channel, blocking, auth_key, callback, error ) {\n\n var data = { 'uuid' : UUID, 'auth' : auth_key || AUTH_KEY }\n , origin = nextorigin(ORIGIN)\n , callback = callback || function(){}\n , err = error || function(){}\n , url\n , jsonp = jsonp_cb();\n\n\n\n // Prevent Leaving a Presence Channel\n if (channel.indexOf(PRESENCE_SUFFIX) > 0) return true;\n\n\n\n\n if (COMPATIBLE_35) {\n if (!SSL) return false;\n if (jsonp == '0') return false;\n }\n\n if (NOLEAVE) return false;\n\n if (jsonp != '0') data['callback'] = jsonp;\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n url = [\n origin, 'v2', 'presence', 'sub_key',\n SUBSCRIBE_KEY, 'channel', encode(channel), 'leave'\n ];\n\n params = _get_url_params(data);\n\n\n if (sendBeacon) {\n url_string = build_url(url, params);\n if (sendBeacon(url_string)) {\n callback && callback({\"status\": 200, \"action\": \"leave\", \"message\": \"OK\", \"service\": \"Presence\"});\n return true;\n }\n }\n\n\n xdr({\n blocking : blocking || SSL,\n timeout : 2000,\n callback : jsonp,\n data : params,\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : url\n });\n return true;\n },\n 'LEAVE_GROUP' : function( channel_group, blocking, auth_key, callback, error ) {\n\n var data = { 'uuid' : UUID, 'auth' : auth_key || AUTH_KEY }\n , origin = nextorigin(ORIGIN)\n , callback = callback || function(){}\n , err = error || function(){}\n , jsonp = jsonp_cb();\n\n // Prevent Leaving a Presence Channel Group\n if (channel_group.indexOf(PRESENCE_SUFFIX) > 0) return true;\n\n if (COMPATIBLE_35) {\n if (!SSL) return false;\n if (jsonp == '0') return false;\n }\n\n if (NOLEAVE) return false;\n\n if (jsonp != '0') data['callback'] = jsonp;\n\n if (channel_group && channel_group.length > 0) data['channel-group'] = channel_group;\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n blocking : blocking || SSL,\n timeout : 5000,\n callback : jsonp,\n data : _get_url_params(data),\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : [\n origin, 'v2', 'presence', 'sub_key',\n SUBSCRIBE_KEY, 'channel', encode(','), 'leave'\n ]\n });\n return true;\n },\n 'set_resumed' : function(resumed) {\n RESUMED = resumed;\n },\n 'get_cipher_key' : function() {\n return CIPHER_KEY;\n },\n 'set_cipher_key' : function(key) {\n CIPHER_KEY = key;\n },\n 'raw_encrypt' : function(input, key) {\n return encrypt(input, key);\n },\n 'raw_decrypt' : function(input, key) {\n return decrypt(input, key);\n },\n 'get_heartbeat' : function() {\n return PRESENCE_HB;\n },\n \n 'set_heartbeat' : function(heartbeat, heartbeat_interval) {\n PRESENCE_HB = validate_presence_heartbeat(heartbeat, PRESENCE_HB, error);\n PRESENCE_HB_INTERVAL = heartbeat_interval || (PRESENCE_HB / 2) - 1;\n if (PRESENCE_HB == 2) {\n PRESENCE_HB_INTERVAL = 1;\n }\n CONNECT();\n _presence_heartbeat();\n },\n \n 'get_heartbeat_interval' : function() {\n return PRESENCE_HB_INTERVAL;\n },\n \n 'set_heartbeat_interval' : function(heartbeat_interval) {\n PRESENCE_HB_INTERVAL = heartbeat_interval;\n _presence_heartbeat();\n },\n \n 'get_version' : function() {\n return SDK_VER;\n },\n 'getGcmMessageObject' : function(obj) {\n return {\n 'data' : obj\n }\n },\n 'getApnsMessageObject' : function(obj) {\n var x = {\n 'aps' : { 'badge' : 1, 'alert' : ''}\n }\n for (k in obj) {\n k[x] = obj[k];\n }\n return x;\n },\n 'newPnMessage' : function() {\n var x = {};\n if (gcm) x['pn_gcm'] = gcm;\n if (apns) x['pn_apns'] = apns;\n for ( k in n ) {\n x[k] = n[k];\n }\n return x;\n },\n\n '_add_param' : function(key,val) {\n params[key] = val;\n },\n\n 'channel_group' : function(args, callback) {\n var ns_ch = args['channel_group']\n , callback = callback || args['callback']\n , channels = args['channels'] || args['channel']\n , cloak = args['cloak']\n , namespace\n , channel_group\n , url = []\n , data = {}\n , mode = args['mode'] || 'add';\n\n\n if (ns_ch) {\n var ns_ch_a = ns_ch.split(':');\n\n if (ns_ch_a.length > 1) {\n namespace = (ns_ch_a[0] === '*')?null:ns_ch_a[0];\n\n channel_group = ns_ch_a[1];\n } else {\n channel_group = ns_ch_a[0];\n }\n }\n\n namespace && url.push('namespace') && url.push(encode(namespace));\n\n url.push('channel-group');\n\n if (channel_group && channel_group !== '*') {\n url.push(channel_group);\n }\n\n if (channels ) {\n if (isArray(channels)) {\n channels = channels.join(',');\n }\n data[mode] = channels;\n data['cloak'] = (CLOAK)?'true':'false';\n } else {\n if (mode === 'remove') url.push('remove');\n }\n\n if (typeof cloak != 'undefined') data['cloak'] = (cloak)?'true':'false';\n\n CR(args, callback, url, data);\n },\n\n 'channel_group_list_groups' : function(args, callback) {\n var namespace;\n\n namespace = args['namespace'] || args['ns'] || args['channel_group'] || null;\n if (namespace) {\n args[\"channel_group\"] = namespace + \":*\";\n }\n\n SELF['channel_group'](args, callback);\n },\n\n 'channel_group_list_channels' : function(args, callback) {\n if (!args['channel_group']) return error('Missing Channel Group');\n SELF['channel_group'](args, callback);\n },\n\n 'channel_group_remove_channel' : function(args, callback) {\n if (!args['channel_group']) return error('Missing Channel Group');\n if (!args['channel'] && !args['channels'] ) return error('Missing Channel');\n\n args['mode'] = 'remove';\n SELF['channel_group'](args,callback);\n },\n\n 'channel_group_remove_group' : function(args, callback) {\n if (!args['channel_group']) return error('Missing Channel Group');\n if (args['channel']) return error('Use channel_group_remove_channel if you want to remove a channel from a group.');\n\n args['mode'] = 'remove';\n SELF['channel_group'](args,callback);\n },\n\n 'channel_group_add_channel' : function(args, callback) {\n if (!args['channel_group']) return error('Missing Channel Group');\n if (!args['channel'] && !args['channels'] ) return error('Missing Channel');\n SELF['channel_group'](args,callback);\n },\n\n 'channel_group_cloak' : function(args, callback) {\n if (typeof args['cloak'] == 'undefined') {\n callback(CLOAK);\n return;\n }\n CLOAK = args['cloak'];\n SELF['channel_group'](args,callback);\n },\n\n 'channel_group_list_namespaces' : function(args, callback) {\n var url = ['namespace'];\n CR(args, callback, url);\n },\n 'channel_group_remove_namespace' : function(args, callback) {\n var url = ['namespace',args['namespace'],'remove'];\n CR(args, callback, url);\n },\n\n /*\n PUBNUB.history({\n channel : 'my_chat_channel',\n limit : 100,\n callback : function(history) { }\n });\n */\n 'history' : function( args, callback ) {\n var callback = args['callback'] || callback\n , count = args['count'] || args['limit'] || 100\n , reverse = args['reverse'] || \"false\"\n , err = args['error'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , cipher_key = args['cipher_key']\n , channel = args['channel']\n , channel_group = args['channel_group']\n , start = args['start']\n , end = args['end']\n , include_token = args['include_token']\n , string_msg_token = args['string_message_token'] || false\n , params = {}\n , jsonp = jsonp_cb();\n\n // Make sure we have a Channel\n if (!channel && !channel_group) return error('Missing Channel');\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n params['stringtoken'] = 'true';\n params['count'] = count;\n params['reverse'] = reverse;\n params['auth'] = auth_key;\n\n if (channel_group) {\n params['channel-group'] = channel_group;\n if (!channel) {\n channel = ','; \n }\n }\n if (jsonp) params['callback'] = jsonp;\n if (start) params['start'] = start;\n if (end) params['end'] = end;\n if (include_token) params['include_token'] = 'true';\n if (string_msg_token) params['string_message_token'] = 'true';\n\n // Send Message\n xdr({\n callback : jsonp,\n data : _get_url_params(params),\n success : function(response) {\n if (typeof response == 'object' && response['error']) {\n err({'message' : response['message'], 'payload' : response['payload']});\n return;\n }\n var messages = response[0];\n var decrypted_messages = [];\n for (var a = 0; a < messages.length; a++) {\n var new_message = decrypt(messages[a],cipher_key);\n try {\n decrypted_messages['push'](JSON['parse'](new_message));\n } catch (e) {\n decrypted_messages['push']((new_message));\n }\n }\n callback([decrypted_messages, response[1], response[2]]);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : [\n STD_ORIGIN, 'v2', 'history', 'sub-key',\n SUBSCRIBE_KEY, 'channel', encode(channel)\n ]\n });\n },\n\n /*\n PUBNUB.replay({\n source : 'my_channel',\n destination : 'new_channel'\n });\n */\n 'replay' : function(args, callback) {\n var callback = callback || args['callback'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , source = args['source']\n , destination = args['destination']\n , stop = args['stop']\n , start = args['start']\n , end = args['end']\n , reverse = args['reverse']\n , limit = args['limit']\n , jsonp = jsonp_cb()\n , data = {}\n , url;\n\n // Check User Input\n if (!source) return error('Missing Source Channel');\n if (!destination) return error('Missing Destination Channel');\n if (!PUBLISH_KEY) return error('Missing Publish Key');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n // Setup URL Params\n if (jsonp != '0') data['callback'] = jsonp;\n if (stop) data['stop'] = 'all';\n if (reverse) data['reverse'] = 'true';\n if (start) data['start'] = start;\n if (end) data['end'] = end;\n if (limit) data['count'] = limit;\n\n data['auth'] = auth_key;\n\n // Compose URL Parts\n url = [\n STD_ORIGIN, 'v1', 'replay',\n PUBLISH_KEY, SUBSCRIBE_KEY,\n source, destination\n ];\n\n // Start (or Stop) Replay!\n xdr({\n callback : jsonp,\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function() { callback([ 0, 'Disconnected' ]) },\n url : url,\n data : _get_url_params(data)\n });\n },\n\n /*\n PUBNUB.auth('AJFLKAJSDKLA');\n */\n 'auth' : function(auth) {\n AUTH_KEY = auth;\n CONNECT();\n },\n\n /*\n PUBNUB.time(function(time){ });\n */\n 'time' : function(callback) {\n var jsonp = jsonp_cb();\n\n var data = { 'uuid' : UUID, 'auth' : AUTH_KEY }\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n timeout : SECOND * 5,\n url : [STD_ORIGIN, 'time', jsonp],\n success : function(response) { callback(response[0]) },\n fail : function() { callback(0) }\n });\n },\n\n /*\n PUBNUB.publish({\n channel : 'my_chat_channel',\n message : 'hello!'\n });\n */\n 'publish' : function( args, callback ) {\n var msg = args['message'];\n if (!msg) return error('Missing Message');\n\n var callback = callback || args['callback'] || msg['callback'] || function(){}\n , channel = args['channel'] || msg['channel']\n , auth_key = args['auth_key'] || AUTH_KEY\n , cipher_key = args['cipher_key']\n , err = args['error'] || msg['error'] || function() {}\n , post = args['post'] || false\n , store = ('store_in_history' in args) ? args['store_in_history']: true\n , jsonp = jsonp_cb()\n , add_msg = 'push'\n , params\n , url;\n\n if (args['prepend']) add_msg = 'unshift'\n\n if (!channel) return error('Missing Channel');\n if (!PUBLISH_KEY) return error('Missing Publish Key');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n if (msg['getPubnubMessage']) {\n msg = msg['getPubnubMessage']();\n }\n\n // If trying to send Object\n msg = JSON['stringify'](encrypt(msg, cipher_key));\n\n // Create URL\n url = [\n STD_ORIGIN, 'publish',\n PUBLISH_KEY, SUBSCRIBE_KEY,\n 0, encode(channel),\n jsonp, encode(msg)\n ];\n\n params = { 'uuid' : UUID, 'auth' : auth_key }\n\n if (!store) params['store'] =\"0\"\n\n if (USE_INSTANCEID) params['instanceid'] = INSTANCEID;\n\n // Queue Message Send\n PUB_QUEUE[add_msg]({\n callback : jsonp,\n timeout : SECOND * 5,\n url : url,\n data : _get_url_params(params),\n fail : function(response){\n _invoke_error(response, err);\n publish(1);\n },\n success : function(response) {\n _invoke_callback(response, callback, err);\n publish(1);\n },\n mode : (post)?'POST':'GET'\n });\n\n // Send Message\n publish();\n },\n\n /*\n PUBNUB.unsubscribe({ channel : 'my_chat' });\n */\n 'unsubscribe' : function(args, callback) {\n var channel = args['channel']\n , channel_group = args['channel_group']\n , auth_key = args['auth_key'] || AUTH_KEY\n , callback = callback || args['callback'] || function(){}\n , err = args['error'] || function(){};\n\n TIMETOKEN = 0;\n //SUB_RESTORE = 1; REVISIT !!!!\n\n if (channel) {\n // Prepare Channel(s)\n channel = map( (\n channel.join ? channel.join(',') : ''+channel\n ).split(','), function(channel) {\n if (!CHANNELS[channel]) return;\n return channel + ',' + channel + PRESENCE_SUFFIX;\n } ).join(',');\n\n // Iterate over Channels\n each( channel.split(','), function(ch) {\n var CB_CALLED = true;\n if (!ch) return;\n CHANNELS[ch] = 0;\n if (ch in STATE) delete STATE[ch];\n if (READY) {\n CB_CALLED = SELF['LEAVE']( ch, 0 , auth_key, callback, err);\n }\n if (!CB_CALLED) callback({action : \"leave\"});\n\n \n } );\n }\n\n if (channel_group) {\n // Prepare channel group(s)\n channel_group = map( (\n channel_group.join ? channel_group.join(',') : ''+channel_group\n ).split(','), function(channel_group) {\n if (!CHANNEL_GROUPS[channel_group]) return;\n return channel_group + ',' + channel_group + PRESENCE_SUFFIX;\n } ).join(',');\n\n // Iterate over channel groups\n each( channel_group.split(','), function(chg) {\n var CB_CALLED = true;\n if (!chg) return;\n CHANNEL_GROUPS[chg] = 0;\n if (chg in STATE) delete STATE[chg];\n if (READY) {\n CB_CALLED = SELF['LEAVE_GROUP']( chg, 0 , auth_key, callback, err);\n }\n if (!CB_CALLED) callback({action : \"leave\"});\n\n } );\n }\n\n // Reset Connection if Count Less\n CONNECT();\n },\n\n /*\n PUBNUB.subscribe({\n channel : 'my_chat'\n callback : function(message) { }\n });\n */\n 'subscribe' : function( args, callback ) {\n var channel = args['channel']\n , channel_group = args['channel_group']\n , callback = callback || args['callback']\n , callback = callback || args['message']\n , connect = args['connect'] || function(){}\n , reconnect = args['reconnect'] || function(){}\n , disconnect = args['disconnect'] || function(){}\n , SUB_ERROR = args['error'] || SUB_ERROR || function(){}\n , idlecb = args['idle'] || function(){}\n , presence = args['presence'] || 0\n , noheresync = args['noheresync'] || 0\n , backfill = args['backfill'] || 0\n , timetoken = args['timetoken'] || 0\n , sub_timeout = args['timeout'] || SUB_TIMEOUT\n , windowing = args['windowing'] || SUB_WINDOWING\n , state = args['state']\n , heartbeat = args['heartbeat'] || args['pnexpires']\n , heartbeat_interval = args['heartbeat_interval']\n , restore = args['restore'] || SUB_RESTORE;\n\n AUTH_KEY = args['auth_key'] || AUTH_KEY;\n\n // Restore Enabled?\n SUB_RESTORE = restore;\n\n // Always Reset the TT\n TIMETOKEN = timetoken;\n\n // Make sure we have a Channel\n if (!channel && !channel_group) {\n return error('Missing Channel');\n }\n\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n if (heartbeat || heartbeat === 0 || heartbeat_interval || heartbeat_interval === 0) {\n SELF['set_heartbeat'](heartbeat, heartbeat_interval);\n }\n\n // Setup Channel(s)\n if (channel) {\n each( (channel.join ? channel.join(',') : ''+channel).split(','),\n function(channel) {\n var settings = CHANNELS[channel] || {};\n\n // Store Channel State\n CHANNELS[SUB_CHANNEL = channel] = {\n name : channel,\n connected : settings.connected,\n disconnected : settings.disconnected,\n subscribed : 1,\n callback : SUB_CALLBACK = callback,\n 'cipher_key' : args['cipher_key'],\n connect : connect,\n disconnect : disconnect,\n reconnect : reconnect\n };\n\n if (state) {\n if (channel in state) {\n STATE[channel] = state[channel];\n } else {\n STATE[channel] = state;\n }\n }\n\n // Presence Enabled?\n if (!presence) return;\n\n // Subscribe Presence Channel\n SELF['subscribe']({\n 'channel' : channel + PRESENCE_SUFFIX,\n 'callback' : presence,\n 'restore' : restore\n });\n\n // Presence Subscribed?\n if (settings.subscribed) return;\n\n // See Who's Here Now?\n if (noheresync) return;\n SELF['here_now']({\n 'channel' : channel,\n 'data' : _get_url_params({ 'uuid' : UUID, 'auth' : AUTH_KEY }),\n 'callback' : function(here) {\n each( 'uuids' in here ? here['uuids'] : [],\n function(uid) { presence( {\n 'action' : 'join',\n 'uuid' : uid,\n 'timestamp' : Math.floor(rnow() / 1000),\n 'occupancy' : here['occupancy'] || 1\n }, here, channel ); } );\n }\n });\n } );\n }\n\n // Setup Channel Groups\n if (channel_group) {\n each( (channel_group.join ? channel_group.join(',') : ''+channel_group).split(','),\n function(channel_group) {\n var settings = CHANNEL_GROUPS[channel_group] || {};\n\n CHANNEL_GROUPS[channel_group] = {\n name : channel_group,\n connected : settings.connected,\n disconnected : settings.disconnected,\n subscribed : 1,\n callback : SUB_CALLBACK = callback,\n 'cipher_key' : args['cipher_key'],\n connect : connect,\n disconnect : disconnect,\n reconnect : reconnect\n };\n\n // Presence Enabled?\n if (!presence) return;\n\n // Subscribe Presence Channel\n SELF['subscribe']({\n 'channel_group' : channel_group + PRESENCE_SUFFIX,\n 'callback' : presence,\n 'restore' : restore,\n 'auth_key' : AUTH_KEY\n });\n\n // Presence Subscribed?\n if (settings.subscribed) return;\n\n // See Who's Here Now?\n if (noheresync) return;\n SELF['here_now']({\n 'channel_group' : channel_group,\n 'data' : _get_url_params({ 'uuid' : UUID, 'auth' : AUTH_KEY }),\n 'callback' : function(here) {\n each( 'uuids' in here ? here['uuids'] : [],\n function(uid) { presence( {\n 'action' : 'join',\n 'uuid' : uid,\n 'timestamp' : Math.floor(rnow() / 1000),\n 'occupancy' : here['occupancy'] || 1\n }, here, channel_group ); } );\n }\n });\n } );\n }\n\n\n // Test Network Connection\n function _test_connection(success) {\n if (success) {\n // Begin Next Socket Connection\n timeout( CONNECT, windowing);\n }\n else {\n // New Origin on Failed Connection\n STD_ORIGIN = nextorigin( ORIGIN, 1 );\n SUB_ORIGIN = nextorigin( ORIGIN, 1 );\n\n // Re-test Connection\n timeout( function() {\n SELF['time'](_test_connection);\n }, SECOND );\n }\n\n // Disconnect & Reconnect\n each_channel(function(channel){\n // Reconnect\n if (success && channel.disconnected) {\n channel.disconnected = 0;\n return channel.reconnect(channel.name);\n }\n\n // Disconnect\n if (!success && !channel.disconnected) {\n channel.disconnected = 1;\n channel.disconnect(channel.name);\n }\n });\n \n // Disconnect & Reconnect for channel groups\n each_channel_group(function(channel_group){\n // Reconnect\n if (success && channel_group.disconnected) {\n channel_group.disconnected = 0;\n return channel_group.reconnect(channel_group.name);\n }\n\n // Disconnect\n if (!success && !channel_group.disconnected) {\n channel_group.disconnected = 1;\n channel_group.disconnect(channel_group.name);\n }\n });\n }\n\n // Evented Subscribe\n function _connect() {\n var jsonp = jsonp_cb()\n , channels = generate_channel_list(CHANNELS).join(',')\n , channel_groups = generate_channel_group_list(CHANNEL_GROUPS).join(',');\n\n // Stop Connection\n if (!channels && !channel_groups) return;\n\n if (!channels) channels = ',';\n\n // Connect to PubNub Subscribe Servers\n _reset_offline();\n\n var data = _get_url_params({ 'uuid' : UUID, 'auth' : AUTH_KEY });\n\n if (channel_groups) {\n data['channel-group'] = channel_groups;\n }\n\n\n var st = JSON.stringify(STATE);\n if (st.length > 2) data['state'] = JSON.stringify(STATE);\n\n if (PRESENCE_HB) data['heartbeat'] = PRESENCE_HB;\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n start_presence_heartbeat();\n SUB_RECEIVER = xdr({\n timeout : sub_timeout,\n callback : jsonp,\n fail : function(response) {\n if (response && response['error'] && response['service']) {\n _invoke_error(response, SUB_ERROR);\n _test_connection(1);\n } else {\n SELF['time'](function(success){\n !success && ( _invoke_error(response, SUB_ERROR));\n _test_connection(success);\n });\n }\n },\n data : _get_url_params(data),\n url : [\n SUB_ORIGIN, 'subscribe',\n SUBSCRIBE_KEY, encode(channels),\n jsonp, TIMETOKEN\n ],\n success : function(messages) {\n\n // Check for Errors\n if (!messages || (\n typeof messages == 'object' &&\n 'error' in messages &&\n messages['error']\n )) {\n SUB_ERROR(messages['error']);\n return timeout( CONNECT, SECOND );\n }\n\n // User Idle Callback\n idlecb(messages[1]);\n\n // Restore Previous Connection Point if Needed\n TIMETOKEN = !TIMETOKEN &&\n SUB_RESTORE &&\n db['get'](SUBSCRIBE_KEY) || messages[1];\n\n /*\n // Connect\n each_channel_registry(function(registry){\n if (registry.connected) return;\n registry.connected = 1;\n registry.connect(channel.name);\n });\n */\n\n // Connect\n each_channel(function(channel){\n if (channel.connected) return;\n channel.connected = 1;\n channel.connect(channel.name);\n });\n\n // Connect for channel groups\n each_channel_group(function(channel_group){\n if (channel_group.connected) return;\n channel_group.connected = 1;\n channel_group.connect(channel_group.name);\n });\n\n if (RESUMED && !SUB_RESTORE) {\n TIMETOKEN = 0;\n RESUMED = false;\n // Update Saved Timetoken\n db['set']( SUBSCRIBE_KEY, 0 );\n timeout( _connect, windowing );\n return;\n }\n\n // Invoke Memory Catchup and Receive Up to 100\n // Previous Messages from the Queue.\n if (backfill) {\n TIMETOKEN = 10000;\n backfill = 0;\n }\n\n // Update Saved Timetoken\n db['set']( SUBSCRIBE_KEY, messages[1] );\n\n // Route Channel <---> Callback for Message\n var next_callback = (function() {\n var channels = '';\n var channels2 = '';\n\n if (messages.length > 3) {\n channels = messages[3];\n channels2 = messages[2];\n } else if (messages.length > 2) {\n channels = messages[2];\n } else {\n channels = map(\n generate_channel_list(CHANNELS), function(chan) { return map(\n Array(messages[0].length)\n .join(',').split(','),\n function() { return chan; }\n ) }).join(',')\n }\n\n var list = channels.split(',');\n var list2 = (channels2)?channels2.split(','):[];\n\n return function() {\n var channel = list.shift()||SUB_CHANNEL;\n var channel2 = list2.shift();\n\n var chobj = {};\n\n if (channel2) {\n if (channel && channel.indexOf('-pnpres') >= 0 \n && channel2.indexOf('-pnpres') < 0) {\n channel2 += '-pnpres';\n }\n chobj = CHANNEL_GROUPS[channel2] || CHANNELS[channel2] || {'callback' : function(){}};\n } else {\n chobj = CHANNELS[channel];\n }\n\n var r = [\n chobj\n .callback||SUB_CALLBACK,\n channel.split(PRESENCE_SUFFIX)[0]\n ];\n channel2 && r.push(channel2.split(PRESENCE_SUFFIX)[0]);\n return r;\n };\n })();\n\n var latency = detect_latency(+messages[1]);\n each( messages[0], function(msg) {\n var next = next_callback();\n var decrypted_msg = decrypt(msg,\n (CHANNELS[next[1]])?CHANNELS[next[1]]['cipher_key']:null);\n next[0] && next[0]( decrypted_msg, messages, next[2] || next[1], latency, next[1]);\n });\n\n timeout( _connect, windowing );\n }\n });\n }\n\n CONNECT = function() {\n _reset_offline();\n timeout( _connect, windowing );\n };\n\n // Reduce Status Flicker\n if (!READY) return READY_BUFFER.push(CONNECT);\n\n // Connect Now\n CONNECT();\n },\n\n /*\n PUBNUB.here_now({ channel : 'my_chat', callback : fun });\n */\n 'here_now' : function( args, callback ) {\n var callback = args['callback'] || callback\n , err = args['error'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , channel = args['channel']\n , channel_group = args['channel_group']\n , jsonp = jsonp_cb()\n , uuids = ('uuids' in args) ? args['uuids'] : true\n , state = args['state']\n , data = { 'uuid' : UUID, 'auth' : auth_key };\n\n if (!uuids) data['disable_uuids'] = 1;\n if (state) data['state'] = 1;\n\n // Make sure we have a Channel\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n var url = [\n STD_ORIGIN, 'v2', 'presence',\n 'sub_key', SUBSCRIBE_KEY\n ];\n\n channel && url.push('channel') && url.push(encode(channel));\n\n if (jsonp != '0') { data['callback'] = jsonp; }\n\n if (channel_group) {\n data['channel-group'] = channel_group;\n !channel && url.push('channel') && url.push(','); \n }\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : url\n });\n },\n\n /*\n PUBNUB.current_channels_by_uuid({ channel : 'my_chat', callback : fun });\n */\n 'where_now' : function( args, callback ) {\n var callback = args['callback'] || callback\n , err = args['error'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , jsonp = jsonp_cb()\n , uuid = args['uuid'] || UUID\n , data = { 'auth' : auth_key };\n\n // Make sure we have a Channel\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n if (jsonp != '0') { data['callback'] = jsonp; }\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : [\n STD_ORIGIN, 'v2', 'presence',\n 'sub_key', SUBSCRIBE_KEY,\n 'uuid', encode(uuid)\n ]\n });\n },\n\n 'state' : function(args, callback) {\n var callback = args['callback'] || callback || function(r) {}\n , err = args['error'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , jsonp = jsonp_cb()\n , state = args['state']\n , uuid = args['uuid'] || UUID\n , channel = args['channel']\n , channel_group = args['channel_group']\n , url\n , data = _get_url_params({ 'auth' : auth_key });\n\n // Make sure we have a Channel\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n if (!uuid) return error('Missing UUID');\n if (!channel && !channel_group) return error('Missing Channel');\n\n if (jsonp != '0') { data['callback'] = jsonp; }\n\n if (typeof channel != 'undefined'\n && CHANNELS[channel] && CHANNELS[channel].subscribed ) {\n if (state) STATE[channel] = state;\n }\n\n if (typeof channel_group != 'undefined'\n && CHANNEL_GROUPS[channel_group]\n && CHANNEL_GROUPS[channel_group].subscribed\n ) {\n if (state) STATE[channel_group] = state;\n data['channel-group'] = channel_group;\n\n if (!channel) {\n channel = ',';\n }\n }\n\n data['state'] = JSON.stringify(state);\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n if (state) {\n url = [\n STD_ORIGIN, 'v2', 'presence',\n 'sub-key', SUBSCRIBE_KEY,\n 'channel', channel,\n 'uuid', uuid, 'data'\n ]\n } else {\n url = [\n STD_ORIGIN, 'v2', 'presence',\n 'sub-key', SUBSCRIBE_KEY,\n 'channel', channel,\n 'uuid', encode(uuid)\n ]\n }\n\n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : url\n\n });\n\n },\n\n /*\n PUBNUB.grant({\n channel : 'my_chat',\n callback : fun,\n error : fun,\n ttl : 24 * 60, // Minutes\n read : true,\n write : true,\n auth_key : '3y8uiajdklytowsj'\n });\n */\n 'grant' : function( args, callback ) {\n var callback = args['callback'] || callback\n , err = args['error'] || function(){}\n , channel = args['channel'] || args['channels']\n , channel_group = args['channel_group']\n , jsonp = jsonp_cb()\n , ttl = args['ttl']\n , r = (args['read'] )?\"1\":\"0\"\n , w = (args['write'])?\"1\":\"0\"\n , m = (args['manage'])?\"1\":\"0\"\n , auth_key = args['auth_key'] || args['auth_keys'];\n\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n if (!PUBLISH_KEY) return error('Missing Publish Key');\n if (!SECRET_KEY) return error('Missing Secret Key');\n\n var timestamp = Math.floor(new Date().getTime() / 1000)\n , sign_input = SUBSCRIBE_KEY + \"\\n\" + PUBLISH_KEY + \"\\n\"\n + \"grant\" + \"\\n\";\n\n var data = {\n 'w' : w,\n 'r' : r,\n 'timestamp' : timestamp\n };\n if (args['manage']) {\n data['m'] = m;\n }\n if (isArray(channel)) {\n channel = channel['join'](',');\n }\n if (isArray(auth_key)) {\n auth_key = auth_key['join'](',');\n }\n if (typeof channel != 'undefined' && channel != null && channel.length > 0) data['channel'] = channel;\n if (typeof channel_group != 'undefined' && channel_group != null && channel_group.length > 0) {\n data['channel-group'] = channel_group;\n }\n if (jsonp != '0') { data['callback'] = jsonp; }\n if (ttl || ttl === 0) data['ttl'] = ttl;\n\n if (auth_key) data['auth'] = auth_key;\n\n data = _get_url_params(data)\n\n if (!auth_key) delete data['auth'];\n\n sign_input += _get_pam_sign_input_from_params(data);\n\n var signature = hmac_SHA256( sign_input, SECRET_KEY );\n\n signature = signature.replace( /\\+/g, \"-\" );\n signature = signature.replace( /\\//g, \"_\" );\n\n data['signature'] = signature;\n\n xdr({\n callback : jsonp,\n data : data,\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : [\n STD_ORIGIN, 'v1', 'auth', 'grant' ,\n 'sub-key', SUBSCRIBE_KEY\n ]\n });\n },\n\n /*\n PUBNUB.mobile_gw_provision ({\n device_id: 'A655FBA9931AB',\n op : 'add' | 'remove',\n gw_type : 'apns' | 'gcm',\n channel : 'my_chat',\n callback : fun,\n error : fun,\n });\n */\n\n 'mobile_gw_provision' : function( args ) {\n\n var callback = args['callback'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , err = args['error'] || function() {}\n , jsonp = jsonp_cb()\n , channel = args['channel']\n , op = args['op']\n , gw_type = args['gw_type']\n , device_id = args['device_id']\n , params\n , url;\n\n if (!device_id) return error('Missing Device ID (device_id)');\n if (!gw_type) return error('Missing GW Type (gw_type: gcm or apns)');\n if (!op) return error('Missing GW Operation (op: add or remove)');\n if (!channel) return error('Missing gw destination Channel (channel)');\n if (!PUBLISH_KEY) return error('Missing Publish Key');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n // Create URL\n url = [\n STD_ORIGIN, 'v1/push/sub-key',\n SUBSCRIBE_KEY, 'devices', device_id\n ];\n\n params = { 'uuid' : UUID, 'auth' : auth_key, 'type': gw_type};\n\n if (op == \"add\") {\n params['add'] = channel;\n } else if (op == \"remove\") {\n params['remove'] = channel;\n }\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n callback : jsonp,\n data : params,\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : url\n });\n\n },\n\n /*\n PUBNUB.audit({\n channel : 'my_chat',\n callback : fun,\n error : fun,\n read : true,\n write : true,\n auth_key : '3y8uiajdklytowsj'\n });\n */\n 'audit' : function( args, callback ) {\n var callback = args['callback'] || callback\n , err = args['error'] || function(){}\n , channel = args['channel']\n , channel_group = args['channel_group']\n , auth_key = args['auth_key']\n , jsonp = jsonp_cb();\n\n // Make sure we have a Channel\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n if (!PUBLISH_KEY) return error('Missing Publish Key');\n if (!SECRET_KEY) return error('Missing Secret Key');\n\n var timestamp = Math.floor(new Date().getTime() / 1000)\n , sign_input = SUBSCRIBE_KEY + \"\\n\"\n + PUBLISH_KEY + \"\\n\"\n + \"audit\" + \"\\n\";\n\n var data = {'timestamp' : timestamp };\n if (jsonp != '0') { data['callback'] = jsonp; }\n if (typeof channel != 'undefined' && channel != null && channel.length > 0) data['channel'] = channel;\n if (typeof channel_group != 'undefined' && channel_group != null && channel_group.length > 0) {\n data['channel-group'] = channel_group;\n }\n if (auth_key) data['auth'] = auth_key;\n\n data = _get_url_params(data);\n\n if (!auth_key) delete data['auth'];\n\n sign_input += _get_pam_sign_input_from_params(data);\n\n var signature = hmac_SHA256( sign_input, SECRET_KEY );\n\n signature = signature.replace( /\\+/g, \"-\" );\n signature = signature.replace( /\\//g, \"_\" );\n\n data['signature'] = signature;\n xdr({\n callback : jsonp,\n data : data,\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : [\n STD_ORIGIN, 'v1', 'auth', 'audit' ,\n 'sub-key', SUBSCRIBE_KEY\n ]\n });\n },\n\n /*\n PUBNUB.revoke({\n channel : 'my_chat',\n callback : fun,\n error : fun,\n auth_key : '3y8uiajdklytowsj'\n });\n */\n 'revoke' : function( args, callback ) {\n args['read'] = false;\n args['write'] = false;\n SELF['grant']( args, callback );\n },\n 'set_uuid' : function(uuid) {\n UUID = uuid;\n CONNECT();\n },\n 'get_uuid' : function() {\n return UUID;\n },\n 'isArray' : function(arg) {\n return isArray(arg);\n },\n 'get_subscibed_channels' : function() {\n return generate_channel_list(CHANNELS, true);\n },\n 'presence_heartbeat' : function(args) {\n var callback = args['callback'] || function() {}\n var err = args['error'] || function() {}\n var jsonp = jsonp_cb();\n var data = { 'uuid' : UUID, 'auth' : AUTH_KEY };\n\n var st = JSON['stringify'](STATE);\n if (st.length > 2) data['state'] = JSON['stringify'](STATE);\n\n if (PRESENCE_HB > 0 && PRESENCE_HB < 320) data['heartbeat'] = PRESENCE_HB;\n\n if (jsonp != '0') { data['callback'] = jsonp; }\n\n var channels = encode(generate_channel_list(CHANNELS, true)['join'](','));\n var channel_groups = generate_channel_group_list(CHANNEL_GROUPS, true)['join'](',');\n\n if (!channels) channels = ',';\n if (channel_groups) data['channel-group'] = channel_groups;\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n timeout : SECOND * 5,\n url : [\n STD_ORIGIN, 'v2', 'presence',\n 'sub-key', SUBSCRIBE_KEY,\n 'channel' , channels,\n 'heartbeat'\n ],\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) { _invoke_error(response, err); }\n });\n },\n 'stop_timers': function () {\n clearTimeout(_poll_timer);\n clearTimeout(_poll_timer2);\n clearTimeout(PRESENCE_HB_TIMEOUT);\n },\n 'shutdown': function () {\n SELF['stop_timers']();\n shutdown && shutdown();\n },\n\n // Expose PUBNUB Functions\n 'xdr' : xdr,\n 'ready' : ready,\n 'db' : db,\n 'uuid' : generate_uuid,\n 'map' : map,\n 'each' : each,\n 'each-channel' : each_channel,\n 'grep' : grep,\n 'offline' : function(){ _reset_offline(\n 1, { \"message\" : \"Offline. Please check your network settings.\" })\n },\n 'supplant' : supplant,\n 'now' : rnow,\n 'unique' : unique,\n 'updater' : updater\n };\n\n function _poll_online() {\n _is_online() || _reset_offline( 1, {\n \"error\" : \"Offline. Please check your network settings. \"\n });\n _poll_timer && clearTimeout(_poll_timer);\n _poll_timer = timeout( _poll_online, SECOND );\n }\n\n function _poll_online2() {\n if (!TIME_CHECK) return;\n SELF['time'](function(success){\n detect_time_detla( function(){}, success );\n success || _reset_offline( 1, {\n \"error\" : \"Heartbeat failed to connect to Pubnub Servers.\" +\n \"Please check your network settings.\"\n });\n _poll_timer2 && clearTimeout(_poll_timer2);\n _poll_timer2 = timeout( _poll_online2, KEEPALIVE );\n });\n }\n\n function _reset_offline(err, msg) {\n SUB_RECEIVER && SUB_RECEIVER(err, msg);\n SUB_RECEIVER = null;\n\n clearTimeout(_poll_timer);\n clearTimeout(_poll_timer2);\n }\n \n if (!UUID) UUID = SELF['uuid']();\n if (!INSTANCEID) INSTANCEID = SELF['uuid']();\n db['set']( SUBSCRIBE_KEY + 'uuid', UUID );\n\n _poll_timer = timeout( _poll_online, SECOND );\n _poll_timer2 = timeout( _poll_online2, KEEPALIVE );\n PRESENCE_HB_TIMEOUT = timeout(\n start_presence_heartbeat,\n ( PRESENCE_HB_INTERVAL - 3 ) * SECOND\n );\n\n // Detect Age of Message\n function detect_latency(tt) {\n var adjusted_time = rnow() - TIME_DRIFT;\n return adjusted_time - tt / 10000;\n }\n\n detect_time_detla();\n function detect_time_detla( cb, time ) {\n var stime = rnow();\n\n time && calculate(time) || SELF['time'](calculate);\n\n function calculate(time) {\n if (!time) return;\n var ptime = time / 10000\n , latency = (rnow() - stime) / 2;\n TIME_DRIFT = rnow() - (ptime + latency);\n cb && cb(TIME_DRIFT);\n }\n }\n\n return SELF;\n}\nfunction crypto_obj() {\n\n function SHA256(s) {\n return CryptoJS['SHA256'](s)['toString'](CryptoJS['enc']['Hex']);\n }\n\n var iv = \"0123456789012345\";\n\n var allowedKeyEncodings = ['hex', 'utf8', 'base64', 'binary'];\n var allowedKeyLengths = [128, 256];\n var allowedModes = ['ecb', 'cbc'];\n\n var defaultOptions = {\n 'encryptKey': true,\n 'keyEncoding': 'utf8',\n 'keyLength': 256,\n 'mode': 'cbc'\n };\n\n function parse_options(options) {\n\n // Defaults\n options = options || {};\n if (!options['hasOwnProperty']('encryptKey')) options['encryptKey'] = defaultOptions['encryptKey'];\n if (!options['hasOwnProperty']('keyEncoding')) options['keyEncoding'] = defaultOptions['keyEncoding'];\n if (!options['hasOwnProperty']('keyLength')) options['keyLength'] = defaultOptions['keyLength'];\n if (!options['hasOwnProperty']('mode')) options['mode'] = defaultOptions['mode'];\n\n // Validation\n if (allowedKeyEncodings['indexOf'](options['keyEncoding']['toLowerCase']()) == -1) options['keyEncoding'] = defaultOptions['keyEncoding'];\n if (allowedKeyLengths['indexOf'](parseInt(options['keyLength'], 10)) == -1) options['keyLength'] = defaultOptions['keyLength'];\n if (allowedModes['indexOf'](options['mode']['toLowerCase']()) == -1) options['mode'] = defaultOptions['mode'];\n\n return options;\n\n }\n\n function decode_key(key, options) {\n if (options['keyEncoding'] == 'base64') {\n return CryptoJS['enc']['Base64']['parse'](key);\n } else if (options['keyEncoding'] == 'hex') {\n return CryptoJS['enc']['Hex']['parse'](key);\n } else {\n return key;\n }\n }\n\n function get_padded_key(key, options) {\n key = decode_key(key, options);\n if (options['encryptKey']) {\n return CryptoJS['enc']['Utf8']['parse'](SHA256(key)['slice'](0, 32));\n } else {\n return key;\n }\n }\n\n function get_mode(options) {\n if (options['mode'] == 'ecb') {\n return CryptoJS['mode']['ECB'];\n } else {\n return CryptoJS['mode']['CBC'];\n }\n }\n\n function get_iv(options) {\n return (options['mode'] == 'cbc') ? CryptoJS['enc']['Utf8']['parse'](iv) : null;\n }\n\n return {\n\n 'encrypt': function(data, key, options) {\n if (!key) return data;\n options = parse_options(options);\n var iv = get_iv(options);\n var mode = get_mode(options);\n var cipher_key = get_padded_key(key, options);\n var hex_message = JSON['stringify'](data);\n var encryptedHexArray = CryptoJS['AES']['encrypt'](hex_message, cipher_key, {'iv': iv, 'mode': mode})['ciphertext'];\n var base_64_encrypted = encryptedHexArray['toString'](CryptoJS['enc']['Base64']);\n return base_64_encrypted || data;\n },\n\n 'decrypt': function(data, key, options) {\n if (!key) return data;\n options = parse_options(options);\n var iv = get_iv(options);\n var mode = get_mode(options);\n var cipher_key = get_padded_key(key, options);\n try {\n var binary_enc = CryptoJS['enc']['Base64']['parse'](data);\n var json_plain = CryptoJS['AES']['decrypt']({'ciphertext': binary_enc}, cipher_key, {'iv': iv, 'mode': mode})['toString'](CryptoJS['enc']['Utf8']);\n var plaintext = JSON['parse'](json_plain);\n return plaintext;\n }\n catch (e) {\n return undefined;\n }\n }\n };\n}\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n/* =-========================= UTIL =============================-= */\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n\nwindow['PUBNUB'] || (function() {\n\n/**\n * UTIL LOCALS\n */\n\nvar SWF = 'https://pubnub.a.ssl.fastly.net/pubnub.swf'\n, ASYNC = 'async'\n, UA = navigator.userAgent\n, PNSDK = 'PubNub-JS-' + 'Web' + '/' + '3.7.14'\n, XORIGN = UA.indexOf('MSIE 6') == -1;\n\n/**\n * CONSOLE COMPATIBILITY\n */\nwindow.console || (window.console=window.console||{});\nconsole.log || (\n console.log =\n console.error =\n ((window.opera||{}).postError||function(){})\n);\n\n/**\n * LOCAL STORAGE OR COOKIE\n */\nvar db = (function(){\n var store = {};\n var ls = false;\n try {\n ls = window['localStorage'];\n } catch (e) { }\n var cookieGet = function(key) {\n if (document.cookie.indexOf(key) == -1) return null;\n return ((document.cookie||'').match(\n RegExp(key+'=([^;]+)')\n )||[])[1] || null;\n };\n var cookieSet = function( key, value ) {\n document.cookie = key + '=' + value +\n '; expires=Thu, 1 Aug 2030 20:00:00 UTC; path=/';\n };\n var cookieTest = (function() {\n try {\n cookieSet('pnctest', '1');\n return cookieGet('pnctest') === '1';\n } catch (e) {\n return false;\n }\n }());\n return {\n 'get' : function(key) {\n try {\n if (ls) return ls.getItem(key);\n if (cookieTest) return cookieGet(key);\n return store[key];\n } catch(e) {\n return store[key];\n }\n },\n 'set' : function( key, value ) {\n try {\n if (ls) return ls.setItem( key, value ) && 0;\n if (cookieTest) cookieSet( key, value );\n store[key] = value;\n } catch(e) {\n store[key] = value;\n }\n }\n };\n})();\n\nfunction get_hmac_SHA256(data,key) {\n var hash = CryptoJS['HmacSHA256'](data, key);\n return hash.toString(CryptoJS['enc']['Base64']);\n}\n\n/**\n * $\n * =\n * var div = $('divid');\n */\nfunction $(id) { return document.getElementById(id) }\n\n/**\n * ERROR\n * =====\n * error('message');\n */\nfunction error(message) { console['error'](message) }\n\n/**\n * SEARCH\n * ======\n * var elements = search('a div span');\n */\nfunction search( elements, start) {\n var list = [];\n each( elements.split(/\\s+/), function(el) {\n each( (start || document).getElementsByTagName(el), function(node) {\n list.push(node);\n } );\n });\n return list;\n}\n\n/**\n * BIND\n * ====\n * bind( 'keydown', search('a')[0], function(element) {\n * ...\n * } );\n */\nfunction bind( type, el, fun ) {\n each( type.split(','), function(etype) {\n var rapfun = function(e) {\n if (!e) e = window.event;\n if (!fun(e)) {\n e.cancelBubble = true;\n e.preventDefault && e.preventDefault();\n e.stopPropagation && e.stopPropagation();\n }\n };\n\n if ( el.addEventListener ) el.addEventListener( etype, rapfun, false );\n else if ( el.attachEvent ) el.attachEvent( 'on' + etype, rapfun );\n else el[ 'on' + etype ] = rapfun;\n } );\n}\n\n/**\n * UNBIND\n * ======\n * unbind( 'keydown', search('a')[0] );\n */\nfunction unbind( type, el, fun ) {\n if ( el.removeEventListener ) el.removeEventListener( type, false );\n else if ( el.detachEvent ) el.detachEvent( 'on' + type, false );\n else el[ 'on' + type ] = null;\n}\n\n/**\n * HEAD\n * ====\n * head().appendChild(elm);\n */\nfunction head() { return search('head')[0] }\n\n/**\n * ATTR\n * ====\n * var attribute = attr( node, 'attribute' );\n */\nfunction attr( node, attribute, value ) {\n if (value) node.setAttribute( attribute, value );\n else return node && node.getAttribute && node.getAttribute(attribute);\n}\n\n/**\n * CSS\n * ===\n * var obj = create('div');\n */\nfunction css( element, styles ) {\n for (var style in styles) if (styles.hasOwnProperty(style))\n try {element.style[style] = styles[style] + (\n '|width|height|top|left|'.indexOf(style) > 0 &&\n typeof styles[style] == 'number'\n ? 'px' : ''\n )}catch(e){}\n}\n\n/**\n * CREATE\n * ======\n * var obj = create('div');\n */\nfunction create(element) { return document.createElement(element) }\n\n\n/**\n * jsonp_cb\n * ========\n * var callback = jsonp_cb();\n */\nfunction jsonp_cb() { return XORIGN || FDomainRequest() ? 0 : unique() }\n\n\n\n/**\n * EVENTS\n * ======\n * PUBNUB.events.bind( 'you-stepped-on-flower', function(message) {\n * // Do Stuff with message\n * } );\n *\n * PUBNUB.events.fire( 'you-stepped-on-flower', \"message-data\" );\n * PUBNUB.events.fire( 'you-stepped-on-flower', {message:\"data\"} );\n * PUBNUB.events.fire( 'you-stepped-on-flower', [1,2,3] );\n *\n */\nvar events = {\n 'list' : {},\n 'unbind' : function( name ) { events.list[name] = [] },\n 'bind' : function( name, fun ) {\n (events.list[name] = events.list[name] || []).push(fun);\n },\n 'fire' : function( name, data ) {\n each(\n events.list[name] || [],\n function(fun) { fun(data) }\n );\n }\n};\n\n/**\n * XDR Cross Domain Request\n * ========================\n * xdr({\n * url : ['http://www.blah.com/url'],\n * success : function(response) {},\n * fail : function() {}\n * });\n */\nfunction xdr( setup ) {\n if (XORIGN || FDomainRequest()) return ajax(setup);\n\n var script = create('script')\n , callback = setup.callback\n , id = unique()\n , finished = 0\n , xhrtme = setup.timeout || DEF_TIMEOUT\n , timer = timeout( function(){done(1, {\"message\" : \"timeout\"})}, xhrtme )\n , fail = setup.fail || function(){}\n , data = setup.data || {}\n , success = setup.success || function(){}\n , append = function() { head().appendChild(script) }\n , done = function( failed, response ) {\n if (finished) return;\n finished = 1;\n\n script.onerror = null;\n clearTimeout(timer);\n\n (failed || !response) || success(response);\n\n timeout( function() {\n failed && fail();\n var s = $(id)\n , p = s && s.parentNode;\n p && p.removeChild(s);\n }, SECOND );\n };\n\n window[callback] = function(response) {\n done( 0, response );\n };\n\n if (!setup.blocking) script[ASYNC] = ASYNC;\n\n script.onerror = function() { done(1) };\n script.src = build_url( setup.url, data );\n\n attr( script, 'id', id );\n\n append();\n return done;\n}\n\n/**\n * CORS XHR Request\n * ================\n * xdr({\n * url : ['http://www.blah.com/url'],\n * success : function(response) {},\n * fail : function() {}\n * });\n */\nfunction ajax( setup ) {\n var xhr, response\n , finished = function() {\n if (loaded) return;\n loaded = 1;\n\n clearTimeout(timer);\n\n try { response = JSON['parse'](xhr.responseText); }\n catch (r) { return done(1); }\n\n complete = 1;\n success(response);\n }\n , complete = 0\n , loaded = 0\n , xhrtme = setup.timeout || DEF_TIMEOUT\n , timer = timeout( function(){done(1, {\"message\" : \"timeout\"})}, xhrtme )\n , fail = setup.fail || function(){}\n , data = setup.data || {}\n , success = setup.success || function(){}\n , async = !(setup.blocking)\n , done = function(failed,response) {\n if (complete) return;\n complete = 1;\n\n clearTimeout(timer);\n\n if (xhr) {\n xhr.onerror = xhr.onload = null;\n xhr.abort && xhr.abort();\n xhr = null;\n }\n\n failed && fail(response);\n };\n\n // Send\n try {\n xhr = FDomainRequest() ||\n window.XDomainRequest &&\n new XDomainRequest() ||\n new XMLHttpRequest();\n\n xhr.onerror = xhr.onabort = function(e){ done(\n 1, e || (xhr && xhr.responseText) || { \"error\" : \"Network Connection Error\"}\n ) };\n xhr.onload = xhr.onloadend = finished;\n xhr.onreadystatechange = function() {\n if (xhr && xhr.readyState == 4) {\n switch(xhr.status) {\n case 200:\n break;\n default:\n try {\n response = JSON['parse'](xhr.responseText);\n done(1,response);\n }\n catch (r) { return done(1, {status : xhr.status, payload : null, message : xhr.responseText}); }\n return;\n }\n }\n }\n\n var url = build_url(setup.url,data);\n\n xhr.open( 'GET', url, async );\n if (async) xhr.timeout = xhrtme;\n xhr.send();\n }\n catch(eee) {\n done(0);\n XORIGN = 0;\n return xdr(setup);\n }\n\n // Return 'done'\n return done;\n}\n\n// Test Connection State\nfunction _is_online() {\n if (!('onLine' in navigator)) return 1;\n try { return navigator['onLine'] }\n catch (e) { return true }\n}\n\n\nfunction sendBeacon(url) {\n if (!('sendBeacon' in navigator)) return false;\n\n return navigator['sendBeacon'](url);\n}\n\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n/* =-========================= PUBNUB ===========================-= */\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n\nvar PDIV = $('pubnub') || 0\n, CREATE_PUBNUB = function(setup) {\n\n // Force JSONP if requested from user.\n if (setup['jsonp']) XORIGN = 0;\n else XORIGN = UA.indexOf('MSIE 6') == -1;\n\n var SUBSCRIBE_KEY = setup['subscribe_key'] || ''\n , KEEPALIVE = (+setup['keepalive'] || DEF_KEEPALIVE) * SECOND\n , UUID = setup['uuid'] || db['get'](SUBSCRIBE_KEY+'uuid')||'';\n\n var leave_on_unload = setup['leave_on_unload'] || 0;\n\n setup['xdr'] = xdr;\n setup['db'] = db;\n setup['error'] = setup['error'] || error;\n setup['_is_online'] = _is_online;\n setup['jsonp_cb'] = jsonp_cb;\n setup['hmac_SHA256']= get_hmac_SHA256;\n setup['crypto_obj'] = crypto_obj();\n setup['sendBeacon'] = sendBeacon;\n setup['params'] = { 'pnsdk' : PNSDK }\n\n var SELF = function(setup) {\n return CREATE_PUBNUB(setup);\n };\n\n var PN = PN_API(setup);\n\n for (var prop in PN) {\n if (PN.hasOwnProperty(prop)) {\n SELF[prop] = PN[prop];\n }\n }\n SELF['css'] = css;\n SELF['$'] = $;\n SELF['create'] = create;\n SELF['bind'] = bind;\n SELF['head'] = head;\n SELF['search'] = search;\n SELF['attr'] = attr;\n SELF['events'] = events;\n SELF['init'] = SELF;\n SELF['secure'] = SELF;\n SELF['crypto_obj'] = crypto_obj(); // export to instance\n\n\n // Add Leave Functions\n bind( 'beforeunload', window, function() {\n if (leave_on_unload) SELF['each-channel'](function(ch){ SELF['LEAVE']( ch.name, 0 ) });\n return true;\n } );\n\n // Return without Testing\n if (setup['notest']) return SELF;\n\n bind( 'offline', window, SELF['offline'] );\n bind( 'offline', document, SELF['offline'] );\n\n // Return PUBNUB Socket Object\n return SELF;\n};\nCREATE_PUBNUB['init'] = CREATE_PUBNUB;\nCREATE_PUBNUB['secure'] = CREATE_PUBNUB;\nCREATE_PUBNUB['crypto_obj'] = crypto_obj(); // export to constructor\n\n// Bind for PUBNUB Readiness to Subscribe\nif (document.readyState === 'complete') {\n timeout( ready, 0 );\n}\nelse {\n bind( 'load', window, function(){ timeout( ready, 0 ) } );\n}\n\nvar pdiv = PDIV || {};\n\n// CREATE A PUBNUB GLOBAL OBJECT\nPUBNUB = CREATE_PUBNUB({\n 'notest' : 1,\n 'publish_key' : attr( pdiv, 'pub-key' ),\n 'subscribe_key' : attr( pdiv, 'sub-key' ),\n 'ssl' : !document.location.href.indexOf('https') ||\n attr( pdiv, 'ssl' ) == 'on',\n 'origin' : attr( pdiv, 'origin' ),\n 'uuid' : attr( pdiv, 'uuid' )\n});\n\n// jQuery Interface\nwindow['jQuery'] && (window['jQuery']['PUBNUB'] = CREATE_PUBNUB);\n\n// For Modern JS + Testling.js - http://testling.com/\ntypeof(module) !== 'undefined' && (module['exports'] = PUBNUB) && ready();\n\nvar pubnubs = $('pubnubs') || 0;\n\n// LEAVE NOW IF NO PDIV.\nif (!PDIV) return;\n\n// PUBNUB Flash Socket\ncss( PDIV, { 'position' : 'absolute', 'top' : -SECOND } );\n\nif ('opera' in window || attr( PDIV, 'flash' )) PDIV['innerHTML'] =\n '';\n\n// Create Interface for Opera Flash\nPUBNUB['rdx'] = function( id, data ) {\n if (!data) return FDomainRequest[id]['onerror']();\n FDomainRequest[id]['responseText'] = unescape(data);\n FDomainRequest[id]['onload']();\n};\n\nfunction FDomainRequest() {\n if (!pubnubs || !pubnubs['get']) return 0;\n\n var fdomainrequest = {\n 'id' : FDomainRequest['id']++,\n 'send' : function() {},\n 'abort' : function() { fdomainrequest['id'] = {} },\n 'open' : function( method, url ) {\n FDomainRequest[fdomainrequest['id']] = fdomainrequest;\n pubnubs['get']( fdomainrequest['id'], url );\n }\n };\n\n return fdomainrequest;\n}\nFDomainRequest['id'] = SECOND;\n\n})();\n(function(){\n\n// ---------------------------------------------------------------------------\n// WEBSOCKET INTERFACE\n// ---------------------------------------------------------------------------\nvar WS = PUBNUB['ws'] = function( url, protocols ) {\n if (!(this instanceof WS)) return new WS( url, protocols );\n\n var self = this\n , url = self.url = url || ''\n , protocol = self.protocol = protocols || 'Sec-WebSocket-Protocol'\n , bits = url.split('/')\n , setup = {\n 'ssl' : bits[0] === 'wss:'\n ,'origin' : bits[2]\n ,'publish_key' : bits[3]\n ,'subscribe_key' : bits[4]\n ,'channel' : bits[5]\n };\n\n // READY STATES\n self['CONNECTING'] = 0; // The connection is not yet open.\n self['OPEN'] = 1; // The connection is open and ready to communicate.\n self['CLOSING'] = 2; // The connection is in the process of closing.\n self['CLOSED'] = 3; // The connection is closed or couldn't be opened.\n\n // CLOSE STATES\n self['CLOSE_NORMAL'] = 1000; // Normal Intended Close; completed.\n self['CLOSE_GOING_AWAY'] = 1001; // Closed Unexpecttedly.\n self['CLOSE_PROTOCOL_ERROR'] = 1002; // Server: Not Supported.\n self['CLOSE_UNSUPPORTED'] = 1003; // Server: Unsupported Protocol.\n self['CLOSE_TOO_LARGE'] = 1004; // Server: Too Much Data.\n self['CLOSE_NO_STATUS'] = 1005; // Server: No reason.\n self['CLOSE_ABNORMAL'] = 1006; // Abnormal Disconnect.\n\n // Events Default\n self['onclose'] = self['onerror'] =\n self['onmessage'] = self['onopen'] =\n self['onsend'] = function(){};\n\n // Attributes\n self['binaryType'] = '';\n self['extensions'] = '';\n self['bufferedAmount'] = 0;\n self['trasnmitting'] = false;\n self['buffer'] = [];\n self['readyState'] = self['CONNECTING'];\n\n // Close if no setup.\n if (!url) {\n self['readyState'] = self['CLOSED'];\n self['onclose']({\n 'code' : self['CLOSE_ABNORMAL'],\n 'reason' : 'Missing URL',\n 'wasClean' : true\n });\n return self;\n }\n\n // PubNub WebSocket Emulation\n self.pubnub = PUBNUB['init'](setup);\n self.pubnub.setup = setup;\n self.setup = setup;\n\n self.pubnub['subscribe']({\n 'restore' : false,\n 'channel' : setup['channel'],\n 'disconnect' : self['onerror'],\n 'reconnect' : self['onopen'],\n 'error' : function() {\n self['onclose']({\n 'code' : self['CLOSE_ABNORMAL'],\n 'reason' : 'Missing URL',\n 'wasClean' : false\n });\n },\n 'callback' : function(message) {\n self['onmessage']({ 'data' : message });\n },\n 'connect' : function() {\n self['readyState'] = self['OPEN'];\n self['onopen']();\n }\n });\n};\n\n// ---------------------------------------------------------------------------\n// WEBSOCKET SEND\n// ---------------------------------------------------------------------------\nWS.prototype.send = function(data) {\n var self = this;\n self.pubnub['publish']({\n 'channel' : self.pubnub.setup['channel'],\n 'message' : data,\n 'callback' : function(response) {\n self['onsend']({ 'data' : response });\n }\n });\n};\n\n// ---------------------------------------------------------------------------\n// WEBSOCKET CLOSE\n// ---------------------------------------------------------------------------\nWS.prototype.close = function() {\n var self = this;\n self.pubnub['unsubscribe']({ 'channel' : self.pubnub.setup['channel'] });\n self['readyState'] = self['CLOSED'];\n self['onclose']({});\n};\n\n})();\n/*\nCryptoJS v3.1.2\ncode.google.com/p/crypto-js\n(c) 2009-2013 by Jeff Mott. All rights reserved.\ncode.google.com/p/crypto-js/wiki/License\n*/\nvar CryptoJS=CryptoJS||function(h,s){var f={},g=f.lib={},q=function(){},m=g.Base={extend:function(a){q.prototype=this;var c=new q;a&&c.mixIn(a);c.hasOwnProperty(\"init\")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty(\"toString\")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},\nr=g.WordArray=m.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=s?c:4*a.length},toString:function(a){return(a||k).stringify(this)},concat:function(a){var c=this.words,d=a.words,b=this.sigBytes;a=a.sigBytes;this.clamp();if(b%4)for(var e=0;e>>2]|=(d[e>>>2]>>>24-8*(e%4)&255)<<24-8*((b+e)%4);else if(65535>>2]=d[e>>>2];else c.push.apply(c,d);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<\n32-8*(c%4);a.length=h.ceil(c/4)},clone:function(){var a=m.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],d=0;d>>2]>>>24-8*(b%4)&255;d.push((e>>>4).toString(16));d.push((e&15).toString(16))}return d.join(\"\")},parse:function(a){for(var c=a.length,d=[],b=0;b>>3]|=parseInt(a.substr(b,\n2),16)<<24-4*(b%8);return new r.init(d,c/2)}},n=l.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var d=[],b=0;b>>2]>>>24-8*(b%4)&255));return d.join(\"\")},parse:function(a){for(var c=a.length,d=[],b=0;b>>2]|=(a.charCodeAt(b)&255)<<24-8*(b%4);return new r.init(d,c)}},j=l.Utf8={stringify:function(a){try{return decodeURIComponent(escape(n.stringify(a)))}catch(c){throw Error(\"Malformed UTF-8 data\");}},parse:function(a){return n.parse(unescape(encodeURIComponent(a)))}},\nu=g.BufferedBlockAlgorithm=m.extend({reset:function(){this._data=new r.init;this._nDataBytes=0},_append:function(a){\"string\"==typeof a&&(a=j.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,d=c.words,b=c.sigBytes,e=this.blockSize,f=b/(4*e),f=a?h.ceil(f):h.max((f|0)-this._minBufferSize,0);a=f*e;b=h.min(4*a,b);if(a){for(var g=0;gn;){var j;a:{j=k;for(var u=h.sqrt(j),t=2;t<=u;t++)if(!(j%t)){j=!1;break a}j=!0}j&&(8>n&&(m[n]=l(h.pow(k,0.5))),r[n]=l(h.pow(k,1/3)),n++);k++}var a=[],f=f.SHA256=q.extend({_doReset:function(){this._hash=new g.init(m.slice(0))},_doProcessBlock:function(c,d){for(var b=this._hash.words,e=b[0],f=b[1],g=b[2],j=b[3],h=b[4],m=b[5],n=b[6],q=b[7],p=0;64>p;p++){if(16>p)a[p]=\nc[d+p]|0;else{var k=a[p-15],l=a[p-2];a[p]=((k<<25|k>>>7)^(k<<14|k>>>18)^k>>>3)+a[p-7]+((l<<15|l>>>17)^(l<<13|l>>>19)^l>>>10)+a[p-16]}k=q+((h<<26|h>>>6)^(h<<21|h>>>11)^(h<<7|h>>>25))+(h&m^~h&n)+r[p]+a[p];l=((e<<30|e>>>2)^(e<<19|e>>>13)^(e<<10|e>>>22))+(e&f^e&g^f&g);q=n;n=m;m=h;h=j+k|0;j=g;g=f;f=e;e=k+l|0}b[0]=b[0]+e|0;b[1]=b[1]+f|0;b[2]=b[2]+g|0;b[3]=b[3]+j|0;b[4]=b[4]+h|0;b[5]=b[5]+m|0;b[6]=b[6]+n|0;b[7]=b[7]+q|0},_doFinalize:function(){var a=this._data,d=a.words,b=8*this._nDataBytes,e=8*a.sigBytes;\nd[e>>>5]|=128<<24-e%32;d[(e+64>>>9<<4)+14]=h.floor(b/4294967296);d[(e+64>>>9<<4)+15]=b;a.sigBytes=4*d.length;this._process();return this._hash},clone:function(){var a=q.clone.call(this);a._hash=this._hash.clone();return a}});s.SHA256=q._createHelper(f);s.HmacSHA256=q._createHmacHelper(f)})(Math);\n\n// HMAC SHA256\n(function(){var h=CryptoJS,s=h.enc.Utf8;h.algo.HMAC=h.lib.Base.extend({init:function(f,g){f=this._hasher=new f.init;\"string\"==typeof g&&(g=s.parse(g));var h=f.blockSize,m=4*h;g.sigBytes>m&&(g=f.finalize(g));g.clamp();for(var r=this._oKey=g.clone(),l=this._iKey=g.clone(),k=r.words,n=l.words,j=0;j>>2]>>>24-8*(r%4)&255)<<16|(l[r+1>>>2]>>>24-8*((r+1)%4)&255)<<8|l[r+2>>>2]>>>24-8*((r+2)%4)&255,v=0;4>v&&r+0.75*v>>6*(3-v)&63));if(l=t.charAt(64))for(;d.length%4;)d.push(l);return d.join(\"\")},parse:function(d){var l=d.length,s=this._map,t=s.charAt(64);t&&(t=d.indexOf(t),-1!=t&&(l=t));for(var t=[],r=0,w=0;w<\nl;w++)if(w%4){var v=s.indexOf(d.charAt(w-1))<<2*(w%4),b=s.indexOf(d.charAt(w))>>>6-2*(w%4);t[r>>>2]|=(v|b)<<24-8*(r%4);r++}return p.create(t,r)},_map:\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\"}})();\n\n// BlockCipher\n(function(u){function p(b,n,a,c,e,j,k){b=b+(n&a|~n&c)+e+k;return(b<>>32-j)+n}function d(b,n,a,c,e,j,k){b=b+(n&c|a&~c)+e+k;return(b<>>32-j)+n}function l(b,n,a,c,e,j,k){b=b+(n^a^c)+e+k;return(b<>>32-j)+n}function s(b,n,a,c,e,j,k){b=b+(a^(n|~c))+e+k;return(b<>>32-j)+n}for(var t=CryptoJS,r=t.lib,w=r.WordArray,v=r.Hasher,r=t.algo,b=[],x=0;64>x;x++)b[x]=4294967296*u.abs(u.sin(x+1))|0;r=r.MD5=v.extend({_doReset:function(){this._hash=new w.init([1732584193,4023233417,2562383102,271733878])},\n_doProcessBlock:function(q,n){for(var a=0;16>a;a++){var c=n+a,e=q[c];q[c]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360}var a=this._hash.words,c=q[n+0],e=q[n+1],j=q[n+2],k=q[n+3],z=q[n+4],r=q[n+5],t=q[n+6],w=q[n+7],v=q[n+8],A=q[n+9],B=q[n+10],C=q[n+11],u=q[n+12],D=q[n+13],E=q[n+14],x=q[n+15],f=a[0],m=a[1],g=a[2],h=a[3],f=p(f,m,g,h,c,7,b[0]),h=p(h,f,m,g,e,12,b[1]),g=p(g,h,f,m,j,17,b[2]),m=p(m,g,h,f,k,22,b[3]),f=p(f,m,g,h,z,7,b[4]),h=p(h,f,m,g,r,12,b[5]),g=p(g,h,f,m,t,17,b[6]),m=p(m,g,h,f,w,22,b[7]),\nf=p(f,m,g,h,v,7,b[8]),h=p(h,f,m,g,A,12,b[9]),g=p(g,h,f,m,B,17,b[10]),m=p(m,g,h,f,C,22,b[11]),f=p(f,m,g,h,u,7,b[12]),h=p(h,f,m,g,D,12,b[13]),g=p(g,h,f,m,E,17,b[14]),m=p(m,g,h,f,x,22,b[15]),f=d(f,m,g,h,e,5,b[16]),h=d(h,f,m,g,t,9,b[17]),g=d(g,h,f,m,C,14,b[18]),m=d(m,g,h,f,c,20,b[19]),f=d(f,m,g,h,r,5,b[20]),h=d(h,f,m,g,B,9,b[21]),g=d(g,h,f,m,x,14,b[22]),m=d(m,g,h,f,z,20,b[23]),f=d(f,m,g,h,A,5,b[24]),h=d(h,f,m,g,E,9,b[25]),g=d(g,h,f,m,k,14,b[26]),m=d(m,g,h,f,v,20,b[27]),f=d(f,m,g,h,D,5,b[28]),h=d(h,f,\nm,g,j,9,b[29]),g=d(g,h,f,m,w,14,b[30]),m=d(m,g,h,f,u,20,b[31]),f=l(f,m,g,h,r,4,b[32]),h=l(h,f,m,g,v,11,b[33]),g=l(g,h,f,m,C,16,b[34]),m=l(m,g,h,f,E,23,b[35]),f=l(f,m,g,h,e,4,b[36]),h=l(h,f,m,g,z,11,b[37]),g=l(g,h,f,m,w,16,b[38]),m=l(m,g,h,f,B,23,b[39]),f=l(f,m,g,h,D,4,b[40]),h=l(h,f,m,g,c,11,b[41]),g=l(g,h,f,m,k,16,b[42]),m=l(m,g,h,f,t,23,b[43]),f=l(f,m,g,h,A,4,b[44]),h=l(h,f,m,g,u,11,b[45]),g=l(g,h,f,m,x,16,b[46]),m=l(m,g,h,f,j,23,b[47]),f=s(f,m,g,h,c,6,b[48]),h=s(h,f,m,g,w,10,b[49]),g=s(g,h,f,m,\nE,15,b[50]),m=s(m,g,h,f,r,21,b[51]),f=s(f,m,g,h,u,6,b[52]),h=s(h,f,m,g,k,10,b[53]),g=s(g,h,f,m,B,15,b[54]),m=s(m,g,h,f,e,21,b[55]),f=s(f,m,g,h,v,6,b[56]),h=s(h,f,m,g,x,10,b[57]),g=s(g,h,f,m,t,15,b[58]),m=s(m,g,h,f,D,21,b[59]),f=s(f,m,g,h,z,6,b[60]),h=s(h,f,m,g,C,10,b[61]),g=s(g,h,f,m,j,15,b[62]),m=s(m,g,h,f,A,21,b[63]);a[0]=a[0]+f|0;a[1]=a[1]+m|0;a[2]=a[2]+g|0;a[3]=a[3]+h|0},_doFinalize:function(){var b=this._data,n=b.words,a=8*this._nDataBytes,c=8*b.sigBytes;n[c>>>5]|=128<<24-c%32;var e=u.floor(a/\n4294967296);n[(c+64>>>9<<4)+15]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360;n[(c+64>>>9<<4)+14]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;b.sigBytes=4*(n.length+1);this._process();b=this._hash;n=b.words;for(a=0;4>a;a++)c=n[a],n[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return b},clone:function(){var b=v.clone.call(this);b._hash=this._hash.clone();return b}});t.MD5=v._createHelper(r);t.HmacMD5=v._createHmacHelper(r)})(Math);\n(function(){var u=CryptoJS,p=u.lib,d=p.Base,l=p.WordArray,p=u.algo,s=p.EvpKDF=d.extend({cfg:d.extend({keySize:4,hasher:p.MD5,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(d,r){for(var p=this.cfg,s=p.hasher.create(),b=l.create(),u=b.words,q=p.keySize,p=p.iterations;u.length>>2]&255}};d.BlockCipher=v.extend({cfg:v.cfg.extend({mode:b,padding:q}),reset:function(){v.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;this._mode=c.call(a,\nthis,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var n=d.CipherParams=l.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),b=(p.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;return(a?s.create([1398893684,\n1701076831]).concat(a).concat(b):b).toString(r)},parse:function(a){a=r.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=s.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return n.create({ciphertext:a,salt:c})}},a=d.SerializableCipher=l.extend({cfg:l.extend({format:b}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var l=a.createEncryptor(c,d);b=l.finalize(b);l=l.cfg;return n.create({ciphertext:b,key:c,iv:l.iv,algorithm:a,mode:l.mode,padding:l.padding,blockSize:a.blockSize,formatter:d.format})},\ndecrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return\"string\"==typeof a?b.parse(a,this):a}}),p=(p.kdf={}).OpenSSL={execute:function(a,b,c,d){d||(d=s.random(8));a=w.create({keySize:b+c}).compute(a,d);c=s.create(a.words.slice(b),4*c);a.sigBytes=4*b;return n.create({key:a,iv:c,salt:d})}},c=d.PasswordBasedCipher=a.extend({cfg:a.cfg.extend({kdf:p}),encrypt:function(b,c,d,l){l=this.cfg.extend(l);d=l.kdf.execute(d,\nb.keySize,b.ivSize);l.iv=d.iv;b=a.encrypt.call(this,b,c,d.key,l);b.mixIn(d);return b},decrypt:function(b,c,d,l){l=this.cfg.extend(l);c=this._parse(c,l.format);d=l.kdf.execute(d,b.keySize,b.ivSize,c.salt);l.iv=d.iv;return a.decrypt.call(this,b,c,d.key,l)}})}();\n\n// AES\n(function(){for(var u=CryptoJS,p=u.lib.BlockCipher,d=u.algo,l=[],s=[],t=[],r=[],w=[],v=[],b=[],x=[],q=[],n=[],a=[],c=0;256>c;c++)a[c]=128>c?c<<1:c<<1^283;for(var e=0,j=0,c=0;256>c;c++){var k=j^j<<1^j<<2^j<<3^j<<4,k=k>>>8^k&255^99;l[e]=k;s[k]=e;var z=a[e],F=a[z],G=a[F],y=257*a[k]^16843008*k;t[e]=y<<24|y>>>8;r[e]=y<<16|y>>>16;w[e]=y<<8|y>>>24;v[e]=y;y=16843009*G^65537*F^257*z^16843008*e;b[k]=y<<24|y>>>8;x[k]=y<<16|y>>>16;q[k]=y<<8|y>>>24;n[k]=y;e?(e=z^a[a[a[G^z]]],j^=a[a[j]]):e=j=1}var H=[0,1,2,4,8,\n16,32,64,128,27,54],d=d.AES=p.extend({_doReset:function(){for(var a=this._key,c=a.words,d=a.sigBytes/4,a=4*((this._nRounds=d+6)+1),e=this._keySchedule=[],j=0;j>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255]):(k=k<<8|k>>>24,k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255],k^=H[j/d|0]<<24);e[j]=e[j-d]^k}c=this._invKeySchedule=[];for(d=0;dd||4>=j?k:b[l[k>>>24]]^x[l[k>>>16&255]]^q[l[k>>>\n8&255]]^n[l[k&255]]},encryptBlock:function(a,b){this._doCryptBlock(a,b,this._keySchedule,t,r,w,v,l)},decryptBlock:function(a,c){var d=a[c+1];a[c+1]=a[c+3];a[c+3]=d;this._doCryptBlock(a,c,this._invKeySchedule,b,x,q,n,s);d=a[c+1];a[c+1]=a[c+3];a[c+3]=d},_doCryptBlock:function(a,b,c,d,e,j,l,f){for(var m=this._nRounds,g=a[b]^c[0],h=a[b+1]^c[1],k=a[b+2]^c[2],n=a[b+3]^c[3],p=4,r=1;r>>24]^e[h>>>16&255]^j[k>>>8&255]^l[n&255]^c[p++],s=d[h>>>24]^e[k>>>16&255]^j[n>>>8&255]^l[g&255]^c[p++],t=\nd[k>>>24]^e[n>>>16&255]^j[g>>>8&255]^l[h&255]^c[p++],n=d[n>>>24]^e[g>>>16&255]^j[h>>>8&255]^l[k&255]^c[p++],g=q,h=s,k=t;q=(f[g>>>24]<<24|f[h>>>16&255]<<16|f[k>>>8&255]<<8|f[n&255])^c[p++];s=(f[h>>>24]<<24|f[k>>>16&255]<<16|f[n>>>8&255]<<8|f[g&255])^c[p++];t=(f[k>>>24]<<24|f[n>>>16&255]<<16|f[g>>>8&255]<<8|f[h&255])^c[p++];n=(f[n>>>24]<<24|f[g>>>16&255]<<16|f[h>>>8&255]<<8|f[k&255])^c[p++];a[b]=q;a[b+1]=s;a[b+2]=t;a[b+3]=n},keySize:8});u.AES=p._createHelper(d)})();\n\n// Mode ECB\nCryptoJS.mode.ECB = (function () {\n var ECB = CryptoJS.lib.BlockCipherMode.extend();\n\n ECB.Encryptor = ECB.extend({\n processBlock: function (words, offset) {\n this._cipher.encryptBlock(words, offset);\n }\n });\n\n ECB.Decryptor = ECB.extend({\n processBlock: function (words, offset) {\n this._cipher.decryptBlock(words, offset);\n }\n });\n\n return ECB;\n}());// Moved to hmac-sha-256.js\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./bower_components/pubnub/web/pubnub.js\n ** module id = 10\n ** module chunks = 0\n **/","export default class Cache {\n\n static defaultPrefix = 'rc-';\n\n constructor(storage, prefix) {\n this.setPrefix(prefix);\n this._storage = storage;\n }\n\n setPrefix(prefix) {\n this._prefix = prefix || Cache.defaultPrefix;\n return this;\n }\n\n setItem(key, data) {\n this._storage[this._prefixKey(key)] = JSON.stringify(data);\n return this;\n }\n\n removeItem(key) {\n delete this._storage[this._prefixKey(key)];\n return this;\n }\n\n getItem(key) {\n var item = this._storage[this._prefixKey(key)];\n if (!item) return null;\n return JSON.parse(item);\n }\n\n clean() {\n\n for (var key in this._storage) {\n\n if (!this._storage.hasOwnProperty(key)) continue;\n\n if (key.indexOf(this._prefix) === 0) {\n delete this._storage[key];\n }\n\n }\n\n return this;\n\n }\n\n _prefixKey(key) {\n return this._prefix + key;\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Cache.js\n **/","export default class Observable {\n\n constructor() {\n this.off();\n }\n\n hasListeners(event) {\n return (event in this._listeners);\n }\n\n on(events, callback) {\n\n if (typeof events == 'string') events = [events];\n if (!events) throw new Error('No events to subscribe to');\n if (typeof callback !== 'function') throw new Error('Callback must be a function');\n\n events.forEach((event) => {\n\n if (!this.hasListeners(event)) this._listeners[event] = [];\n\n this._listeners[event].push(callback);\n\n });\n\n return this;\n\n }\n\n emit(event, ...args) {\n\n var result = null;\n\n if (!this.hasListeners(event)) return null;\n\n this._listeners[event].some((callback) => {\n\n result = callback.apply(this, args);\n return (result === false);\n\n });\n\n return result;\n\n }\n\n off(event, callback) {\n\n if (!event) {\n\n this._listeners = {};\n\n } else {\n\n if (!callback) {\n\n delete this._listeners[event];\n\n } else {\n\n if (!this.hasListeners(event)) return this;\n\n this._listeners[event].forEach((cb, i) => {\n\n if (cb === callback) delete this._listeners[event][i];\n\n });\n\n }\n\n }\n\n return this;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Observable.js\n **/","import {Promise} from '../core/Externals';\nimport {poll, stopPolling} from './Utils';\n\nexport default class Queue {\n\n static _pollInterval = 250;\n static _releaseTimeout = 5000;\n\n constructor(cache, cacheId) {\n\n this._cache = cache;\n this._cacheId = cacheId;\n this._promise = null;\n\n }\n\n isPaused() {\n\n var time = this._cache.getItem(this._cacheId);\n\n return !!time && Date.now() - parseInt(time) < Queue._releaseTimeout;\n }\n\n pause() {\n this._cache.setItem(this._cacheId, Date.now());\n return this;\n }\n\n resume() {\n this._cache.removeItem(this._cacheId);\n return this;\n }\n\n poll() {\n\n if (this._promise) return this._promise;\n\n this._promise = new Promise((resolve, reject) => {\n\n poll((next) => {\n\n if (this.isPaused()) return next();\n\n this._promise = null;\n\n this.resume(); // this is actually not needed but why not\n\n resolve(null);\n\n }, Queue._pollInterval);\n\n });\n\n return this._promise;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Queue.js\n **/","import {fetch, Request, Response, Headers, Promise} from '../core/Externals';\nimport {queryStringify} from '../core/Utils';\nimport {findHeaderName} from './Utils';\nimport Observable from '../core/Observable';\nimport ApiResponse from './ApiResponse';\n\nexport default class Client extends Observable {\n\n static _allowedMethods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'];\n\n events = {\n beforeRequest: 'beforeRequest',\n requestSuccess: 'requestSuccess',\n requestError: 'requestError'\n };\n\n /**\n * @param {Request} request\n * @return {Promise}\n */\n async sendRequest(request) {\n\n var apiResponse = new ApiResponse(request);\n\n try {\n\n //TODO Stop request if listeners return false\n this.emit(this.events.beforeRequest, apiResponse);\n\n apiResponse._response = await this._loadResponse(request);\n\n if (apiResponse._isMultipart() || apiResponse._isJson()) {\n apiResponse._text = await apiResponse.response().text();\n }\n\n if (!apiResponse.ok()) throw new Error('Response has unsuccessful status');\n\n this.emit(this.events.requestSuccess, apiResponse);\n\n return apiResponse;\n\n } catch (e) {\n\n if (!e.apiResponse) e = this.makeError(e, apiResponse);\n\n this.emit(this.events.requestError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @param {Request} request\n * @return {Promise}\n * @private\n */\n async _loadResponse(request) {\n return await fetch.call(null, request);\n }\n\n /**\n * Wraps the JS Error object with transaction information\n * @param {Error|IApiError} e\n * @param {ApiResponse} apiResponse\n * @return {IApiError}\n */\n makeError(e, apiResponse) {\n\n // Wrap only if regular error\n if (!e.hasOwnProperty('apiResponse') && !e.hasOwnProperty('originalMessage')) {\n\n e.apiResponse = apiResponse;\n e.originalMessage = e.message;\n e.message = (apiResponse && apiResponse.error(true)) || e.originalMessage;\n\n }\n\n return e;\n\n }\n\n /**\n *\n * @param {object} init\n * @param {object} [init.url]\n * @param {object} [init.body]\n * @param {string} [init.method]\n * @param {object} [init.query]\n * @param {object} [init.headers]\n * @return {Request}\n */\n createRequest(init) {\n\n init = init || {};\n init.headers = init.headers || {};\n\n // Sanity checks\n if (!init.url) throw new Error('Url is not defined');\n if (!init.method) init.method = 'GET';\n if (init.method && Client._allowedMethods.indexOf(init.method) < 0) throw new Error('Method has wrong value: ' + init.method);\n\n // Defaults\n init.credentials = init.credentials || 'include';\n init.mode = init.mode || 'cors';\n\n // Append Query String\n if (init.query) {\n init.url = init.url + (init.url.indexOf('?') > -1 ? '&' : '?') + queryStringify(init.query);\n }\n\n if (!(findHeaderName('Accept', init.headers))) {\n init.headers['Accept'] = ApiResponse._jsonContentType;\n }\n\n // Serialize body\n //TODO Check that body is a plain object\n if (typeof init.body !== 'string' || !init.body) {\n\n var contentTypeHeaderName = findHeaderName(ApiResponse._contentType, init.headers);\n\n if (!contentTypeHeaderName) {\n contentTypeHeaderName = ApiResponse._contentType;\n init.headers[contentTypeHeaderName] = ApiResponse._jsonContentType;\n }\n\n var contentType = init.headers[contentTypeHeaderName];\n\n // Assign a new encoded body\n if (contentType.indexOf(ApiResponse._jsonContentType) > -1) {\n init.body = JSON.stringify(init.body);\n } else if (contentType.indexOf(ApiResponse._urlencodedContentType) > -1) {\n init.body = queryStringify(init.body);\n }\n\n }\n\n // Create a request with encoded body\n var req = new Request(init.url, init);\n\n // Keep the original body accessible directly (for mocks)\n req.originalBody = init.body;\n\n return req;\n\n }\n\n}\n\n/**\n * @name IApiError\n * @property {string} stack\n * @property {string} originalMessage\n * @property {ApiResponse} apiResponse\n */\n\n\n/** WEBPACK FOOTER **\n ** ./src/http/Client.js\n **/","import {fetch, Request, Response, Headers, Promise} from '../core/Externals';\nimport * as utils from '../core/Utils';\n\n/**\n * Creates a response\n * @param stringBody\n * @param init\n * @return {Response}\n */\nexport function createResponse(stringBody, init) {\n\n init = init || {};\n\n var response = new Response(stringBody, init);\n\n //TODO Wait for https://github.com/bitinn/node-fetch/issues/38\n if (utils.isNodeJS()) {\n\n response._text = stringBody;\n response._decode = function() {\n return this._text;\n };\n\n }\n\n return response;\n\n}\n\nexport function findHeaderName(name, headers) {\n name = name.toLowerCase();\n return Object.keys(headers).reduce(function(res, key) {\n if (res) return res;\n if (name == key.toLowerCase()) return key;\n return res;\n }, null);\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/http/Utils.js\n **/","import {fetch, Request, Response, Headers, Promise} from '../core/Externals';\nimport * as utils from './Utils';\n\nexport default class ApiResponse {\n\n static _contentType = 'Content-Type';\n static _jsonContentType = 'application/json';\n static _multipartContentType = 'multipart/mixed';\n static _urlencodedContentType = 'application/x-www-form-urlencoded';\n static _headerSeparator = ':';\n static _bodySeparator = '\\n\\n';\n static _boundarySeparator = '--';\n\n /**\n * @param {Request} request\n * @param {Response} response\n * @param {string} responseText\n */\n constructor(request, response, responseText) {\n\n /** @type {Request} */\n this._request = request;\n\n /** @type {Response} */\n this._response = response;\n\n this._text = responseText;\n this._json = null;\n this._multipart = [];\n\n }\n\n /**\n * @return {Response}\n */\n response() {\n return this._response;\n }\n\n /**\n * @return {Request}\n */\n request() {\n return this._request;\n }\n\n /**\n * @return {boolean}\n */\n ok() {\n return this._response && this._response.ok;\n }\n\n /**\n * @return {string}\n */\n text() {\n if (!this._isJson() && !this._isMultipart()) throw new Error('Response is not text');\n return this._text;\n }\n\n /**\n * @return {object}\n */\n json() {\n if (!this._isJson()) throw new Error('Response is not JSON');\n if (!this._json) {\n this._json = this._text ? JSON.parse(this._text) : null;\n }\n return this._json;\n }\n\n /**\n * @param [skipOKCheck]\n * @return {string}\n */\n error(skipOKCheck) {\n\n if (this.ok() && !skipOKCheck) return null;\n\n var message = (this._response && this._response.status ? this._response.status + ' ' : '') +\n (this._response && this._response.statusText ? this._response.statusText : '');\n\n try {\n\n if (this.json().message) message = this.json().message;\n if (this.json().error_description) message = this.json().error_description;\n if (this.json().description) message = this.json().description;\n\n } catch (e) {}\n\n return message;\n\n }\n\n /**\n * @return {ApiResponse[]}\n */\n multipart() {\n\n if (!this._isMultipart()) throw new Error('Response is not multipart');\n\n if (!this._multipart.length) {\n\n // Step 1. Split multipart response\n\n var text = this.text();\n\n if (!text) throw new Error('No response body');\n\n var boundary = this._getContentType().match(/boundary=([^;]+)/i)[1];\n\n if (!boundary) throw new Error('Cannot find boundary');\n\n var parts = text.toString().split(ApiResponse._boundarySeparator + boundary);\n\n if (parts[0].trim() === '') parts.shift();\n if (parts[parts.length - 1].trim() == ApiResponse._boundarySeparator) parts.pop();\n\n if (parts.length < 1) throw new Error('No parts in body');\n\n // Step 2. Parse status info\n\n var statusInfo = ApiResponse.create(parts.shift(), this._response.status, this._response.statusText).json();\n\n // Step 3. Parse all other parts\n\n this._multipart = parts.map((part:string, i) => {\n\n var status = statusInfo.response[i].status;\n\n return ApiResponse.create(part, status);\n\n });\n\n }\n\n return this._multipart;\n\n }\n\n _isContentType(contentType) {\n return this._getContentType().indexOf(contentType) > -1;\n }\n\n _getContentType() {\n return this._response.headers.get(ApiResponse._contentType) || '';\n }\n\n _isMultipart() {\n return this._isContentType(ApiResponse._multipartContentType);\n }\n\n _isUrlEncoded() {\n return this._isContentType(ApiResponse._urlencodedContentType);\n }\n\n _isJson() {\n return this._isContentType(ApiResponse._jsonContentType);\n }\n\n /**\n * Method is used to create ApiResponse object from string parts of multipart/mixed response\n * @param {string} [text]\n * @param {number} [status]\n * @param {string} [statusText]\n * @return {ApiResponse}\n */\n static create(text, status, statusText) {\n\n text = text || '';\n status = status || 200;\n statusText = statusText || 'OK';\n\n text = text.replace(/\\r/g, '');\n\n var headers = new Headers(),\n headersAndBody = text.split(ApiResponse._bodySeparator),\n headersText = (headersAndBody.length > 1) ? headersAndBody.shift() : '';\n\n text = headersAndBody.join(ApiResponse._bodySeparator);\n\n (headersText || '')\n .split('\\n')\n .forEach((header:string) => {\n\n var split = header.trim().split(ApiResponse._headerSeparator),\n key = split.shift().trim(),\n value = split.join(ApiResponse._headerSeparator).trim();\n\n if (key) headers.append(key, value);\n\n });\n\n return new ApiResponse(null, utils.createResponse(text, {\n headers: headers,\n status: status,\n statusText: statusText\n }), text);\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/http/ApiResponse.js\n **/","import Registry from './Registry';\nimport {default as HttpClient} from '../http/Client';\n\nexport default class Client extends HttpClient {\n\n constructor() {\n super();\n this._registry = new Registry();\n }\n\n registry() {\n return this._registry;\n }\n\n async _loadResponse(request) {\n\n var mock = this._registry.find(request);\n\n return await mock.getResponse(request);\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/mocks/ClientMock.js\n **/","import Mock from './Mock';\n\nexport default class Registry {\n\n constructor() {\n this._mocks = [];\n }\n\n add(mock) {\n this._mocks.push(mock);\n return this;\n }\n\n clear() {\n this._mocks = [];\n return this;\n }\n\n find(request) {\n\n //console.log('Registry is looking for', request);\n\n var mock = this._mocks.shift();\n\n if (!mock) throw new Error('No mock in registry for request ' + request.method + ' ' + request.url);\n\n if (!mock.test(request)) throw new Error('Wrong request ' + request.method + ' ' + request.url +\n ' for expected mock ' + mock.method() + ' ' + mock.path());\n\n return mock;\n\n }\n\n apiCall(method:string, path:string, response:any, status, statusText) {\n\n this.add(new Mock(method, path, response, status, statusText));\n\n return this;\n\n }\n\n authentication() {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'access_token': 'ACCESS_TOKEN',\n 'token_type': 'bearer',\n 'expires_in': 3600,\n 'refresh_token': 'REFRESH_TOKEN',\n 'refresh_token_expires_in': 60480,\n 'scope': 'SMS RCM Foo Boo',\n 'expireTime': new Date().getTime() + 3600000\n });\n\n return this;\n\n }\n\n logout() {\n\n this.apiCall('POST', '/restapi/oauth/revoke', {});\n\n return this;\n\n }\n\n presenceLoad(id) {\n\n this.apiCall('GET', '/restapi/v1.0/account/~/extension/' + id + '/presence', {\n \"uri\": \"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/\" + id + \"/presence\",\n \"extension\": {\n \"uri\": \"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/\" + id,\n \"id\": id,\n \"extensionNumber\": \"101\"\n },\n \"activeCalls\": [],\n \"presenceStatus\": \"Available\",\n \"telephonyStatus\": \"Ringing\",\n \"userStatus\": \"Available\",\n \"dndStatus\": \"TakeAllCalls\",\n \"extensionId\": id\n });\n\n return this;\n\n }\n\n subscribeGeneric(expiresIn) {\n\n expiresIn = expiresIn || 15 * 60 * 60;\n\n var date = new Date();\n\n this.apiCall('POST', '/restapi/v1.0/subscription', {\n 'eventFilters': [\n '/restapi/v1.0/account/~/extension/~/presence'\n ],\n 'expirationTime': new Date(date.getTime() + (expiresIn * 1000)).toISOString(),\n 'expiresIn': expiresIn,\n 'deliveryMode': {\n 'transportType': 'PubNub',\n 'encryption': false,\n 'address': '123_foo',\n 'subscriberKey': 'sub-c-foo',\n 'secretKey': 'sec-c-bar'\n },\n 'id': 'foo-bar-baz',\n 'creationTime': date.toISOString(),\n 'status': 'Active',\n 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz'\n });\n\n return this;\n\n }\n\n subscribeOnPresence(id, detailed) {\n\n id = id || '1';\n\n var date = new Date();\n\n this.apiCall('POST', '/restapi/v1.0/subscription', {\n 'eventFilters': ['/restapi/v1.0/account/~/extension/' + id + '/presence' + (detailed ? '?detailedTelephonyState=true' : '')],\n 'expirationTime': new Date(date.getTime() + (15 * 60 * 60 * 1000)).toISOString(),\n 'deliveryMode': {\n 'transportType': 'PubNub',\n 'encryption': true,\n 'address': '123_foo',\n 'subscriberKey': 'sub-c-foo',\n 'secretKey': 'sec-c-bar',\n 'encryptionAlgorithm': 'AES',\n 'encryptionKey': 'VQwb6EVNcQPBhE/JgFZ2zw=='\n },\n 'creationTime': date.toISOString(),\n 'id': 'foo-bar-baz',\n 'status': 'Active',\n 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz'\n });\n\n return this;\n\n }\n\n tokenRefresh(failure) {\n\n if (!failure) {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'access_token': 'ACCESS_TOKEN_FROM_REFRESH',\n 'token_type': 'bearer',\n 'expires_in': 3600,\n 'refresh_token': 'REFRESH_TOKEN_FROM_REFRESH',\n 'refresh_token_expires_in': 60480,\n 'scope': 'SMS RCM Foo Boo'\n });\n\n } else {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'message': 'Wrong token',\n 'error_description': 'Wrong token',\n 'description': 'Wrong token'\n }, 400);\n\n }\n\n return this;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/mocks/Registry.js\n **/","import ApiResponse from '../http/ApiResponse';\nimport {delay} from '../core/Utils';\nimport {createResponse} from '../http/Utils';\n\nexport default class Mock {\n\n constructor(method, path, json, status, statusText, delay) {\n this._method = method.toUpperCase();\n this._path = path;\n this._json = json || {};\n this._delay = delay || 10;\n this._status = status || 200;\n this._statusText = statusText || 'OK';\n }\n\n path() {\n return this._path;\n }\n\n method() {\n return this._method;\n }\n\n test(request:Request) {\n\n return request.url.indexOf(this._path) > -1 &&\n request.method.toUpperCase() == this._method;\n\n }\n\n async getResponse(request) {\n\n await delay(this._delay);\n\n return this.createResponse(this._json);\n\n }\n\n createResponse(json, init) {\n\n init = init || {};\n\n init.status = init.status || this._status;\n init.statusText = init.statusText || this._statusText;\n\n var str = JSON.stringify(json),\n res = createResponse(str, init);\n\n res.headers.set(ApiResponse._contentType, ApiResponse._jsonContentType);\n\n return res;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/mocks/Mock.js\n **/","import Observable from '../core/Observable';\nimport Queue from '../core/Queue';\nimport Auth from './Auth';\nimport {Promise} from '../core/Externals';\nimport {queryStringify, parseQueryString, delay} from '../core/Utils';\n\nexport default class Platform extends Observable {\n\n static _urlPrefix = '/restapi';\n static _apiVersion = 'v1.0';\n static _accessTokenTtl = null; // Platform server by default sets it to 60 * 60 = 1 hour\n static _refreshTokenTtl = 10 * 60 * 60; // 10 hours\n static _refreshTokenTtlRemember = 7 * 24 * 60 * 60; // 1 week\n static _tokenEndpoint = '/restapi/oauth/token';\n static _revokeEndpoint = '/restapi/oauth/revoke';\n static _authorizeEndpoint = '/restapi/oauth/authorize';\n static _refreshDelayMs = 100;\n static _cacheId = 'platform';\n static _clearCacheOnRefreshError = true;\n\n events = {\n beforeLogin: 'beforeLogin',\n loginSuccess: 'loginSuccess',\n loginError: 'loginError',\n beforeRefresh: 'beforeRefresh',\n refreshSuccess: 'refreshSuccess',\n refreshError: 'refreshError',\n beforeLogout: 'beforeLogout',\n logoutSuccess: 'logoutSuccess',\n logoutError: 'logoutError'\n };\n\n constructor(client, cache, server, appKey, appSecret) {\n\n super();\n\n this._server = server;\n this._appKey = appKey;\n this._appSecret = appSecret;\n\n /** @type {Cache} */\n this._cache = cache;\n\n /** @type {Client} */\n this._client = client;\n\n this._queue = new Queue(this._cache, Platform._cacheId + '-refresh');\n\n this._auth = new Auth(this._cache, Platform._cacheId);\n\n }\n\n /**\n * @return {Auth}\n */\n auth() {\n return this._auth;\n }\n\n /**\n * @return {Client}\n */\n client() {\n return this._client;\n }\n\n /**\n * @param {string} path\n * @param {object} [options]\n * @param {boolean} [options.addServer]\n * @param {string} [options.addMethod]\n * @param {boolean} [options.addToken]\n * @return {string}\n */\n createUrl(path, options) {\n\n path = path || '';\n options = options || {};\n\n var builtUrl = '',\n hasHttp = path.indexOf('http://') != -1 || path.indexOf('https://') != -1;\n\n if (options.addServer && !hasHttp) builtUrl += this._server;\n\n if (path.indexOf(Platform._urlPrefix) == -1 && !hasHttp) builtUrl += Platform._urlPrefix + '/' + Platform._apiVersion;\n\n builtUrl += path;\n\n if (options.addMethod || options.addToken) builtUrl += (path.indexOf('?') > -1 ? '&' : '?');\n\n if (options.addMethod) builtUrl += '_method=' + options.addMethod;\n if (options.addToken) builtUrl += (options.addMethod ? '&' : '') + 'access_token=' + this._auth.accessToken();\n\n return builtUrl;\n\n }\n\n /**\n * @param {string} options.redirectUri\n * @param {string} options.state\n * @param {string} options.brandId\n * @param {string} options.display\n * @param {string} options.prompt\n * @return {string}\n */\n authUrl(options) {\n\n options = options || {};\n\n return this.createUrl(Platform._authorizeEndpoint + '?' + queryStringify({\n 'response_type': 'code',\n 'redirect_uri': options.redirectUri || '',\n 'client_id': this._appKey,\n 'state': options.state || '',\n 'brand_id': options.brandId || '',\n 'display': options.display || '',\n 'prompt': options.prompt || ''\n }), {addServer: true})\n\n }\n\n /**\n * @param {string} url\n * @return {Object}\n */\n parseAuthRedirectUrl(url:string) {\n\n var qs = parseQueryString(url.split('?').reverse()[0]),\n error = qs.error_description || qs.error;\n\n if (error) {\n var e = new Error(error);\n e.error = qs.error;\n throw e;\n }\n\n return qs;\n\n }\n\n /**\n * @return {Promise}\n */\n async loggedIn() {\n\n try {\n await this._ensureAuthentication();\n return true;\n } catch (e) {\n return false;\n }\n\n }\n\n /**\n * @param {string} options.username\n * @param {string} options.password\n * @param {string} options.extension\n * @param {string} options.code\n * @param {string} options.redirectUri\n * @param {string} options.endpointId\n * @returns {Promise}\n */\n async login(options) {\n\n try {\n\n options = options || {};\n\n options.remember = options.remember || false;\n\n this.emit(this.events.beforeLogin);\n\n var body = {\n \"access_token_ttl\": Platform._accessTokenTtl,\n \"refresh_token_ttl\": options.remember ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl\n };\n\n if (!options.code) {\n\n body.grant_type = 'password';\n body.username = options.username;\n body.password = options.password;\n body.extension = options.extension || '';\n\n } else if (options.code) {\n\n body.grant_type = 'authorization_code';\n body.code = options.code;\n body.redirect_uri = options.redirectUri;\n //body.client_id = this.getCredentials().key; // not needed\n\n }\n\n if (options.endpointId) body.endpoint_id = options.endpointId;\n\n var apiResponse = await this._tokenRequest(Platform._tokenEndpoint, body),\n json = apiResponse.json();\n\n this._auth\n .setData(json)\n .setRemember(options.remember);\n\n this.emit(this.events.loginSuccess, apiResponse);\n\n return apiResponse;\n\n } catch (e) {\n\n this._cache.clean();\n\n this.emit(this.events.loginError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n async refresh() {\n\n try {\n\n this.emit(this.events.beforeRefresh);\n\n if (this._queue.isPaused()) {\n\n await this._queue.poll();\n\n if (!this._isAccessTokenValid()) {\n throw new Error('Automatic authentification timeout');\n }\n\n this.emit(this.events.refreshSuccess, null);\n\n return null;\n\n }\n\n this._queue.pause();\n\n // Make sure all existing AJAX calls had a chance to reach the server\n await delay(Platform._refreshDelayMs);\n\n // Perform sanity checks\n if (!this._auth.refreshToken()) throw new Error('Refresh token is missing');\n if (!this._auth.refreshTokenValid()) throw new Error('Refresh token has expired');\n if (!this._queue.isPaused()) throw new Error('Queue was resumed before refresh call');\n\n /** @type {ApiResponse} */\n var res = await this._tokenRequest(Platform._tokenEndpoint, {\n \"grant_type\": \"refresh_token\",\n \"refresh_token\": this._auth.refreshToken(),\n \"access_token_ttl\": Platform._accessTokenTtl,\n \"refresh_token_ttl\": this._auth.remember() ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl\n }),\n json = res.json();\n\n if (!json.access_token) {\n throw this._client.makeError(new Error('Malformed OAuth response'), res);\n }\n\n this._auth.setData(json);\n this._queue.resume();\n\n this.emit(this.events.refreshSuccess, res);\n\n return res;\n\n } catch (e) {\n\n e = this._client.makeError(e);\n\n if (Platform._clearCacheOnRefreshError) {\n this._cache.clean();\n }\n\n this.emit(this.events.refreshError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n async logout() {\n\n try {\n\n this.emit(this.events.beforeLogout);\n\n this._queue.pause();\n\n var res = await this._tokenRequest(Platform._revokeEndpoint, {\n token: this._auth.accessToken()\n });\n\n this._queue.resume();\n this._cache.clean();\n\n this.emit(this.events.logoutSuccess, res);\n\n return res;\n\n } catch (e) {\n\n this._queue.resume();\n\n this.emit(this.events.logoutError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @param {Request} request\n * @param {object} [options]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async inflateRequest(request, options) {\n\n options = options || {};\n\n if (options.skipAuthCheck) return request;\n\n await this._ensureAuthentication();\n\n request.headers.set('Authorization', this._authHeader());\n //request.url = this.createUrl(request.url, {addServer: true}); //FIXME Spec prevents this...\n\n //TODO Add User-Agent here\n\n return request;\n\n }\n\n /**\n * @param {Request} request\n * @param {object} [options]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async sendRequest(request, options) {\n\n try {\n\n request = await this.inflateRequest(request, options);\n\n return (await this._client.sendRequest(request));\n\n } catch (e) {\n\n // Guard is for errors that come from polling\n if (!e.apiResponse || !e.apiResponse.response() || (e.apiResponse.response().status != 401)) throw e;\n\n this._auth.cancelAccessToken();\n\n return (await this.sendRequest(request, options));\n\n }\n\n }\n\n /**\n * General purpose function to send anything to server\n * @param {string} options.url\n * @param {object} [options.body]\n * @param {string} [options.method]\n * @param {object} [options.query]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async send(options = {}) {\n\n //FIXME https://github.com/bitinn/node-fetch/issues/43\n options.url = this.createUrl(options.url, {addServer: true});\n\n return await this.sendRequest(this._client.createRequest(options), options);\n\n }\n\n /**\n * @param {string} url\n * @param {object} [query]\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async get(url, query, options) {\n options = options || {};\n options.method = 'GET';\n options.url = url;\n options.query = query;\n return await this.send(options);\n }\n\n /**\n * @param {string} url\n * @param {object} body\n * @param {object} [query]\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async post(url, body, query, options) {\n options = options || {};\n options.method = 'POST';\n options.url = url;\n options.query = query;\n options.body = body;\n return await this.send(options);\n }\n\n /**\n * @param {string} url\n * @param {object} [body]\n * @param {object} [query]\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async put(url, body, query, options) {\n options = options || {};\n options.method = 'PUT';\n options.url = url;\n options.query = query;\n options.body = body;\n return await this.send(options);\n }\n\n /**\n * @param {string} url\n * @param {string} [query]\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async 'delete'(url, query, options) {\n options = options || {};\n options.method = 'DELETE';\n options.url = url;\n options.query = query;\n return await this.send(options);\n }\n\n async _tokenRequest(path, body) {\n\n return await this.send({\n url: path,\n skipAuthCheck: true,\n body: body,\n method: 'POST',\n headers: {\n 'Authorization': 'Basic ' + this._apiKey(),\n 'Content-Type': 'application/x-www-form-urlencoded'\n }\n });\n\n }\n\n async _ensureAuthentication() {\n\n if (this._isAccessTokenValid()) return null;\n return await this.refresh();\n\n }\n\n _isAccessTokenValid() {\n\n return (this._auth.accessTokenValid() && !this._queue.isPaused());\n\n }\n\n _apiKey() {\n var apiKey = this._appKey + ':' + this._appSecret;\n return (typeof btoa == 'function') ? btoa(apiKey) : new Buffer(apiKey).toString('base64');\n }\n\n _authHeader() {\n var token = this._auth.accessToken();\n return this._auth.tokenType() + (token ? ' ' + token : '');\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/platform/Platform.js\n **/","export default class Auth {\n\n static refreshHandicapMs:number = 60 * 1000; // 1 minute\n static forcedTokenType = 'forced';\n\n constructor(cache, cacheId:string) {\n\n /** @type {Cache} */\n this._cache = cache;\n this._cacheId = cacheId;\n\n }\n\n accessToken() {\n return this.data().access_token;\n }\n\n refreshToken() {\n return this.data().refresh_token;\n }\n\n tokenType() {\n return this.data().token_type;\n }\n\n /**\n * @return {{token_type: string, access_token: string, expires_in: number, refresh_token: string, refresh_token_expires_in: number}}\n */\n data() {\n\n return this._cache.getItem(this._cacheId) || {\n token_type: '',\n access_token: '',\n expires_in: 0,\n refresh_token: '',\n refresh_token_expires_in: 0\n };\n\n }\n\n /**\n * @param {object} newData\n * @return {Auth}\n */\n setData(newData) {\n\n newData = newData || {};\n\n var data = this.data();\n\n Object.keys(newData).forEach((key) => {\n data[key] = newData[key];\n });\n\n data.expire_time = Date.now() + (data.expires_in * 1000);\n data.refresh_token_expire_time = Date.now() + (data.refresh_token_expires_in * 1000);\n\n this._cache.setItem(this._cacheId, data);\n\n return this;\n\n }\n\n /**\n * Check if there is a valid (not expired) access token\n * @return {boolean}\n */\n accessTokenValid() {\n\n var authData = this.data();\n return (authData.token_type === Auth.forcedTokenType || (authData.expire_time - Auth.refreshHandicapMs > Date.now()));\n\n }\n\n /**\n * Check if there is a valid (not expired) access token\n * @return {boolean}\n */\n refreshTokenValid() {\n\n return (this.data().refresh_token_expire_time > Date.now());\n\n }\n\n /**\n * @return {Auth}\n */\n cancelAccessToken() {\n\n return this.setData({\n access_token: '',\n expires_in: 0\n });\n\n }\n\n /**\n * This method sets a special authentication mode used in Service Web\n * @return {Auth}\n */\n forceAuthentication() {\n\n this.setData({\n token_type: Auth.forcedTokenType,\n access_token: '',\n expires_in: 0,\n refresh_token: '',\n refresh_token_expires_in: 0\n });\n\n return this;\n\n }\n\n /**\n * @param remember\n * @return {Auth}\n */\n setRemember(remember) {\n\n return this.setData({remember: remember});\n\n }\n\n /**\n * @return {boolean}\n */\n remember() {\n\n return !!this.data().remember;\n\n }\n\n}\n\n//export interface IAuthData {\n// remember?:boolean;\n// token_type?:string;\n// access_token?:string;\n// expires_in?:number; // actually it's string\n// expire_time?:number;\n// refresh_token?:string;\n// refresh_token_expires_in?:number; // actually it's string\n// refresh_token_expire_time?:number;\n// scope?:string;\n//}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/platform/Auth.js\n **/","import PubnubMock from './PubnubMock.js';\nimport {PUBNUB} from '../core/Externals';\n\nexport default class PubnubMockFactory {\n\n constructor() {\n this.crypto_obj = PUBNUB.crypto_obj;\n }\n\n init(options:PUBNUBInitOptions) {\n return new PubnubMock(options);\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/pubnub/PubnubFactory.js\n **/","import Observable from '../core/Observable';\nimport {PUBNUB} from '../core/Externals';\n\nexport default class PubnubMock extends Observable {\n\n constructor(options) {\n super();\n this.options = options;\n this.crypto_obj = PUBNUB.crypto_obj;\n }\n\n ready() {}\n\n subscribe(options:PUBNUBSubscribeOptions) {\n this.on('message-' + options.channel, options.message);\n }\n\n unsubscribe(options:PUBNUBUnsubscribeOptions) {\n this.off('message-' + options.channel);\n }\n\n receiveMessage(msg, channel) {\n this.emit('message-' + channel, msg, 'env', channel);\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/pubnub/PubnubMock.js\n **/","import Observable from '../core/Observable';\nimport Client from '../http/Client';\nimport {poll, stopPolling, delay} from '../core/Utils';\n\nexport default class Subscription extends Observable {\n\n static _renewHandicapMs = 2 * 60 * 1000;\n static _pollInterval = 10 * 1000;\n\n events = {\n notification: 'notification',\n removeSuccess: 'removeSuccess',\n removeError: 'removeError',\n renewSuccess: 'renewSuccess',\n renewError: 'renewError',\n subscribeSuccess: 'subscribeSuccess',\n subscribeError: 'subscribeError'\n };\n\n constructor(pubnubFactory, platform) {\n\n super();\n\n this._pubnubFactory = pubnubFactory;\n this._platform = platform;\n this._pubnub = null;\n this._timeout = null;\n this._subscription = {};\n\n }\n\n subscribed(){\n\n return !!(this._subscription.id &&\n this._subscription.deliveryMode &&\n this._subscription.deliveryMode.subscriberKey &&\n this._subscription.deliveryMode.address);\n\n }\n\n /**\n * @return {boolean}\n */\n alive() {\n\n return this.subscribed() && Date.now() < this.expirationTime();\n\n }\n\n expirationTime() {\n return new Date(this._subscription.expirationTime || 0).getTime() - Subscription._renewHandicapMs;\n }\n\n setSubscription(subscription) {\n\n subscription = subscription || {};\n\n this._clearTimeout();\n\n this._subscription = subscription;\n\n if (!this._pubnub) this._subscribeAtPubnub();\n\n this._setTimeout();\n\n return this;\n\n }\n\n subscription() {\n return this._subscription;\n }\n\n /**\n * Creates or updates subscription if there is an active one\n * @returns {Promise}\n */\n async register() {\n\n if (this.alive()) {\n return await this.renew();\n } else {\n return await this.subscribe();\n }\n\n }\n\n eventFilters() {\n return this._subscription.eventFilters || [];\n }\n\n /**\n * @param {string[]} events\n * @return {Subscription}\n */\n addEventFilters(events) {\n this.setEventFilters(this.eventFilters().concat(events));\n return this;\n }\n\n /**\n * @param {string[]} events\n * @return {Subscription}\n */\n setEventFilters(events) {\n this._subscription.eventFilters = events;\n return this;\n }\n\n /**\n * @returns {Promise}\n */\n async subscribe() {\n\n try {\n\n this._clearTimeout();\n\n if (!this.eventFilters().length) throw new Error('Events are undefined');\n\n var response = await this._platform.post('/restapi/v1.0/subscription', {\n eventFilters: this._getFullEventFilters(),\n deliveryMode: {\n transportType: 'PubNub'\n }\n }),\n json = response.json();\n\n this.setSubscription(json)\n .emit(this.events.subscribeSuccess, response);\n\n return response;\n\n\n } catch (e) {\n\n e = this._platform.client().makeError(e);\n\n this.reset()\n .emit(this.events.subscribeError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n async renew() {\n\n try {\n\n this._clearTimeout();\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n if (!this.eventFilters().length) throw new Error('Events are undefined');\n\n var response = await this._platform.put('/restapi/v1.0/subscription/' + this._subscription.id, {\n eventFilters: this._getFullEventFilters()\n });\n\n var json = response.json();\n\n this.setSubscription(json)\n .emit(this.events.renewSuccess, response);\n\n return response;\n\n } catch (e) {\n\n e = this._platform.client().makeError(e);\n\n this.reset()\n .emit(this.events.renewError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n async remove() {\n\n try {\n\n if (!this.subscribed()) throw new Error('No subscription');\n\n var response = await this._platform.delete('/restapi/v1.0/subscription/' + this._subscription.id);\n\n this.reset()\n .emit(this.events.removeSuccess, response);\n\n return response;\n\n } catch (e) {\n\n e = this._platform.client().makeError(e);\n\n this.emit(this.events.removeError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n resubscribe() {\n\n return this.reset().setEventFilters(this.eventFilters()).subscribe();\n\n }\n\n /**\n * Remove subscription and disconnect from PUBNUB\n * This method resets subscription at client side but backend is not notified\n */\n reset() {\n this._clearTimeout();\n if (this.subscribed() && this._pubnub) this._pubnub.unsubscribe({channel: this._subscription.deliveryMode.address});\n this._subscription = {};\n return this;\n }\n\n _getFullEventFilters() {\n\n return this.eventFilters().map((event) => {\n return this._platform.createUrl(event);\n });\n\n }\n\n _setTimeout() {\n\n this._clearTimeout();\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n poll((next)=> {\n\n if (this.alive()) return next();\n\n this.renew();\n\n }, Subscription._pollInterval, this._timeout);\n\n return this;\n\n }\n\n _clearTimeout() {\n\n stopPolling(this._timeout);\n\n return this;\n\n }\n\n _decrypt(message:any) {\n\n if (!this.subscribed()) throw new Error('No subscription');\n\n if (this._subscription.deliveryMode.encryptionKey) {\n\n var PUBNUB = this._pubnubFactory;\n\n message = PUBNUB.crypto_obj.decrypt(message, this._subscription.deliveryMode.encryptionKey, {\n encryptKey: false,\n keyEncoding: 'base64',\n keyLength: 128,\n mode: 'ecb'\n });\n\n }\n\n return message;\n\n }\n\n _notify(message:any) {\n\n this.emit(this.events.notification, this._decrypt(message));\n\n return this;\n\n }\n\n _subscribeAtPubnub():Subscription {\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n var PUBNUB = this._pubnubFactory;\n\n this._pubnub = PUBNUB.init({\n ssl: true,\n subscribe_key: this._subscription.deliveryMode.subscriberKey\n });\n\n this._pubnub.ready();\n\n this._pubnub.subscribe({\n channel: this._subscription.deliveryMode.address,\n message: this._notify.bind(this),\n connect: () => {}\n });\n\n return this;\n\n }\n\n}\n\n//export interface ISubscription {\n// id?:string;\n// uri?: string;\n// eventFilters?:string[];\n// expirationTime?:string; // 2014-03-12T19:54:35.613Z\n// expiresIn?:number;\n// deliveryMode?: {\n// transportType?:string;\n// encryption?:boolean;\n// address?:string;\n// subscriberKey?:string;\n// encryptionKey?:string;\n// secretKey?:string;\n// };\n// creationTime?:string; // 2014-03-12T19:54:35.613Z\n// status?:string; // Active\n//}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/subscription/Subscription.js\n **/","import Subscription from './Subscription';\nimport Queue from '../core/Queue';\n\nexport default class CachedSubscription extends Subscription {\n\n constructor(pubnubFactory, platform, cache, cacheKey) {\n\n super(pubnubFactory, platform);\n\n this._cache = cache;\n this._cacheKey = cacheKey;\n this._renewQueue = new Queue(this._cache, cacheKey + '-renew');\n this._resubscribeQueue = new Queue(this._cache, cacheKey + '-resubscribe');\n\n this.events = {\n ...this.events,\n queuedRenewSuccess: 'queuedRenewSuccess',\n queuedRenewError: 'queuedRenewError',\n queuedResubscribeSuccess: 'queuedResubscribeSuccess',\n queuedResubscribeError: 'queuedResubscribeError'\n };\n\n this.on(this.events.renewError, () => {\n this.resubscribe();\n });\n\n this.on([this.events.subscribeSuccess, this.events.renewSuccess], () => {\n this._cache.setItem(this._cacheKey, this.subscription());\n });\n\n this.on(this.events.removeSuccess, () => {\n this._cache.removeItem(this._cacheKey);\n });\n\n }\n\n /**\n * TODO Combine with Platform.refresh and move elsewhere\n * @param actionCb\n * @param queue\n * @param successEvent\n * @param errorEvent\n * @param errorMessage\n * @return {*}\n * @private\n */\n async _queue(actionCb, queue, successEvent, errorEvent, errorMessage) {\n\n try {\n\n if (queue.isPaused()) {\n\n await queue.poll();\n\n if (!this.alive()) {\n throw new Error(errorMessage);\n }\n\n this.emit(successEvent, null);\n\n return null;\n\n }\n\n queue.pause();\n\n var res = await actionCb.call(this);\n\n queue.resume();\n\n this.emit(successEvent, res);\n\n return res;\n\n } catch (e) {\n\n this.emit(errorEvent, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n renew() {\n\n return this._queue(\n super.renew,\n this._renewQueue,\n this.events.queuedRenewSuccess,\n this.events.queuedRenewError,\n 'Subscription is not alive after renew timeout'\n );\n\n }\n\n /**\n * @returns {Promise}\n */\n resubscribe() {\n\n return this._queue(\n super.resubscribe,\n this._resubscribeQueue,\n this.events.queuedResubscribeSuccess,\n this.events.queuedResubscribeError,\n 'Subscription is not alive after resubscribe timeout'\n );\n\n }\n\n /**\n * @param {string[]} events\n * @return {CachedSubscription}\n */\n restore(events) {\n\n var cachedSubscriptionData = this._cache.getItem(this._cacheKey);\n\n if (cachedSubscriptionData) {\n try {\n this.setSubscription(cachedSubscriptionData);\n } catch (e) {}\n } else {\n this.setEventFilters(events);\n }\n\n return this;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/subscription/CachedSubscription.js\n **/","/**\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 // This invoke function is written in a style that assumes some\n // calling function (or Promise) will handle exceptions.\n function invoke(method, arg) {\n var result = generator[method](arg);\n var value = result.value;\n return value instanceof AwaitArgument\n ? Promise.resolve(value.arg).then(invokeNext, invokeThrow)\n : 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 return result;\n });\n }\n\n if (typeof process === \"object\" && process.domain) {\n invoke = process.domain.bind(invoke);\n }\n\n var invokeNext = invoke.bind(generator, \"next\");\n var invokeThrow = invoke.bind(generator, \"throw\");\n var invokeReturn = invoke.bind(generator, \"return\");\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return invoke(method, arg);\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 ) : new Promise(function (resolve) {\n resolve(callInvokeWithMethodAndArg());\n });\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\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/regenerator/runtime.js\n ** module id = 26\n ** module chunks = 0\n **/"],"sourceRoot":""} \ No newline at end of file diff --git a/build/ringcentral-bundle.min.js b/build/ringcentral-bundle.min.js index ad4d5c87..bb6a59a7 100644 --- a/build/ringcentral-bundle.min.js +++ b/build/ringcentral-bundle.min.js @@ -1,5 +1,5 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.SDK=t():(e.RingCentral=e.RingCentral||{},e.RingCentral.SDK=t())}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return e[r].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var n={};return t.m=e,t.c=n,t.p="/build/",t(0)}([function(e,t,n){e.exports=n(1)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function o(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t["default"]=e,t}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var s=function(){function e(e,t){for(var n=0;ne;e+=2){var t=re[e],n=re[e+1];t(n),re[e]=void 0,re[e+1]=void 0}Y=0}function b(){try{var e=n(!function(){var e=new Error('Cannot find module "vertx"');throw e.code="MODULE_NOT_FOUND",e}());return G=e.runOnLoop||e.runOnContext,p()}catch(t){return y()}}function v(){}function m(){return new TypeError("You cannot resolve a promise with itself")}function g(){return new TypeError("A promises callback cannot return that same promise.")}function w(e){try{return e.then}catch(t){return ae.error=t,ae}}function k(e,t,n,r){try{e.call(t,n,r)}catch(o){return o}}function E(e,t,n){Q(function(e){var r=!1,o=k(n,t,function(n){r||(r=!0,t!==n?T(e,n):C(e,n))},function(t){r||(r=!0,R(e,t))},"Settle: "+(e._label||" unknown promise"));!r&&o&&(r=!0,R(e,o))},e)}function x(e,t){t._state===ie?C(e,t._result):t._state===se?R(e,t._result):P(t,void 0,function(t){T(e,t)},function(t){R(e,t)})}function S(e,t){if(t.constructor===e.constructor)x(e,t);else{var n=w(t);n===ae?R(e,ae.error):void 0===n?C(e,t):a(n)?E(e,t,n):C(e,t)}}function T(e,t){e===t?R(e,m()):s(t)?S(e,t):C(e,t)}function O(e){e._onerror&&e._onerror(e._result),M(e)}function C(e,t){e._state===oe&&(e._result=t,e._state=ie,0!==e._subscribers.length&&Q(M,e))}function R(e,t){e._state===oe&&(e._state=se,e._result=t,Q(O,e))}function P(e,t,n,r){var o=e._subscribers,i=o.length;e._onerror=null,o[i]=t,o[i+ie]=n,o[i+se]=r,0===i&&e._state&&Q(M,e)}function M(e){var t=e._subscribers,n=e._state;if(0!==t.length){for(var r,o,i=e._result,s=0;ss;s++)P(r.resolve(e[s]),void 0,t,n);return o}function L(e){var t=this;if(e&&"object"==typeof e&&e.constructor===t)return e;var n=new t(v);return T(n,e),n}function U(e){var t=this,n=new t(v);return R(n,e),n}function H(){throw new TypeError("You must pass a resolver function as the first argument to the promise constructor")}function q(){throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.")}function J(e){this._id=de++,this._state=void 0,this._result=void 0,this._subscribers=[],v!==e&&(a(e)||H(),this instanceof J||q(),N(this,e))}function K(){var e;if("undefined"!=typeof o)e=o;else if("undefined"!=typeof self)e=self;else try{e=Function("return this")()}catch(t){throw new Error("polyfill failed because global object is unavailable in this environment")}var n=e.Promise;(!n||"[object Promise]"!==Object.prototype.toString.call(n.resolve())||n.cast)&&(e.Promise=ye)}var z;z=Array.isArray?Array.isArray:function(e){return"[object Array]"===Object.prototype.toString.call(e)};var G,V,W,X=z,Y=0,Q=({}.toString,c),$="undefined"!=typeof window?window:void 0,Z=$||{},ee=Z.MutationObserver||Z.WebKitMutationObserver,te="undefined"!=typeof process&&"[object process]"==={}.toString.call(process),ne="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel,re=new Array(1e3);W=te?f():ee?h():ne?d():void 0===$?b():y();var oe=void 0,ie=1,se=2,ae=new A,ue=new A;D.prototype._validateInput=function(e){return X(e)},D.prototype._validationError=function(){return new Error("Array Methods must be provided an Array")},D.prototype._init=function(){this._result=new Array(this.length)};var ce=D;D.prototype._enumerate=function(){for(var e=this,t=e.length,n=e.promise,r=e._input,o=0;n._state===oe&&t>o;o++)e._eachEntry(r[o],o)},D.prototype._eachEntry=function(e,t){var n=this,r=n._instanceConstructor;u(e)?e.constructor===r&&e._state!==oe?(e._onerror=null,n._settledAt(e._state,t,e._result)):n._willSettleAt(r.resolve(e),t):(n._remaining--,n._result[t]=e)},D.prototype._settledAt=function(e,t,n){var r=this,o=r.promise;o._state===oe&&(r._remaining--,e===se?R(o,n):r._result[t]=n),0===r._remaining&&C(o,r._result)},D.prototype._willSettleAt=function(e,t){var n=this;P(e,void 0,function(e){n._settledAt(ie,t,e)},function(e){n._settledAt(se,t,e)})};var le=F,fe=I,pe=L,he=U,de=0,ye=J;J.all=le,J.race=fe,J.resolve=pe,J.reject=he,J._setScheduler=l,J._asap=Q,J.prototype={constructor:J,then:function(e,t){var n=this,r=n._state;if(r===ie&&!e||r===se&&!t)return this;var o=new this.constructor(v),i=n._result;if(r){var s=arguments[r-1];Q(function(){B(r,o,s,i)})}else P(n,o,e,t);return o},"catch":function(e){return this.then(null,e)}};var _e=K,be={Promise:ye,polyfill:_e};n(8).amd?(r=function(){return be}.call(t,n,t,i),!(void 0!==r&&(i.exports=r))):"undefined"!=typeof i&&i.exports?i.exports=be:"undefined"!=typeof this&&(this.ES6Promise=be),_e()}).call(this)}).call(t,n(5).setImmediate,function(){return this}(),n(7)(e))},function(e,t,n){(function(e,r){function o(e,t){this._id=e,this._clearFn=t}var i=n(6).nextTick,s=Function.prototype.apply,a=Array.prototype.slice,u={},c=0;t.setTimeout=function(){return new o(s.call(setTimeout,window,arguments),clearTimeout)},t.setInterval=function(){return new o(s.call(setInterval,window,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e.close()},o.prototype.unref=o.prototype.ref=function(){},o.prototype.close=function(){this._clearFn.call(window,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout(function(){e._onTimeout&&e._onTimeout()},t))},t.setImmediate="function"==typeof e?e:function(e){var n=c++,r=arguments.length<2?!1:a.call(arguments,1);return u[n]=!0,i(function(){u[n]&&(r?e.apply(null,r):e.call(null),t.clearImmediate(n))}),n},t.clearImmediate="function"==typeof r?r:function(e){delete u[e]}}).call(t,n(5).setImmediate,n(5).clearImmediate)},function(e,t){function n(){c=!1,s.length?u=s.concat(u):l=-1,u.length&&r()}function r(){if(!c){var e=setTimeout(n);c=!0;for(var t=u.length;t;){for(s=u,u=[];++l1)for(var n=1;n-1?t:e}function c(e,t){t=t||{};var r=t.body;if(c.prototype.isPrototypeOf(e)){if(e.bodyUsed)throw new TypeError("Already read");this.url=e.url,this.credentials=e.credentials,t.headers||(this.headers=new n(e.headers)),this.method=e.method,this.mode=e.mode,r||(r=e._bodyInit,e.bodyUsed=!0)}else this.url=e;if(this.credentials=t.credentials||this.credentials||"omit",(t.headers||!this.headers)&&(this.headers=new n(t.headers)),this.method=u(t.method||this.method||"GET"),this.mode=t.mode||this.mode||null,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&r)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(r)}function l(e){var t=new FormData;return e.trim().split("&").forEach(function(e){if(e){var n=e.split("="),r=n.shift().replace(/\+/g," "),o=n.join("=").replace(/\+/g," ");t.append(decodeURIComponent(r),decodeURIComponent(o))}}),t}function f(e){var t=new n,r=e.getAllResponseHeaders().trim().split("\n");return r.forEach(function(e){var n=e.trim().split(":"),r=n.shift().trim(),o=n.join(":").trim();t.append(r,o)}),t}function p(e,t){t||(t={}),this._initBody(e),this.type="default",this.url=null,this.status=t.status,this.ok=this.status>=200&&this.status<300,this.statusText=t.statusText,this.headers=t.headers instanceof n?t.headers:new n(t.headers),this.url=t.url||""}if(!self.fetch){n.prototype.append=function(n,r){n=e(n),r=t(r);var o=this.map[n];o||(o=[],this.map[n]=o),o.push(r)},n.prototype["delete"]=function(t){delete this.map[e(t)]},n.prototype.get=function(t){var n=this.map[e(t)];return n?n[0]:null},n.prototype.getAll=function(t){return this.map[e(t)]||[]},n.prototype.has=function(t){return this.map.hasOwnProperty(e(t))},n.prototype.set=function(n,r){this.map[e(n)]=[t(r)]},n.prototype.forEach=function(e,t){Object.getOwnPropertyNames(this.map).forEach(function(n){this.map[n].forEach(function(r){e.call(t,r,n,this)},this)},this)};var h={blob:"FileReader"in self&&"Blob"in self&&function(){try{return new Blob,!0}catch(e){return!1}}(),formData:"FormData"in self},d=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];a.call(c.prototype),a.call(p.prototype),self.Headers=n,self.Request=c,self.Response=p,self.fetch=function(e,t){var n;return n=c.prototype.isPrototypeOf(e)&&!t?e:new c(e,t),new Promise(function(e,t){function r(){return"responseURL"in o?o.responseURL:/^X-Request-URL:/m.test(o.getAllResponseHeaders())?o.getResponseHeader("X-Request-URL"):void 0}var o=new XMLHttpRequest;o.onload=function(){var n=1223===o.status?204:o.status;if(100>n||n>599)return void t(new TypeError("Network request failed"));var i={status:n,statusText:o.statusText,headers:f(o),url:r()},s="response"in o?o.response:o.responseText;e(new p(s,i))},o.onerror=function(){t(new TypeError("Network request failed"))},o.open(n.method,n.url,!0),"include"===n.credentials&&(o.withCredentials=!0),"responseType"in o&&h.blob&&(o.responseType="blob"),n.headers.forEach(function(e,t){o.setRequestHeader(t,e)}),o.send("undefined"==typeof n._bodyInit?null:n._bodyInit)})},self.fetch.polyfill=!0}}()},function(module,exports,__webpack_require__){(function(module){function unique(){return"x"+ ++NOW+ +new Date}function rnow(){return+new Date}function build_url(e,t){var n=e.join(URLBIT),r=[];return t?(each(t,function(e,t){var n="object"==typeof t?JSON.stringify(t):t;"undefined"!=typeof t&&null!=t&&encode(n).length>0&&r.push(e+"="+encode(n))}),n+="?"+r.join(PARAMSBIT)):n}function updater(e,t){var n,r=0,o=function(){r+t>rnow()?(clearTimeout(n),n=setTimeout(o,t)):(r=rnow(),e())};return o}function grep(e,t){var n=[];return each(e||[],function(e){t(e)&&n.push(e)}),n}function supplant(e,t){return e.replace(REPL,function(e,n){return t[n]||e})}function timeout(e,t){return setTimeout(e,t)}function generate_uuid(e){var t="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){var t=16*Math.random()|0,n="x"==e?t:3&t|8;return n.toString(16)});return e&&e(t),t}function isArray(e){return!!e&&"string"!=typeof e&&(Array.isArray&&Array.isArray(e)||"number"==typeof e.length)}function each(e,t){if(e&&t)if(isArray(e))for(var n=0,r=e.length;r>n;)t.call(e[n],e[n],n++);else for(var n in e)e.hasOwnProperty&&e.hasOwnProperty(n)&&t.call(e[n],n,e[n])}function map(e,t){var n=[];return each(e||[],function(e,r){n.push(t(e,r))}),n}function pam_encode(e){return encodeURIComponent(e).replace(/[!'()*~]/g,function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})}function encode(e){return encodeURIComponent(e)}function generate_channel_list(e,t){var n=[];return each(e,function(e,r){t?e.search("-pnpres")<0&&r.subscribed&&n.push(e):r.subscribed&&n.push(e)}),n.sort()}function generate_channel_group_list(e,t){var n=[];return each(e,function(e,r){t?e.search("-pnpres")<0&&r.subscribed&&n.push(e):r.subscribed&&n.push(e)}),n.sort()}function ready(){timeout(function(){READY||(READY=1,each(READY_BUFFER,function(e){e()}))},SECOND)}function PNmessage(e){return msg=e||{apns:{}},msg.getPubnubMessage=function(){var e={};if(Object.keys(msg.apns).length){e.pn_apns={aps:{alert:msg.apns.alert,badge:msg.apns.badge}};for(var t in msg.apns)e.pn_apns[t]=msg.apns[t];var n=["badge","alert"];for(var t in n)delete e.pn_apns[n[t]]}msg.gcm&&(e.pn_gcm={data:msg.gcm});for(var t in msg)e[t]=msg[t];var r=["apns","gcm","publish","channel","callback","error"];for(var t in r)delete e[r[t]];return e},msg.publish=function(){var e=msg.getPubnubMessage();msg.pubnub&&msg.channel&&msg.pubnub.publish({message:e,channel:msg.channel,callback:msg.callback,error:msg.error})},msg}function PN_API(e){function t(e){return e||(e={}),each(ie,function(t,n){t in e||(e[t]=n)}),e}function r(e){var t=[];return each(e,function(e,n){t.push(e)}),t}function o(e){return r(e).sort()}function i(e){var t="",n=o(e);for(var r in n){var i=n[r];t+=i+"="+pam_encode(e[i]),r!=n.length-1&&(t+="&")}return t}function s(e,t,n){var r=!1;if("undefined"==typeof e)return t;if("number"==typeof e)r=e>PRESENCE_HB_THRESHOLD||0==e?!1:!0;else{if("boolean"==typeof e)return e?PRESENCE_HB_DEFAULT:0;r=!0}return r?(n&&n("Presence Heartbeat value invalid. Valid range ( x > "+PRESENCE_HB_THRESHOLD+" or x = 0). Current Value : "+(t||PRESENCE_HB_THRESHOLD)),t||PRESENCE_HB_THRESHOLD):e}function a(e,t){return be.encrypt(e,t||le)||e}function u(e,t){return be.decrypt(e,t||le)||be.decrypt(e,le)||e}function c(){return clearTimeout($),!ee||ee>=500||1>ee||!generate_channel_list(X,!0).length&&!generate_channel_group_list(Y,!0).length?void(te=!1):(te=!0,void ve.presence_heartbeat({callback:function(e){$=timeout(c,ee*SECOND)},error:function(e){se&&se("Presence Heartbeat unable to reach Pubnub servers."+JSON.stringify(e)),$=timeout(c,ee*SECOND)}}))}function l(){!te&&c()}function f(e){if(ne){if(!U.length)return}else{if(e&&(U.sending=0),U.sending||!U.length)return;U.sending=1}oe(U.shift())}function p(e){var t=0;return each(generate_channel_group_list(Y),function(n){var r=Y[n];r&&(t++,(e||function(){})(r))}),t}function h(e){var t=0;return each(generate_channel_list(X),function(n){var r=X[n];r&&(t++,(e||function(){})(r))}),t}function d(e,t,n){if("object"==typeof e){if(e.error){var r={};return e.message&&(r.message=e.message),e.payload&&(r.payload=e.payload),void(n&&n(r))}if(e.payload)return void(e.next_page?t&&t(e.payload,e.next_page):t&&t(e.payload))}t&&t(e)}function y(e,t){if("object"==typeof e&&e.error){var n={};return e.message&&(n.message=e.message),e.payload&&(n.payload=e.payload),void(t&&t(n))}t&&t(e)}function _(e,n,r,o){var n=e.callback||n,i=e.error||se,s=ue();o=o||{},o.auth||(o.auth=e.auth_key||A);var a=[F,"v1","channel-registration","sub-key",M];a.push.apply(a,r),s&&(o.callback=s),oe({callback:s,data:t(o),success:function(e){d(e,n,i)},fail:function(e){y(e,i)},url:a})}function b(){ae()||m(1,{error:"Offline. Please check your network settings. "}),E&&clearTimeout(E),E=timeout(b,SECOND)}function v(){C&&ve.time(function(e){w(function(){},e),e||m(1,{error:"Heartbeat failed to connect to Pubnub Servers.Please check your network settings."}),x&&clearTimeout(x),x=timeout(v,O)})}function m(e,t){z&&z(e,t),z=null,clearTimeout(E),clearTimeout(x)}function g(e){var t=rnow()-q;return t-e/1e4}function w(e,t){function n(t){if(t){var n=t/1e4,o=(rnow()-r)/2;q=rnow()-(n+o),e&&e(q)}}var r=rnow();t&&n(t)||ve.time(n)}var E,x,S=+e.windowing||DEF_WINDOWING,T=(+e.timeout||DEF_SUB_TIMEOUT)*SECOND,O=(+e.keepalive||DEF_KEEPALIVE)*SECOND,C=e.timecheck||0,R=e.noleave||0,P=e.publish_key,M=e.subscribe_key,A=e.auth_key||"",j=e.secret_key||"",B=e.hmac_SHA256,N=e.ssl?"s":"",D="http"+N+"://"+(e.origin||"pubsub.pubnub.com"),F=nextorigin(D),I=nextorigin(D),L=function(){},U=[],H=!0,q=0,J=0,K=0,z=0,G=e.restore||0,V=0,W=!1,X={},Y={},Q={},$=null,Z=s(e.heartbeat||e.pnexpires||0,e.error),ee=e.heartbeat_interval||Z/2-1,te=!1,ne=e.no_wait_for_pending,re=e["compatible_3.5"]||!1,oe=e.xdr,ie=e.params||{},se=e.error||function(){},ae=e._is_online||function(){return 1},ue=e.jsonp_cb||function(){return 0},ce=e.db||{get:function(){},set:function(){}},le=e.cipher_key,fe=e.uuid||!e.unique_uuid&&ce&&ce.get(M+"uuid")||"",pe=e.instance_id||!1,he="",de=e.shutdown,ye="undefined"!=typeof e.use_send_beacon?e.use_send_beacon:!0,_e=ye?e.sendBeacon:null;2===Z&&(ee=1);var be=e.crypto_obj||{encrypt:function(e,t){return e},decrypt:function(e,t){return e}},ve={LEAVE:function(e,n,r,o,i){var s,a={uuid:fe,auth:r||A},u=nextorigin(D),o=o||function(){},c=i||function(){},l=ue();if(e.indexOf(PRESENCE_SUFFIX)>0)return!0;if(re){if(!N)return!1;if("0"==l)return!1}return R?!1:("0"!=l&&(a.callback=l),pe&&(a.instanceid=he),s=[u,"v2","presence","sub_key",M,"channel",encode(e),"leave"],ie=t(a),_e&&(url_string=build_url(s,ie),_e(url_string))?(o&&o({status:200,action:"leave",message:"OK",service:"Presence"}),!0):(oe({blocking:n||N,timeout:2e3,callback:l,data:ie,success:function(e){d(e,o,c)},fail:function(e){y(e,c)},url:s}),!0))},LEAVE_GROUP:function(e,n,r,o,i){var s={uuid:fe,auth:r||A},a=nextorigin(D),o=o||function(){},u=i||function(){},c=ue();if(e.indexOf(PRESENCE_SUFFIX)>0)return!0;if(re){if(!N)return!1;if("0"==c)return!1}return R?!1:("0"!=c&&(s.callback=c),e&&e.length>0&&(s["channel-group"]=e),pe&&(s.instanceid=he),oe({blocking:n||N,timeout:5e3,callback:c,data:t(s),success:function(e){d(e,o,u)},fail:function(e){y(e,u)},url:[a,"v2","presence","sub_key",M,"channel",encode(","),"leave"]}),!0)},set_resumed:function(e){W=e},get_cipher_key:function(){return le},set_cipher_key:function(e){le=e},raw_encrypt:function(e,t){return a(e,t)},raw_decrypt:function(e,t){return u(e,t)},get_heartbeat:function(){return Z},set_heartbeat:function(e,t){Z=s(e,Z,se),ee=t||Z/2-1,2==Z&&(ee=1),L(),c()},get_heartbeat_interval:function(){return ee},set_heartbeat_interval:function(e){ee=e,c()},get_version:function(){return SDK_VER},getGcmMessageObject:function(e){return{data:e}},getApnsMessageObject:function(e){var t={aps:{badge:1,alert:""}};for(k in e)k[t]=e[k];return t},newPnMessage:function(){var e={};gcm&&(e.pn_gcm=gcm),apns&&(e.pn_apns=apns);for(k in n)e[k]=n[k];return e},_add_param:function(e,t){ie[e]=t},channel_group:function(e,t){var n,r,o=e.channel_group,t=t||e.callback,i=e.channels||e.channel,s=e.cloak,a=[],u={},c=e.mode||"add";if(o){var l=o.split(":");l.length>1?(n="*"===l[0]?null:l[0],r=l[1]):r=l[0]}n&&a.push("namespace")&&a.push(encode(n)),a.push("channel-group"),r&&"*"!==r&&a.push(r),i?(isArray(i)&&(i=i.join(",")),u[c]=i,u.cloak=H?"true":"false"):"remove"===c&&a.push("remove"),"undefined"!=typeof s&&(u.cloak=s?"true":"false"),_(e,t,a,u)},channel_group_list_groups:function(e,t){var n;n=e.namespace||e.ns||e.channel_group||null,n&&(e.channel_group=n+":*"),ve.channel_group(e,t)},channel_group_list_channels:function(e,t){return e.channel_group?void ve.channel_group(e,t):se("Missing Channel Group")},channel_group_remove_channel:function(e,t){return e.channel_group?e.channel||e.channels?(e.mode="remove",void ve.channel_group(e,t)):se("Missing Channel"):se("Missing Channel Group")},channel_group_remove_group:function(e,t){return e.channel_group?e.channel?se("Use channel_group_remove_channel if you want to remove a channel from a group."):(e.mode="remove",void ve.channel_group(e,t)):se("Missing Channel Group")},channel_group_add_channel:function(e,t){return e.channel_group?e.channel||e.channels?void ve.channel_group(e,t):se("Missing Channel"):se("Missing Channel Group")},channel_group_cloak:function(e,t){return"undefined"==typeof e.cloak?void t(H):(H=e.cloak,void ve.channel_group(e,t))},channel_group_list_namespaces:function(e,t){var n=["namespace"];_(e,t,n)},channel_group_remove_namespace:function(e,t){var n=["namespace",e.namespace,"remove"];_(e,t,n)},history:function(e,n){var n=e.callback||n,r=e.count||e.limit||100,o=e.reverse||"false",i=e.error||function(){},s=e.auth_key||A,a=e.cipher_key,c=e.channel,l=e.channel_group,f=e.start,p=e.end,h=e.include_token,d=e.string_message_token||!1,_={},b=ue();return c||l?n?M?(_.stringtoken="true",_.count=r,_.reverse=o,_.auth=s,l&&(_["channel-group"]=l,c||(c=",")),b&&(_.callback=b),f&&(_.start=f),p&&(_.end=p),h&&(_.include_token="true"),d&&(_.string_message_token="true"),void oe({callback:b,data:t(_),success:function(e){if("object"==typeof e&&e.error)return void i({message:e.message,payload:e.payload});for(var t=e[0],r=[],o=0;o2&&(s.state=JSON.stringify(Q)),Z&&(s.heartbeat=Z),pe&&(s.instanceid=he),l(),z=oe({timeout:E,callback:e,fail:function(e){e&&e.error&&e.service?(y(e,d),r(1)):ve.time(function(t){!t&&y(e,d),r(t)})},data:t(s),url:[I,"subscribe",M,encode(n),e,V],success:function(e){if(!e||"object"==typeof e&&"error"in e&&e.error)return d(e.error),timeout(L,SECOND);if(_(e[1]),V=!V&&G&&ce.get(M)||e[1],h(function(e){e.connected||(e.connected=1,e.connect(e.name))}),p(function(e){e.connected||(e.connected=1,e.connect(e.name))}),W&&!G)return V=0,W=!1,ce.set(M,0),void timeout(o,x);w&&(V=1e4,w=0),ce.set(M,e[1]);var t=function(){var t="",n="";e.length>3?(t=e[3],n=e[2]):t=e.length>2?e[2]:map(generate_channel_list(X),function(t){return map(Array(e[0].length).join(",").split(","),function(){return t})}).join(",");var r=t.split(","),o=n?n.split(","):[];return function(){var e=r.shift()||K,t=o.shift(),n={};t?(e&&e.indexOf("-pnpres")>=0&&t.indexOf("-pnpres")<0&&(t+="-pnpres"),n=Y[t]||X[t]||{callback:function(){}}):n=X[e];var i=[n.callback||J,e.split(PRESENCE_SUFFIX)[0]];return t&&i.push(t.split(PRESENCE_SUFFIX)[0]),i}; -}(),n=g(+e[1]);each(e[0],function(r){var o=t(),i=u(r,X[o[1]]?X[o[1]].cipher_key:null);o[0]&&o[0](i,e,o[2]||o[1],n,o[1])}),timeout(o,x)}})}}var i=e.channel,s=e.channel_group,n=n||e.callback,n=n||e.message,a=e.connect||function(){},c=e.reconnect||function(){},f=e.disconnect||function(){},d=e.error||d||function(){},_=e.idle||function(){},b=e.presence||0,v=e.noheresync||0,w=e.backfill||0,k=e.timetoken||0,E=e.timeout||T,x=e.windowing||S,O=e.state,C=e.heartbeat||e.pnexpires,R=e.heartbeat_interval,P=e.restore||G;return A=e.auth_key||A,G=P,V=k,i||s?n?M?((C||0===C||R||0===R)&&ve.set_heartbeat(C,R),i&&each((i.join?i.join(","):""+i).split(","),function(r){var o=X[r]||{};X[K=r]={name:r,connected:o.connected,disconnected:o.disconnected,subscribed:1,callback:J=n,cipher_key:e.cipher_key,connect:a,disconnect:f,reconnect:c},O&&(r in O?Q[r]=O[r]:Q[r]=O),b&&(ve.subscribe({channel:r+PRESENCE_SUFFIX,callback:b,restore:P}),o.subscribed||v||ve.here_now({channel:r,data:t({uuid:fe,auth:A}),callback:function(e){each("uuids"in e?e.uuids:[],function(t){b({action:"join",uuid:t,timestamp:Math.floor(rnow()/1e3),occupancy:e.occupancy||1},e,r)})}}))}),s&&each((s.join?s.join(","):""+s).split(","),function(r){var o=Y[r]||{};Y[r]={name:r,connected:o.connected,disconnected:o.disconnected,subscribed:1,callback:J=n,cipher_key:e.cipher_key,connect:a,disconnect:f,reconnect:c},b&&(ve.subscribe({channel_group:r+PRESENCE_SUFFIX,callback:b,restore:P,auth_key:A}),o.subscribed||v||ve.here_now({channel_group:r,data:t({uuid:fe,auth:A}),callback:function(e){each("uuids"in e?e.uuids:[],function(t){b({action:"join",uuid:t,timestamp:Math.floor(rnow()/1e3),occupancy:e.occupancy||1},e,r)})}}))}),L=function(){m(),timeout(o,x)},READY?void L():READY_BUFFER.push(L)):se("Missing Subscribe Key"):se("Missing Callback"):se("Missing Channel")},here_now:function(e,n){var n=e.callback||n,r=e.error||function(){},o=e.auth_key||A,i=e.channel,s=e.channel_group,a=ue(),u="uuids"in e?e.uuids:!0,c=e.state,l={uuid:fe,auth:o};if(u||(l.disable_uuids=1),c&&(l.state=1),!n)return se("Missing Callback");if(!M)return se("Missing Subscribe Key");var f=[F,"v2","presence","sub_key",M];i&&f.push("channel")&&f.push(encode(i)),"0"!=a&&(l.callback=a),s&&(l["channel-group"]=s,!i&&f.push("channel")&&f.push(",")),pe&&(l.instanceid=he),oe({callback:a,data:t(l),success:function(e){d(e,n,r)},fail:function(e){y(e,r)},url:f})},where_now:function(e,n){var n=e.callback||n,r=e.error||function(){},o=e.auth_key||A,i=ue(),s=e.uuid||fe,a={auth:o};return n?M?("0"!=i&&(a.callback=i),pe&&(a.instanceid=he),void oe({callback:i,data:t(a),success:function(e){d(e,n,r)},fail:function(e){y(e,r)},url:[F,"v2","presence","sub_key",M,"uuid",encode(s)]})):se("Missing Subscribe Key"):se("Missing Callback")},state:function(e,n){var r,n=e.callback||n||function(e){},o=e.error||function(){},i=e.auth_key||A,s=ue(),a=e.state,u=e.uuid||fe,c=e.channel,l=e.channel_group,f=t({auth:i});return M?u?c||l?("0"!=s&&(f.callback=s),"undefined"!=typeof c&&X[c]&&X[c].subscribed&&a&&(Q[c]=a),"undefined"!=typeof l&&Y[l]&&Y[l].subscribed&&(a&&(Q[l]=a),f["channel-group"]=l,c||(c=",")),f.state=JSON.stringify(a),pe&&(f.instanceid=he),r=a?[F,"v2","presence","sub-key",M,"channel",c,"uuid",u,"data"]:[F,"v2","presence","sub-key",M,"channel",c,"uuid",encode(u)],void oe({callback:s,data:t(f),success:function(e){d(e,n,o)},fail:function(e){y(e,o)},url:r})):se("Missing Channel"):se("Missing UUID"):se("Missing Subscribe Key")},grant:function(e,n){var n=e.callback||n,r=e.error||function(){},o=e.channel||e.channels,s=e.channel_group,a=ue(),u=e.ttl,c=e.read?"1":"0",l=e.write?"1":"0",f=e.manage?"1":"0",p=e.auth_key||e.auth_keys;if(!n)return se("Missing Callback");if(!M)return se("Missing Subscribe Key");if(!P)return se("Missing Publish Key");if(!j)return se("Missing Secret Key");var h=Math.floor((new Date).getTime()/1e3),_=M+"\n"+P+"\ngrant\n",b={w:l,r:c,timestamp:h};e.manage&&(b.m=f),isArray(o)&&(o=o.join(",")),isArray(p)&&(p=p.join(",")),"undefined"!=typeof o&&null!=o&&o.length>0&&(b.channel=o),"undefined"!=typeof s&&null!=s&&s.length>0&&(b["channel-group"]=s),"0"!=a&&(b.callback=a),(u||0===u)&&(b.ttl=u),p&&(b.auth=p),b=t(b),p||delete b.auth,_+=i(b);var v=B(_,j);v=v.replace(/\+/g,"-"),v=v.replace(/\//g,"_"),b.signature=v,oe({callback:a,data:b,success:function(e){d(e,n,r)},fail:function(e){y(e,r)},url:[F,"v1","auth","grant","sub-key",M]})},mobile_gw_provision:function(e){var t,n,r=e.callback||function(){},o=e.auth_key||A,i=e.error||function(){},s=ue(),a=e.channel,u=e.op,c=e.gw_type,l=e.device_id;return l?c?u?a?P?M?(n=[F,"v1/push/sub-key",M,"devices",l],t={uuid:fe,auth:o,type:c},"add"==u?t.add=a:"remove"==u&&(t.remove=a),pe&&(data.instanceid=he),void oe({callback:s,data:t,success:function(e){d(e,r,i)},fail:function(e){y(e,i)},url:n})):se("Missing Subscribe Key"):se("Missing Publish Key"):se("Missing gw destination Channel (channel)"):se("Missing GW Operation (op: add or remove)"):se("Missing GW Type (gw_type: gcm or apns)"):se("Missing Device ID (device_id)")},audit:function(e,n){var n=e.callback||n,r=e.error||function(){},o=e.channel,s=e.channel_group,a=e.auth_key,u=ue();if(!n)return se("Missing Callback");if(!M)return se("Missing Subscribe Key");if(!P)return se("Missing Publish Key");if(!j)return se("Missing Secret Key");var c=Math.floor((new Date).getTime()/1e3),l=M+"\n"+P+"\naudit\n",f={timestamp:c};"0"!=u&&(f.callback=u),"undefined"!=typeof o&&null!=o&&o.length>0&&(f.channel=o),"undefined"!=typeof s&&null!=s&&s.length>0&&(f["channel-group"]=s),a&&(f.auth=a),f=t(f),a||delete f.auth,l+=i(f);var p=B(l,j);p=p.replace(/\+/g,"-"),p=p.replace(/\//g,"_"),f.signature=p,oe({callback:u,data:f,success:function(e){d(e,n,r)},fail:function(e){y(e,r)},url:[F,"v1","auth","audit","sub-key",M]})},revoke:function(e,t){e.read=!1,e.write=!1,ve.grant(e,t)},set_uuid:function(e){fe=e,L()},get_uuid:function(){return fe},isArray:function(e){return isArray(e)},get_subscibed_channels:function(){return generate_channel_list(X,!0)},presence_heartbeat:function(e){var n=e.callback||function(){},r=e.error||function(){},o=ue(),i={uuid:fe,auth:A},s=JSON.stringify(Q);s.length>2&&(i.state=JSON.stringify(Q)),Z>0&&320>Z&&(i.heartbeat=Z),"0"!=o&&(i.callback=o);var a=encode(generate_channel_list(X,!0).join(",")),u=generate_channel_group_list(Y,!0).join(",");a||(a=","),u&&(i["channel-group"]=u),pe&&(i.instanceid=he),oe({callback:o,data:t(i),timeout:5*SECOND,url:[F,"v2","presence","sub-key",M,"channel",a,"heartbeat"],success:function(e){d(e,n,r)},fail:function(e){y(e,r)}})},stop_timers:function(){clearTimeout(E),clearTimeout(x),clearTimeout($)},shutdown:function(){ve.stop_timers(),de&&de()},xdr:oe,ready:ready,db:ce,uuid:generate_uuid,map:map,each:each,"each-channel":h,grep:grep,offline:function(){m(1,{message:"Offline. Please check your network settings."})},supplant:supplant,now:rnow,unique:unique,updater:updater};return fe||(fe=ve.uuid()),he||(he=ve.uuid()),ce.set(M+"uuid",fe),E=timeout(b,SECOND),x=timeout(v,O),$=timeout(l,(ee-3)*SECOND),w(),ve}function crypto_obj(){function e(e){return CryptoJS.SHA256(e).toString(CryptoJS.enc.Hex)}function t(e){return e=e||{},e.hasOwnProperty("encryptKey")||(e.encryptKey=l.encryptKey),e.hasOwnProperty("keyEncoding")||(e.keyEncoding=l.keyEncoding),e.hasOwnProperty("keyLength")||(e.keyLength=l.keyLength),e.hasOwnProperty("mode")||(e.mode=l.mode),-1==a.indexOf(e.keyEncoding.toLowerCase())&&(e.keyEncoding=l.keyEncoding),-1==u.indexOf(parseInt(e.keyLength,10))&&(e.keyLength=l.keyLength),-1==c.indexOf(e.mode.toLowerCase())&&(e.mode=l.mode),e}function n(e,t){return"base64"==t.keyEncoding?CryptoJS.enc.Base64.parse(e):"hex"==t.keyEncoding?CryptoJS.enc.Hex.parse(e):e}function r(t,r){return t=n(t,r),r.encryptKey?CryptoJS.enc.Utf8.parse(e(t).slice(0,32)):t}function o(e){return"ecb"==e.mode?CryptoJS.mode.ECB:CryptoJS.mode.CBC}function i(e){return"cbc"==e.mode?CryptoJS.enc.Utf8.parse(s):null}var s="0123456789012345",a=["hex","utf8","base64","binary"],u=[128,256],c=["ecb","cbc"],l={encryptKey:!0,keyEncoding:"utf8",keyLength:256,mode:"cbc"};return{encrypt:function(e,n,s){if(!n)return e;s=t(s);var a=i(s),u=o(s),c=r(n,s),l=JSON.stringify(e),f=CryptoJS.AES.encrypt(l,c,{iv:a,mode:u}).ciphertext,p=f.toString(CryptoJS.enc.Base64);return p||e},decrypt:function(e,n,s){if(!n)return e;s=t(s);var a=i(s),u=o(s),c=r(n,s);try{var l=CryptoJS.enc.Base64.parse(e),f=CryptoJS.AES.decrypt({ciphertext:l},c,{iv:a,mode:u}).toString(CryptoJS.enc.Utf8),p=JSON.parse(f);return p}catch(h){return void 0}}}}window.JSON&&window.JSON.stringify||function(){function toJSON(e){try{return this.valueOf()}catch(t){return null}}function quote(e){return escapable.lastIndex=0,escapable.test(e)?'"'+e.replace(escapable,function(e){var t=meta[e];return"string"==typeof t?t:"\\u"+("0000"+e.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+e+'"'}function str(e,t){var n,r,o,i,s,a=gap,u=t[e];switch(u&&"object"==typeof u&&(u=toJSON.call(u,e)),"function"==typeof rep&&(u=rep.call(t,e,u)),typeof u){case"string":return quote(u);case"number":return isFinite(u)?String(u):"null";case"boolean":case"null":return String(u);case"object":if(!u)return"null";if(gap+=indent,s=[],"[object Array]"===Object.prototype.toString.apply(u)){for(i=u.length,n=0;i>n;n+=1)s[n]=str(n,u)||"null";return o=0===s.length?"[]":gap?"[\n"+gap+s.join(",\n"+gap)+"\n"+a+"]":"["+s.join(",")+"]",gap=a,o}if(rep&&"object"==typeof rep)for(i=rep.length,n=0;i>n;n+=1)r=rep[n],"string"==typeof r&&(o=str(r,u),o&&s.push(quote(r)+(gap?": ":":")+o));else for(r in u)Object.hasOwnProperty.call(u,r)&&(o=str(r,u),o&&s.push(quote(r)+(gap?": ":":")+o));return o=0===s.length?"{}":gap?"{\n"+gap+s.join(",\n"+gap)+"\n"+a+"}":"{"+s.join(",")+"}",gap=a,o}}window.JSON||(window.JSON={});var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={"\b":"\\b"," ":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},rep;"function"!=typeof JSON.stringify&&(JSON.stringify=function(e,t,n){var r;if(gap="",indent="","number"==typeof n)for(r=0;n>r;r+=1)indent+=" ";else"string"==typeof n&&(indent=n);if(rep=t,t&&"function"!=typeof t&&("object"!=typeof t||"number"!=typeof t.length))throw new Error("JSON.stringify");return str("",{"":e})}),"function"!=typeof JSON.parse&&(JSON.parse=function(text){return eval("("+text+")")})}();var NOW=1,READY=!1,READY_BUFFER=[],PRESENCE_SUFFIX="-pnpres",DEF_WINDOWING=10,DEF_TIMEOUT=1e4,DEF_SUB_TIMEOUT=310,DEF_KEEPALIVE=60,SECOND=1e3,URLBIT="/",PARAMSBIT="&",PRESENCE_HB_THRESHOLD=5,PRESENCE_HB_DEFAULT=30,SDK_VER="3.7.14",REPL=/{([\w\-]+)}/g,nextorigin=function(){var e=20,t=Math.floor(Math.random()*e);return function(n,r){return n.indexOf("pubsub.")>0&&n.replace("pubsub","ps"+(r?generate_uuid().split("-")[0]:++t0&&"number"==typeof t[n]?"px":"")}catch(r){}}function u(e){return document.createElement(e)}function c(){return m||d()?0:unique()}function l(e){if(m||d())return f(e);var n=u("script"),r=e.callback,o=unique(),a=0,c=e.timeout||DEF_TIMEOUT,l=timeout(function(){v(1,{message:"timeout"})},c),p=e.fail||function(){},h=e.data||{},y=e.success||function(){},b=function(){i().appendChild(n)},v=function(e,r){a||(a=1,n.onerror=null,clearTimeout(l),e||!r||y(r),timeout(function(){e&&p();var n=t(o),r=n&&n.parentNode;r&&r.removeChild(n)},SECOND))};return window[r]=function(e){v(0,e)},e.blocking||(n[_]=_),n.onerror=function(){v(1)},n.src=build_url(e.url,h),s(n,"id",o),b(),v}function f(e){var t,n,r=function(){if(!i){i=1,clearTimeout(a);try{n=JSON.parse(t.responseText)}catch(e){return h(1)}o=1,f(n)}},o=0,i=0,s=e.timeout||DEF_TIMEOUT,a=timeout(function(){h(1,{message:"timeout"})},s),u=e.fail||function(){},c=e.data||{},f=e.success||function(){},p=!e.blocking,h=function(e,n){o||(o=1,clearTimeout(a),t&&(t.onerror=t.onload=null,t.abort&&t.abort(),t=null),e&&u(n))};try{t=d()||window.XDomainRequest&&new XDomainRequest||new XMLHttpRequest,t.onerror=t.onabort=function(e){h(1,e||t&&t.responseText||{error:"Network Connection Error"})},t.onload=t.onloadend=r,t.onreadystatechange=function(){if(t&&4==t.readyState)switch(t.status){case 200:break;default:try{n=JSON.parse(t.responseText),h(1,n)}catch(e){return h(1,{status:t.status,payload:null,message:t.responseText})}return}};var y=build_url(e.url,c);t.open("GET",y,p),p&&(t.timeout=s),t.send()}catch(_){return h(0),m=0,l(e)}return h}function p(){if(!("onLine"in navigator))return 1;try{return navigator.onLine}catch(e){return!0}}function h(e){return"sendBeacon"in navigator?navigator.sendBeacon(e):!1}function d(){if(!S||!S.get)return 0;var e={id:d.id++,send:function(){},abort:function(){e.id={}},open:function(t,n){d[e.id]=e,S.get(e.id,n)}};return e}var y="https://pubnub.a.ssl.fastly.net/pubnub.swf",_="async",b=navigator.userAgent,v="PubNub-JS-Web/3.7.14",m=-1==b.indexOf("MSIE 6");window.console||(window.console=window.console||{}),console.log||(console.log=console.error=(window.opera||{}).postError||function(){});var g=function(){var e={},t=!1;try{t=window.localStorage}catch(n){}var r=function(e){return-1==document.cookie.indexOf(e)?null:((document.cookie||"").match(RegExp(e+"=([^;]+)"))||[])[1]||null},o=function(e,t){document.cookie=e+"="+t+"; expires=Thu, 1 Aug 2030 20:00:00 UTC; path=/"},i=function(){try{return o("pnctest","1"),"1"===r("pnctest")}catch(e){return!1}}();return{get:function(n){try{return t?t.getItem(n):i?r(n):e[n]}catch(o){return e[n]}},set:function(n,r){try{if(t)return t.setItem(n,r)&&0;i&&o(n,r),e[n]=r}catch(s){e[n]=r}}}}(),w={list:{},unbind:function(e){w.list[e]=[]},bind:function(e,t){(w.list[e]=w.list[e]||[]).push(t)},fire:function(e,t){each(w.list[e]||[],function(e){e(t)})}},k=t("pubnub")||0,E=function(f){m=f.jsonp?0:-1==b.indexOf("MSIE 6");var d=f.subscribe_key||"",y=((+f.keepalive||DEF_KEEPALIVE)*SECOND,f.uuid||g.get(d+"uuid")||"",f.leave_on_unload||0);f.xdr=l,f.db=g,f.error=f.error||n,f._is_online=p,f.jsonp_cb=c,f.hmac_SHA256=e,f.crypto_obj=crypto_obj(),f.sendBeacon=h,f.params={pnsdk:v};var _=function(e){return E(e)},k=PN_API(f);for(var x in k)k.hasOwnProperty(x)&&(_[x]=k[x]);return _.css=a,_.$=t,_.create=u,_.bind=o,_.head=i,_.search=r,_.attr=s,_.events=w,_.init=_,_.secure=_,_.crypto_obj=crypto_obj(),o("beforeunload",window,function(){return y&&_["each-channel"](function(e){_.LEAVE(e.name,0)}),!0}),f.notest?_:(o("offline",window,_.offline),o("offline",document,_.offline),_)};E.init=E,E.secure=E,E.crypto_obj=crypto_obj(),"complete"===document.readyState?timeout(ready,0):o("load",window,function(){timeout(ready,0)});var x=k||{};PUBNUB=E({notest:1,publish_key:s(x,"pub-key"),subscribe_key:s(x,"sub-key"),ssl:!document.location.href.indexOf("https")||"on"==s(x,"ssl"),origin:s(x,"origin"),uuid:s(x,"uuid")}),window.jQuery&&(window.jQuery.PUBNUB=E),"undefined"!=typeof module&&(module.exports=PUBNUB)&&ready();var S=t("pubnubs")||0;k&&(a(k,{position:"absolute",top:-SECOND}),("opera"in window||s(k,"flash"))&&(k.innerHTML=""),PUBNUB.rdx=function(e,t){return t?(d[e].responseText=unescape(t),void d[e].onload()):d[e].onerror()},d.id=SECOND)}(),function(){var e=PUBNUB.ws=function(t,n){if(!(this instanceof e))return new e(t,n);var r=this,t=r.url=t||"",o=(r.protocol=n||"Sec-WebSocket-Protocol",t.split("/")),i={ssl:"wss:"===o[0],origin:o[2],publish_key:o[3],subscribe_key:o[4],channel:o[5]};return r.CONNECTING=0,r.OPEN=1,r.CLOSING=2,r.CLOSED=3,r.CLOSE_NORMAL=1e3,r.CLOSE_GOING_AWAY=1001,r.CLOSE_PROTOCOL_ERROR=1002,r.CLOSE_UNSUPPORTED=1003,r.CLOSE_TOO_LARGE=1004,r.CLOSE_NO_STATUS=1005,r.CLOSE_ABNORMAL=1006,r.onclose=r.onerror=r.onmessage=r.onopen=r.onsend=function(){},r.binaryType="",r.extensions="",r.bufferedAmount=0,r.trasnmitting=!1,r.buffer=[],r.readyState=r.CONNECTING,t?(r.pubnub=PUBNUB.init(i),r.pubnub.setup=i,r.setup=i,void r.pubnub.subscribe({restore:!1,channel:i.channel,disconnect:r.onerror,reconnect:r.onopen,error:function(){r.onclose({code:r.CLOSE_ABNORMAL,reason:"Missing URL",wasClean:!1})},callback:function(e){r.onmessage({data:e})},connect:function(){r.readyState=r.OPEN,r.onopen()}})):(r.readyState=r.CLOSED,r.onclose({code:r.CLOSE_ABNORMAL,reason:"Missing URL",wasClean:!0}),r)};e.prototype.send=function(e){var t=this;t.pubnub.publish({channel:t.pubnub.setup.channel,message:e,callback:function(e){t.onsend({data:e})}})},e.prototype.close=function(){var e=this;e.pubnub.unsubscribe({channel:e.pubnub.setup.channel}),e.readyState=e.CLOSED,e.onclose({})}}();var CryptoJS=CryptoJS||function(e,t){var n={},r=n.lib={},o=function(){},i=r.Base={extend:function(e){o.prototype=this;var t=new o;return e&&t.mixIn(e),t.hasOwnProperty("init")||(t.init=function(){t.$super.init.apply(this,arguments)}),t.init.prototype=t,t.$super=this,t},create:function(){var e=this.extend();return e.init.apply(e,arguments),e},init:function(){},mixIn:function(e){for(var t in e)e.hasOwnProperty(t)&&(this[t]=e[t]);e.hasOwnProperty("toString")&&(this.toString=e.toString)},clone:function(){return this.init.prototype.extend(this)}},s=r.WordArray=i.extend({init:function(e,n){e=this.words=e||[],this.sigBytes=n!=t?n:4*e.length},toString:function(e){return(e||u).stringify(this)},concat:function(e){var t=this.words,n=e.words,r=this.sigBytes;if(e=e.sigBytes,this.clamp(),r%4)for(var o=0;e>o;o++)t[r+o>>>2]|=(n[o>>>2]>>>24-8*(o%4)&255)<<24-8*((r+o)%4);else if(65535o;o+=4)t[r+o>>>2]=n[o>>>2];else t.push.apply(t,n);return this.sigBytes+=e,this},clamp:function(){var t=this.words,n=this.sigBytes;t[n>>>2]&=4294967295<<32-8*(n%4),t.length=e.ceil(n/4)},clone:function(){var e=i.clone.call(this);return e.words=this.words.slice(0),e},random:function(t){for(var n=[],r=0;t>r;r+=4)n.push(4294967296*e.random()|0);return new s.init(n,t)}}),a=n.enc={},u=a.Hex={stringify:function(e){var t=e.words;e=e.sigBytes;for(var n=[],r=0;e>r;r++){var o=t[r>>>2]>>>24-8*(r%4)&255;n.push((o>>>4).toString(16)),n.push((15&o).toString(16))}return n.join("")},parse:function(e){for(var t=e.length,n=[],r=0;t>r;r+=2)n[r>>>3]|=parseInt(e.substr(r,2),16)<<24-4*(r%8);return new s.init(n,t/2)}},c=a.Latin1={stringify:function(e){var t=e.words;e=e.sigBytes;for(var n=[],r=0;e>r;r++)n.push(String.fromCharCode(t[r>>>2]>>>24-8*(r%4)&255));return n.join("")},parse:function(e){for(var t=e.length,n=[],r=0;t>r;r++)n[r>>>2]|=(255&e.charCodeAt(r))<<24-8*(r%4);return new s.init(n,t)}},l=a.Utf8={stringify:function(e){try{return decodeURIComponent(escape(c.stringify(e)))}catch(t){throw Error("Malformed UTF-8 data")}},parse:function(e){return c.parse(unescape(encodeURIComponent(e)))}},f=r.BufferedBlockAlgorithm=i.extend({reset:function(){this._data=new s.init,this._nDataBytes=0},_append:function(e){"string"==typeof e&&(e=l.parse(e)),this._data.concat(e),this._nDataBytes+=e.sigBytes},_process:function(t){var n=this._data,r=n.words,o=n.sigBytes,i=this.blockSize,a=o/(4*i),a=t?e.ceil(a):e.max((0|a)-this._minBufferSize,0);if(t=a*i,o=e.min(4*t,o),t){for(var u=0;t>u;u+=i)this._doProcessBlock(r,u);u=r.splice(0,t),n.sigBytes-=o}return new s.init(u,o)},clone:function(){var e=i.clone.call(this);return e._data=this._data.clone(),e},_minBufferSize:0});r.Hasher=f.extend({cfg:i.extend(),init:function(e){this.cfg=this.cfg.extend(e),this.reset()},reset:function(){f.reset.call(this),this._doReset()},update:function(e){return this._append(e),this._process(),this},finalize:function(e){return e&&this._append(e),this._doFinalize()},blockSize:16,_createHelper:function(e){return function(t,n){return new e.init(n).finalize(t)}},_createHmacHelper:function(e){return function(t,n){return new p.HMAC.init(e,n).finalize(t)}}});var p=n.algo={};return n}(Math);!function(e){for(var t=CryptoJS,n=t.lib,r=n.WordArray,o=n.Hasher,n=t.algo,i=[],s=[],a=function(e){return 4294967296*(e-(0|e))|0},u=2,c=0;64>c;){var l;e:{l=u;for(var f=e.sqrt(l),p=2;f>=p;p++)if(!(l%p)){l=!1;break e}l=!0}l&&(8>c&&(i[c]=a(e.pow(u,.5))),s[c]=a(e.pow(u,1/3)),c++),u++}var h=[],n=n.SHA256=o.extend({_doReset:function(){this._hash=new r.init(i.slice(0))},_doProcessBlock:function(e,t){for(var n=this._hash.words,r=n[0],o=n[1],i=n[2],a=n[3],u=n[4],c=n[5],l=n[6],f=n[7],p=0;64>p;p++){if(16>p)h[p]=0|e[t+p];else{var d=h[p-15],y=h[p-2];h[p]=((d<<25|d>>>7)^(d<<14|d>>>18)^d>>>3)+h[p-7]+((y<<15|y>>>17)^(y<<13|y>>>19)^y>>>10)+h[p-16]}d=f+((u<<26|u>>>6)^(u<<21|u>>>11)^(u<<7|u>>>25))+(u&c^~u&l)+s[p]+h[p],y=((r<<30|r>>>2)^(r<<19|r>>>13)^(r<<10|r>>>22))+(r&o^r&i^o&i),f=l,l=c,c=u,u=a+d|0,a=i,i=o,o=r,r=d+y|0}n[0]=n[0]+r|0,n[1]=n[1]+o|0,n[2]=n[2]+i|0,n[3]=n[3]+a|0,n[4]=n[4]+u|0,n[5]=n[5]+c|0,n[6]=n[6]+l|0,n[7]=n[7]+f|0},_doFinalize:function(){var t=this._data,n=t.words,r=8*this._nDataBytes,o=8*t.sigBytes;return n[o>>>5]|=128<<24-o%32,n[(o+64>>>9<<4)+14]=e.floor(r/4294967296),n[(o+64>>>9<<4)+15]=r,t.sigBytes=4*n.length,this._process(),this._hash},clone:function(){var e=o.clone.call(this);return e._hash=this._hash.clone(),e}});t.SHA256=o._createHelper(n),t.HmacSHA256=o._createHmacHelper(n)}(Math),function(){var e=CryptoJS,t=e.enc.Utf8;e.algo.HMAC=e.lib.Base.extend({init:function(e,n){e=this._hasher=new e.init,"string"==typeof n&&(n=t.parse(n));var r=e.blockSize,o=4*r;n.sigBytes>o&&(n=e.finalize(n)),n.clamp();for(var i=this._oKey=n.clone(),s=this._iKey=n.clone(),a=i.words,u=s.words,c=0;r>c;c++)a[c]^=1549556828,u[c]^=909522486;i.sigBytes=s.sigBytes=o,this.reset()},reset:function(){var e=this._hasher;e.reset(),e.update(this._iKey)},update:function(e){return this._hasher.update(e),this},finalize:function(e){var t=this._hasher;return e=t.finalize(e),t.reset(),t.finalize(this._oKey.clone().concat(e))}})}(),function(){var e=CryptoJS,t=e.lib.WordArray;e.enc.Base64={stringify:function(e){var t=e.words,n=e.sigBytes,r=this._map;e.clamp(),e=[];for(var o=0;n>o;o+=3)for(var i=(t[o>>>2]>>>24-8*(o%4)&255)<<16|(t[o+1>>>2]>>>24-8*((o+1)%4)&255)<<8|t[o+2>>>2]>>>24-8*((o+2)%4)&255,s=0;4>s&&n>o+.75*s;s++)e.push(r.charAt(i>>>6*(3-s)&63));if(t=r.charAt(64))for(;e.length%4;)e.push(t);return e.join("")},parse:function(e){var n=e.length,r=this._map,o=r.charAt(64);o&&(o=e.indexOf(o),-1!=o&&(n=o));for(var o=[],i=0,s=0;n>s;s++)if(s%4){var a=r.indexOf(e.charAt(s-1))<<2*(s%4),u=r.indexOf(e.charAt(s))>>>6-2*(s%4);o[i>>>2]|=(a|u)<<24-8*(i%4),i++}return t.create(o,i)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}}(),function(e){function t(e,t,n,r,o,i,s){return e=e+(t&n|~t&r)+o+s,(e<>>32-i)+t}function n(e,t,n,r,o,i,s){return e=e+(t&r|n&~r)+o+s,(e<>>32-i)+t}function r(e,t,n,r,o,i,s){return e=e+(t^n^r)+o+s,(e<>>32-i)+t}function o(e,t,n,r,o,i,s){return e=e+(n^(t|~r))+o+s,(e<>>32-i)+t}for(var i=CryptoJS,s=i.lib,a=s.WordArray,u=s.Hasher,s=i.algo,c=[],l=0;64>l;l++)c[l]=4294967296*e.abs(e.sin(l+1))|0;s=s.MD5=u.extend({_doReset:function(){this._hash=new a.init([1732584193,4023233417,2562383102,271733878])},_doProcessBlock:function(e,i){for(var s=0;16>s;s++){var a=i+s,u=e[a];e[a]=16711935&(u<<8|u>>>24)|4278255360&(u<<24|u>>>8)}var s=this._hash.words,a=e[i+0],u=e[i+1],l=e[i+2],f=e[i+3],p=e[i+4],h=e[i+5],d=e[i+6],y=e[i+7],_=e[i+8],b=e[i+9],v=e[i+10],m=e[i+11],g=e[i+12],w=e[i+13],k=e[i+14],E=e[i+15],x=s[0],S=s[1],T=s[2],O=s[3],x=t(x,S,T,O,a,7,c[0]),O=t(O,x,S,T,u,12,c[1]),T=t(T,O,x,S,l,17,c[2]),S=t(S,T,O,x,f,22,c[3]),x=t(x,S,T,O,p,7,c[4]),O=t(O,x,S,T,h,12,c[5]),T=t(T,O,x,S,d,17,c[6]),S=t(S,T,O,x,y,22,c[7]),x=t(x,S,T,O,_,7,c[8]),O=t(O,x,S,T,b,12,c[9]),T=t(T,O,x,S,v,17,c[10]),S=t(S,T,O,x,m,22,c[11]),x=t(x,S,T,O,g,7,c[12]),O=t(O,x,S,T,w,12,c[13]),T=t(T,O,x,S,k,17,c[14]),S=t(S,T,O,x,E,22,c[15]),x=n(x,S,T,O,u,5,c[16]),O=n(O,x,S,T,d,9,c[17]),T=n(T,O,x,S,m,14,c[18]),S=n(S,T,O,x,a,20,c[19]),x=n(x,S,T,O,h,5,c[20]),O=n(O,x,S,T,v,9,c[21]),T=n(T,O,x,S,E,14,c[22]),S=n(S,T,O,x,p,20,c[23]),x=n(x,S,T,O,b,5,c[24]),O=n(O,x,S,T,k,9,c[25]),T=n(T,O,x,S,f,14,c[26]),S=n(S,T,O,x,_,20,c[27]),x=n(x,S,T,O,w,5,c[28]),O=n(O,x,S,T,l,9,c[29]),T=n(T,O,x,S,y,14,c[30]),S=n(S,T,O,x,g,20,c[31]),x=r(x,S,T,O,h,4,c[32]),O=r(O,x,S,T,_,11,c[33]),T=r(T,O,x,S,m,16,c[34]),S=r(S,T,O,x,k,23,c[35]),x=r(x,S,T,O,u,4,c[36]),O=r(O,x,S,T,p,11,c[37]),T=r(T,O,x,S,y,16,c[38]),S=r(S,T,O,x,v,23,c[39]),x=r(x,S,T,O,w,4,c[40]),O=r(O,x,S,T,a,11,c[41]),T=r(T,O,x,S,f,16,c[42]),S=r(S,T,O,x,d,23,c[43]),x=r(x,S,T,O,b,4,c[44]),O=r(O,x,S,T,g,11,c[45]),T=r(T,O,x,S,E,16,c[46]),S=r(S,T,O,x,l,23,c[47]),x=o(x,S,T,O,a,6,c[48]),O=o(O,x,S,T,y,10,c[49]),T=o(T,O,x,S,k,15,c[50]),S=o(S,T,O,x,h,21,c[51]),x=o(x,S,T,O,g,6,c[52]),O=o(O,x,S,T,f,10,c[53]),T=o(T,O,x,S,v,15,c[54]),S=o(S,T,O,x,u,21,c[55]),x=o(x,S,T,O,_,6,c[56]),O=o(O,x,S,T,E,10,c[57]),T=o(T,O,x,S,d,15,c[58]),S=o(S,T,O,x,w,21,c[59]),x=o(x,S,T,O,p,6,c[60]),O=o(O,x,S,T,m,10,c[61]),T=o(T,O,x,S,l,15,c[62]),S=o(S,T,O,x,b,21,c[63]);s[0]=s[0]+x|0,s[1]=s[1]+S|0,s[2]=s[2]+T|0,s[3]=s[3]+O|0},_doFinalize:function(){var t=this._data,n=t.words,r=8*this._nDataBytes,o=8*t.sigBytes;n[o>>>5]|=128<<24-o%32;var i=e.floor(r/4294967296);for(n[(o+64>>>9<<4)+15]=16711935&(i<<8|i>>>24)|4278255360&(i<<24|i>>>8),n[(o+64>>>9<<4)+14]=16711935&(r<<8|r>>>24)|4278255360&(r<<24|r>>>8),t.sigBytes=4*(n.length+1),this._process(),t=this._hash,n=t.words,r=0;4>r;r++)o=n[r],n[r]=16711935&(o<<8|o>>>24)|4278255360&(o<<24|o>>>8);return t},clone:function(){var e=u.clone.call(this);return e._hash=this._hash.clone(),e}}),i.MD5=u._createHelper(s),i.HmacMD5=u._createHmacHelper(s)}(Math),function(){var e=CryptoJS,t=e.lib,n=t.Base,r=t.WordArray,t=e.algo,o=t.EvpKDF=n.extend({cfg:n.extend({keySize:4,hasher:t.MD5,iterations:1}),init:function(e){this.cfg=this.cfg.extend(e)},compute:function(e,t){for(var n=this.cfg,o=n.hasher.create(),i=r.create(),s=i.words,a=n.keySize,n=n.iterations;s.lengthc;c++)u=o.finalize(u),o.reset();i.concat(u)}return i.sigBytes=4*a,i}});e.EvpKDF=function(e,t,n){return o.create(n).compute(e,t)}}(),CryptoJS.lib.Cipher||function(e){var t=CryptoJS,n=t.lib,r=n.Base,o=n.WordArray,i=n.BufferedBlockAlgorithm,s=t.enc.Base64,a=t.algo.EvpKDF,u=n.Cipher=i.extend({cfg:r.extend(),createEncryptor:function(e,t){return this.create(this._ENC_XFORM_MODE,e,t)},createDecryptor:function(e,t){return this.create(this._DEC_XFORM_MODE,e,t)},init:function(e,t,n){this.cfg=this.cfg.extend(n),this._xformMode=e,this._key=t,this.reset()},reset:function(){i.reset.call(this),this._doReset()},process:function(e){return this._append(e),this._process()},finalize:function(e){return e&&this._append(e),this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(e){return{encrypt:function(t,n,r){return("string"==typeof n?d:h).encrypt(e,t,n,r)},decrypt:function(t,n,r){return("string"==typeof n?d:h).decrypt(e,t,n,r)}}}});n.StreamCipher=u.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var c=t.mode={},l=function(t,n,r){var o=this._iv;o?this._iv=e:o=this._prevBlock;for(var i=0;r>i;i++)t[n+i]^=o[i]},f=(n.BlockCipherMode=r.extend({createEncryptor:function(e,t){return this.Encryptor.create(e,t)},createDecryptor:function(e,t){return this.Decryptor.create(e,t)},init:function(e,t){this._cipher=e,this._iv=t}})).extend();f.Encryptor=f.extend({processBlock:function(e,t){var n=this._cipher,r=n.blockSize;l.call(this,e,t,r),n.encryptBlock(e,t),this._prevBlock=e.slice(t,t+r)}}),f.Decryptor=f.extend({processBlock:function(e,t){var n=this._cipher,r=n.blockSize,o=e.slice(t,t+r);n.decryptBlock(e,t),l.call(this,e,t,r),this._prevBlock=o}}),c=c.CBC=f,f=(t.pad={}).Pkcs7={pad:function(e,t){for(var n=4*t,n=n-e.sigBytes%n,r=n<<24|n<<16|n<<8|n,i=[],s=0;n>s;s+=4)i.push(r);n=o.create(i,n),e.concat(n)},unpad:function(e){e.sigBytes-=255&e.words[e.sigBytes-1>>>2]}},n.BlockCipher=u.extend({cfg:u.cfg.extend({mode:c,padding:f}),reset:function(){u.reset.call(this);var e=this.cfg,t=e.iv,e=e.mode;if(this._xformMode==this._ENC_XFORM_MODE)var n=e.createEncryptor;else n=e.createDecryptor,this._minBufferSize=1;this._mode=n.call(e,this,t&&t.words)},_doProcessBlock:function(e,t){this._mode.processBlock(e,t)},_doFinalize:function(){var e=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){e.pad(this._data,this.blockSize);var t=this._process(!0)}else t=this._process(!0),e.unpad(t);return t},blockSize:4});var p=n.CipherParams=r.extend({init:function(e){this.mixIn(e)},toString:function(e){return(e||this.formatter).stringify(this)}}),c=(t.format={}).OpenSSL={stringify:function(e){var t=e.ciphertext;return e=e.salt,(e?o.create([1398893684,1701076831]).concat(e).concat(t):t).toString(s)},parse:function(e){e=s.parse(e);var t=e.words;if(1398893684==t[0]&&1701076831==t[1]){var n=o.create(t.slice(2,4));t.splice(0,4),e.sigBytes-=16}return p.create({ciphertext:e,salt:n})}},h=n.SerializableCipher=r.extend({cfg:r.extend({format:c}),encrypt:function(e,t,n,r){r=this.cfg.extend(r);var o=e.createEncryptor(n,r);return t=o.finalize(t),o=o.cfg,p.create({ciphertext:t,key:n,iv:o.iv,algorithm:e,mode:o.mode,padding:o.padding,blockSize:e.blockSize,formatter:r.format})},decrypt:function(e,t,n,r){return r=this.cfg.extend(r),t=this._parse(t,r.format),e.createDecryptor(n,r).finalize(t.ciphertext)},_parse:function(e,t){return"string"==typeof e?t.parse(e,this):e}}),t=(t.kdf={}).OpenSSL={execute:function(e,t,n,r){return r||(r=o.random(8)),e=a.create({keySize:t+n}).compute(e,r),n=o.create(e.words.slice(t),4*n),e.sigBytes=4*t,p.create({key:e,iv:n,salt:r})}},d=n.PasswordBasedCipher=h.extend({cfg:h.cfg.extend({kdf:t}),encrypt:function(e,t,n,r){return r=this.cfg.extend(r),n=r.kdf.execute(n,e.keySize,e.ivSize),r.iv=n.iv,e=h.encrypt.call(this,e,t,n.key,r),e.mixIn(n),e},decrypt:function(e,t,n,r){return r=this.cfg.extend(r),t=this._parse(t,r.format),n=r.kdf.execute(n,e.keySize,e.ivSize,t.salt),r.iv=n.iv,h.decrypt.call(this,e,t,n.key,r)}})}(),function(){for(var e=CryptoJS,t=e.lib.BlockCipher,n=e.algo,r=[],o=[],i=[],s=[],a=[],u=[],c=[],l=[],f=[],p=[],h=[],d=0;256>d;d++)h[d]=128>d?d<<1:d<<1^283;for(var y=0,_=0,d=0;256>d;d++){var b=_^_<<1^_<<2^_<<3^_<<4,b=b>>>8^255&b^99;r[y]=b,o[b]=y;var v=h[y],m=h[v],g=h[m],w=257*h[b]^16843008*b;i[y]=w<<24|w>>>8,s[y]=w<<16|w>>>16,a[y]=w<<8|w>>>24,u[y]=w,w=16843009*g^65537*m^257*v^16843008*y,c[b]=w<<24|w>>>8,l[b]=w<<16|w>>>16,f[b]=w<<8|w>>>24,p[b]=w,y?(y=v^h[h[h[g^v]]],_^=h[h[_]]):y=_=1}var k=[0,1,2,4,8,16,32,64,128,27,54],n=n.AES=t.extend({_doReset:function(){for(var e=this._key,t=e.words,n=e.sigBytes/4,e=4*((this._nRounds=n+6)+1),o=this._keySchedule=[],i=0;e>i;i++)if(n>i)o[i]=t[i];else{var s=o[i-1];i%n?n>6&&4==i%n&&(s=r[s>>>24]<<24|r[s>>>16&255]<<16|r[s>>>8&255]<<8|r[255&s]):(s=s<<8|s>>>24,s=r[s>>>24]<<24|r[s>>>16&255]<<16|r[s>>>8&255]<<8|r[255&s],s^=k[i/n|0]<<24),o[i]=o[i-n]^s}for(t=this._invKeySchedule=[],n=0;e>n;n++)i=e-n,s=n%4?o[i]:o[i-4],t[n]=4>n||4>=i?s:c[r[s>>>24]]^l[r[s>>>16&255]]^f[r[s>>>8&255]]^p[r[255&s]]},encryptBlock:function(e,t){this._doCryptBlock(e,t,this._keySchedule,i,s,a,u,r)},decryptBlock:function(e,t){var n=e[t+1];e[t+1]=e[t+3],e[t+3]=n,this._doCryptBlock(e,t,this._invKeySchedule,c,l,f,p,o),n=e[t+1],e[t+1]=e[t+3],e[t+3]=n},_doCryptBlock:function(e,t,n,r,o,i,s,a){for(var u=this._nRounds,c=e[t]^n[0],l=e[t+1]^n[1],f=e[t+2]^n[2],p=e[t+3]^n[3],h=4,d=1;u>d;d++)var y=r[c>>>24]^o[l>>>16&255]^i[f>>>8&255]^s[255&p]^n[h++],_=r[l>>>24]^o[f>>>16&255]^i[p>>>8&255]^s[255&c]^n[h++],b=r[f>>>24]^o[p>>>16&255]^i[c>>>8&255]^s[255&l]^n[h++],p=r[p>>>24]^o[c>>>16&255]^i[l>>>8&255]^s[255&f]^n[h++],c=y,l=_,f=b; -y=(a[c>>>24]<<24|a[l>>>16&255]<<16|a[f>>>8&255]<<8|a[255&p])^n[h++],_=(a[l>>>24]<<24|a[f>>>16&255]<<16|a[p>>>8&255]<<8|a[255&c])^n[h++],b=(a[f>>>24]<<24|a[p>>>16&255]<<16|a[c>>>8&255]<<8|a[255&l])^n[h++],p=(a[p>>>24]<<24|a[c>>>16&255]<<16|a[l>>>8&255]<<8|a[255&f])^n[h++],e[t]=y,e[t+1]=_,e[t+2]=b,e[t+3]=p},keySize:8});e.AES=t._createHelper(n)}(),CryptoJS.mode.ECB=function(){var e=CryptoJS.lib.BlockCipherMode.extend();return e.Encryptor=e.extend({processBlock:function(e,t){this._cipher.encryptBlock(e,t)}}),e.Decryptor=e.extend({processBlock:function(e,t){this._cipher.decryptBlock(e,t)}}),e}()}).call(exports,__webpack_require__(7)(module))},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var r=function(){function e(e,t){for(var n=0;n1?n-1:0),o=1;n>o;o++)r[o-1]=arguments[o];var i=null;return this.hasListeners(e)?(this._listeners[e].some(function(e){return i=e.apply(t,r),i===!1}),i):null},e.prototype.off=function(e,t){var n=this;if(e)if(t){if(!this.hasListeners(e))return this;this._listeners[e].forEach(function(r,o){r===t&&delete n._listeners[e][o]})}else delete this._listeners[e];else this._listeners={};return this},e}();t["default"]=r,e.exports=t["default"]},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var s=function(){function e(e,t){for(var n=0;n-1?"&":"?")+u.queryStringify(e.query)),c.findHeaderName("Accept",e.headers)||(e.headers.Accept=h["default"]._jsonContentType),"string"!=typeof e.body||!e.body){var n=c.findHeaderName(h["default"]._contentType,e.headers);n||(n=h["default"]._contentType,e.headers[n]=h["default"]._jsonContentType);var r=e.headers[n];r.indexOf(h["default"]._jsonContentType)>-1?e.body=JSON.stringify(e.body):r.indexOf(h["default"]._urlencodedContentType)>-1&&(e.body=u.queryStringify(e.body))}var o=new a.Request(e.url,e);return o.originalBody=e.body,o},s(t,null,[{key:"_allowedMethods",value:["GET","POST","PUT","DELETE","PATCH","OPTIONS","HEAD"],enumerable:!0}]),t}(f["default"]);t["default"]=d,e.exports=t["default"]},function(e,t,n){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t["default"]=e,t}function o(e,t){t=t||{};var n=new s.Response(e,t);return u.isNodeJS()&&(n._text=e,n._decode=function(){return this._text}),n}function i(e,t){return e=e.toLowerCase(),Object.keys(t).reduce(function(t,n){return t?t:e==n.toLowerCase()?n:t},null)}t.__esModule=!0,t.createResponse=o,t.findHeaderName=i;var s=n(3),a=n(2),u=r(a)},function(e,t,n){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t["default"]=e,t}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(e,t){for(var n=0;n-1},e.prototype._getContentType=function(){return this._response.headers.get(e._contentType)||""},e.prototype._isMultipart=function(){return this._isContentType(e._multipartContentType)},e.prototype._isUrlEncoded=function(){return this._isContentType(e._urlencodedContentType)},e.prototype._isJson=function(){return this._isContentType(e._jsonContentType)},e.create=function(t,n,r){t=t||"",n=n||200,r=r||"OK",t=t.replace(/\r/g,"");var o=new s.Headers,i=t.split(e._bodySeparator),a=i.length>1?i.shift():"";return t=i.join(e._bodySeparator),(a||"").split("\n").forEach(function(t){var n=t.trim().split(e._headerSeparator),r=n.shift().trim(),i=n.join(e._headerSeparator).trim();r&&o.append(r,i)}),new e(null,u.createResponse(t,{headers:o,status:n,statusText:r}),t)},e}();t["default"]=c,e.exports=t["default"]},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var s=n(17),a=r(s),u=n(13),c=r(u),l=function(e){function t(){o(this,t),e.call(this),this._registry=new a["default"]}return i(t,e),t.prototype.registry=function(){return this._registry},t.prototype._loadResponse=function(e){var t;return regeneratorRuntime.async(function(n){for(;;)switch(n.prev=n.next){case 0:return t=this._registry.find(e),n.next=3,regeneratorRuntime.awrap(t.getResponse(e));case 3:return n.abrupt("return",n.sent);case 4:case"end":return n.stop()}},null,this)},t}(c["default"]);t["default"]=l,e.exports=t["default"]},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=n(18),s=r(i),a=function(){function e(){o(this,e),this._mocks=[]}return e.prototype.add=function(e){return this._mocks.push(e),this},e.prototype.clear=function(){return this._mocks=[],this},e.prototype.find=function(e){var t=this._mocks.shift();if(!t)throw new Error("No mock in registry for request "+e.method+" "+e.url);if(!t.test(e))throw new Error("Wrong request "+e.method+" "+e.url+" for expected mock "+t.method()+" "+t.path());return t},e.prototype.apiCall=function(e,t,n,r,o){return this.add(new s["default"](e,t,n,r,o)),this},e.prototype.authentication=function(){return this.apiCall("POST","/restapi/oauth/token",{access_token:"ACCESS_TOKEN",token_type:"bearer",expires_in:3600,refresh_token:"REFRESH_TOKEN",refresh_token_expires_in:60480,scope:"SMS RCM Foo Boo",expireTime:(new Date).getTime()+36e5}),this},e.prototype.logout=function(){return this.apiCall("POST","/restapi/oauth/revoke",{}),this},e.prototype.presenceLoad=function(e){return this.apiCall("GET","/restapi/v1.0/account/~/extension/"+e+"/presence",{uri:"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/"+e+"/presence",extension:{uri:"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/"+e,id:e,extensionNumber:"101"},activeCalls:[],presenceStatus:"Available",telephonyStatus:"Ringing",userStatus:"Available",dndStatus:"TakeAllCalls",extensionId:e}),this},e.prototype.subscribeGeneric=function(e){e=e||54e3;var t=new Date;return this.apiCall("POST","/restapi/v1.0/subscription",{eventFilters:["/restapi/v1.0/account/~/extension/~/presence"],expirationTime:new Date(t.getTime()+1e3*e).toISOString(),expiresIn:e,deliveryMode:{transportType:"PubNub",encryption:!1,address:"123_foo",subscriberKey:"sub-c-foo",secretKey:"sec-c-bar"},id:"foo-bar-baz",creationTime:t.toISOString(),status:"Active",uri:"https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz"}),this},e.prototype.subscribeOnPresence=function(e,t){e=e||"1";var n=new Date;return this.apiCall("POST","/restapi/v1.0/subscription",{eventFilters:["/restapi/v1.0/account/~/extension/"+e+"/presence"+(t?"?detailedTelephonyState=true":"")],expirationTime:new Date(n.getTime()+54e6).toISOString(),deliveryMode:{transportType:"PubNub",encryption:!0,address:"123_foo",subscriberKey:"sub-c-foo",secretKey:"sec-c-bar",encryptionAlgorithm:"AES",encryptionKey:"VQwb6EVNcQPBhE/JgFZ2zw=="},creationTime:n.toISOString(),id:"foo-bar-baz",status:"Active",uri:"https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz"}),this},e.prototype.tokenRefresh=function(e){return e?this.apiCall("POST","/restapi/oauth/token",{message:"Wrong token",error_description:"Wrong token",description:"Wrong token"},400):this.apiCall("POST","/restapi/oauth/token",{access_token:"ACCESS_TOKEN_FROM_REFRESH",token_type:"bearer",expires_in:3600,refresh_token:"REFRESH_TOKEN_FROM_REFRESH",refresh_token_expires_in:60480,scope:"SMS RCM Foo Boo"}),this},e}();t["default"]=a,e.exports=t["default"]},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=n(15),s=r(i),a=n(2),u=n(14),c=function(){function e(t,n,r,i,s,a){o(this,e),this._method=t.toUpperCase(),this._path=n,this._json=r||{},this._delay=a||10,this._status=i||200,this._statusText=s||"OK"}return e.prototype.path=function(){return this._path},e.prototype.method=function(){return this._method},e.prototype.test=function(e){return e.url.indexOf(this._path)>-1&&e.method.toUpperCase()==this._method},e.prototype.getResponse=function(e){return regeneratorRuntime.async(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,regeneratorRuntime.awrap(a.delay(this._delay));case 2:return e.abrupt("return",this.createResponse(this._json));case 3:case"end":return e.stop()}},null,this)},e.prototype.createResponse=function(e,t){t=t||{},t.status=t.status||this._status,t.statusText=t.statusText||this._statusText;var n=JSON.stringify(e),r=u.createResponse(n,t);return r.headers.set(s["default"]._contentType,s["default"]._jsonContentType),r},e}();t["default"]=c,e.exports=t["default"]},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var s=function(){function e(e,t){for(var n=0;n-1?"&":"?"),n.addMethod&&(r+="_method="+n.addMethod),n.addToken&&(r+=(n.addMethod?"&":"")+"access_token="+this._auth.accessToken()),r},t.prototype.authUrl=function(e){return e=e||{},this.createUrl(t._authorizeEndpoint+"?"+h.queryStringify({response_type:"code",redirect_uri:e.redirectUri||"",client_id:this._appKey,state:e.state||"",brand_id:e.brandId||"",display:e.display||"",prompt:e.prompt||""}),{addServer:!0})},t.prototype.parseAuthRedirectUrl=function(e){var t=h.parseQueryString(e.split("?").reverse()[0]),n=t.error_description||t.error;if(n){var r=new Error(n);throw r.error=t.error,r}return t},t.prototype.loggedIn=function(){return regeneratorRuntime.async(function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,regeneratorRuntime.awrap(this._ensureAuthentication());case 3:return e.abrupt("return",!0);case 6:return e.prev=6,e.t0=e["catch"](0),e.abrupt("return",!1);case 9:case"end":return e.stop()}},null,this,[[0,6]])},t.prototype.login=function(e){var n,r,o;return regeneratorRuntime.async(function(i){for(;;)switch(i.prev=i.next){case 0:return i.prev=0,e=e||{},e.remember=e.remember||!1,this.emit(this.events.beforeLogin),n={access_token_ttl:t._accessTokenTtl,refresh_token_ttl:e.remember?t._refreshTokenTtlRemember:t._refreshTokenTtl},e.code?e.code&&(n.grant_type="authorization_code",n.code=e.code,n.redirect_uri=e.redirectUri):(n.grant_type="password",n.username=e.username,n.password=e.password,n.extension=e.extension||""),e.endpointId&&(n.endpoint_id=e.endpointId),i.next=9,regeneratorRuntime.awrap(this._tokenRequest(t._tokenEndpoint,n));case 9:return r=i.sent,o=r.json(),this._auth.setData(o).setRemember(e.remember),this.emit(this.events.loginSuccess,r),i.abrupt("return",r);case 16:throw i.prev=16,i.t0=i["catch"](0),this._cache.clean(),this.emit(this.events.loginError,i.t0),i.t0;case 21:case"end":return i.stop()}},null,this,[[0,16]])},t.prototype.refresh=function(){var e,n;return regeneratorRuntime.async(function(r){for(;;)switch(r.prev=r.next){case 0:if(r.prev=0,this.emit(this.events.beforeRefresh),!this._queue.isPaused()){r.next=9;break}return r.next=5,regeneratorRuntime.awrap(this._queue.poll());case 5:if(this._isAccessTokenValid()){r.next=7;break}throw new Error("Automatic authentification timeout");case 7:return this.emit(this.events.refreshSuccess,null),r.abrupt("return",null);case 9:return this._queue.pause(),r.next=12,regeneratorRuntime.awrap(h.delay(t._refreshDelayMs));case 12:if(this._auth.refreshToken()){r.next=14;break}throw new Error("Refresh token is missing");case 14:if(this._auth.refreshTokenValid()){r.next=16;break}throw new Error("Refresh token has expired");case 16:if(this._queue.isPaused()){r.next=18;break}throw new Error("Queue was resumed before refresh call");case 18:return r.next=20,regeneratorRuntime.awrap(this._tokenRequest(t._tokenEndpoint,{grant_type:"refresh_token",refresh_token:this._auth.refreshToken(),access_token_ttl:t._accessTokenTtl,refresh_token_ttl:this._auth.remember()?t._refreshTokenTtlRemember:t._refreshTokenTtl}));case 20:if(e=r.sent,n=e.json(),n.access_token){r.next=24;break}throw this._client.makeError(new Error("Malformed OAuth response"),e);case 24:return this._auth.setData(n),this._queue.resume(),this.emit(this.events.refreshSuccess,e),r.abrupt("return",e);case 30:throw r.prev=30,r.t0=r["catch"](0),r.t0=this._client.makeError(r.t0),t._clearCacheOnRefreshError&&this._cache.clean(),this.emit(this.events.refreshError,r.t0),r.t0;case 36:case"end":return r.stop()}},null,this,[[0,30]])},t.prototype.logout=function(){var e;return regeneratorRuntime.async(function(n){for(;;)switch(n.prev=n.next){case 0:return n.prev=0,this.emit(this.events.beforeLogout),this._queue.pause(),n.next=5,regeneratorRuntime.awrap(this._tokenRequest(t._revokeEndpoint,{token:this._auth.accessToken()}));case 5:return e=n.sent,this._queue.resume(),this._cache.clean(),this.emit(this.events.logoutSuccess,e),n.abrupt("return",e);case 12:throw n.prev=12,n.t0=n["catch"](0),this._queue.resume(),this.emit(this.events.logoutError,n.t0),n.t0;case 17:case"end":return n.stop()}},null,this,[[0,12]])},t.prototype.inflateRequest=function(e,t){return regeneratorRuntime.async(function(n){for(;;)switch(n.prev=n.next){case 0:if(t=t||{},!t.skipAuthCheck){n.next=3;break}return n.abrupt("return",e);case 3:return n.next=5,regeneratorRuntime.awrap(this._ensureAuthentication());case 5:return e.headers.set("Authorization",this._authHeader()),n.abrupt("return",e);case 7:case"end":return n.stop()}},null,this)},t.prototype.sendRequest=function(e,t){return regeneratorRuntime.async(function(n){for(;;)switch(n.prev=n.next){case 0:return n.prev=0,n.next=3,regeneratorRuntime.awrap(this.inflateRequest(e,t));case 3:return e=n.sent,n.next=6,regeneratorRuntime.awrap(this._client.sendRequest(e));case 6:return n.abrupt("return",n.sent);case 9:if(n.prev=9,n.t0=n["catch"](0),n.t0.apiResponse&&n.t0.apiResponse.response()&&401==n.t0.apiResponse.response().status){n.next=13;break}throw n.t0;case 13:return this._auth.cancelAccessToken(),n.next=16,regeneratorRuntime.awrap(this.sendRequest(e,t));case 16:return n.abrupt("return",n.sent);case 17:case"end":return n.stop()}},null,this,[[0,9]])},t.prototype.send=function(){var e=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];return regeneratorRuntime.async(function(t){for(;;)switch(t.prev=t.next){case 0:return e.url=this.createUrl(e.url,{addServer:!0}),t.next=3,regeneratorRuntime.awrap(this.sendRequest(this._client.createRequest(e),e));case 3:return t.abrupt("return",t.sent);case 4:case"end":return t.stop()}},null,this)},t.prototype.get=function(e,t,n){return regeneratorRuntime.async(function(r){for(;;)switch(r.prev=r.next){case 0:return n=n||{},n.method="GET",n.url=e,n.query=t,r.next=6,regeneratorRuntime.awrap(this.send(n));case 6:return r.abrupt("return",r.sent);case 7:case"end":return r.stop()}},null,this)},t.prototype.post=function(e,t,n,r){return regeneratorRuntime.async(function(o){for(;;)switch(o.prev=o.next){case 0:return r=r||{},r.method="POST",r.url=e,r.query=n,r.body=t,o.next=7,regeneratorRuntime.awrap(this.send(r));case 7:return o.abrupt("return",o.sent);case 8:case"end":return o.stop()}},null,this)},t.prototype.put=function(e,t,n,r){return regeneratorRuntime.async(function(o){for(;;)switch(o.prev=o.next){case 0:return r=r||{},r.method="PUT",r.url=e,r.query=n,r.body=t,o.next=7,regeneratorRuntime.awrap(this.send(r));case 7:return o.abrupt("return",o.sent);case 8:case"end":return o.stop()}},null,this)},t.prototype["delete"]=function(e,t,n){return regeneratorRuntime.async(function(r){for(;;)switch(r.prev=r.next){case 0:return n=n||{},n.method="DELETE",n.url=e,n.query=t,r.next=6,regeneratorRuntime.awrap(this.send(n));case 6:return r.abrupt("return",r.sent);case 7:case"end":return r.stop()}},null,this)},t.prototype._tokenRequest=function(e,t){return regeneratorRuntime.async(function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,regeneratorRuntime.awrap(this.send({url:e,skipAuthCheck:!0,body:t,method:"POST",headers:{Authorization:"Basic "+this._apiKey(),"Content-Type":"application/x-www-form-urlencoded"}}));case 2:return n.abrupt("return",n.sent);case 3:case"end":return n.stop()}},null,this)},t.prototype._ensureAuthentication=function(){return regeneratorRuntime.async(function(e){for(;;)switch(e.prev=e.next){case 0:if(!this._isAccessTokenValid()){e.next=2;break}return e.abrupt("return",null);case 2:return e.next=4,regeneratorRuntime.awrap(this.refresh());case 4:return e.abrupt("return",e.sent);case 5:case"end":return e.stop()}},null,this)},t.prototype._isAccessTokenValid=function(){return this._auth.accessTokenValid()&&!this._queue.isPaused()},t.prototype._apiKey=function(){var e=this._appKey+":"+this._appSecret;return"function"==typeof btoa?btoa(e):new Buffer(e).toString("base64")},t.prototype._authHeader=function(){var e=this._auth.accessToken();return this._auth.tokenType()+(e?" "+e:"")},t}(u["default"]);t["default"]=d,e.exports=t["default"]},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var o=function(){function e(e,t){for(var n=0;nDate.now()},e.prototype.refreshTokenValid=function(){return this.data().refresh_token_expire_time>Date.now()},e.prototype.cancelAccessToken=function(){return this.setData({access_token:"",expires_in:0})},e.prototype.forceAuthentication=function(){return this.setData({token_type:e.forcedTokenType,access_token:"",expires_in:0,refresh_token:"",refresh_token_expires_in:0}),this},e.prototype.setRemember=function(e){return this.setData({remember:e})},e.prototype.remember=function(){return!!this.data().remember},e}();t["default"]=o,e.exports=t["default"]},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=n(23),s=r(i),a=n(3),u=function(){function e(){o(this,e),this.crypto_obj=a.PUBNUB.crypto_obj}return e.prototype.init=function(e){return new s["default"](e)},e}();t["default"]=u,e.exports=t["default"]},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var s=n(12),a=r(s),u=n(3),c=function(e){function t(n){o(this,t),e.call(this),this.options=n,this.crypto_obj=u.PUBNUB.crypto_obj}return i(t,e),t.prototype.ready=function(){},t.prototype.subscribe=function(e){this.on("message-"+e.channel,e.message)},t.prototype.unsubscribe=function(e){this.off("message-"+e.channel)},t.prototype.receiveMessage=function(e,t){this.emit("message-"+t,e,"env",t)},t}(a["default"]);t["default"]=c,e.exports=t["default"]},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var s=function(){function e(e,t){for(var n=0;n=0;--r){var o=this.tryEntries[r],i=o.completion;if("root"===o.tryLoc)return t("end");if(o.tryLoc<=this.prev){var s=b.call(o,"catchLoc"),a=b.call(o,"finallyLoc");if(s&&a){if(this.prev=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&b.call(r,"finallyLoc")&&this.prev=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),p(n),S}},"catch":function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var o=r.arg;p(n)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:d(e),resultName:t,nextLoc:n},S}}}("object"==typeof t?t:"object"==typeof window?window:"object"==typeof self?self:this)}).call(t,function(){return this}())}])}); +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.SDK=t():(e.RingCentral=e.RingCentral||{},e.RingCentral.SDK=t())}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return e[r].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var n={};return t.m=e,t.c=n,t.p="/build/",t(0)}([function(e,t,n){e.exports=n(1)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function o(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t["default"]=e,t}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var s=function(){function e(e,t){for(var n=0;ne;e+=2){var t=re[e],n=re[e+1];t(n),re[e]=void 0,re[e+1]=void 0}Y=0}function b(){try{var e=n(!function(){var e=new Error('Cannot find module "vertx"');throw e.code="MODULE_NOT_FOUND",e}());return G=e.runOnLoop||e.runOnContext,p()}catch(t){return y()}}function m(){}function v(){return new TypeError("You cannot resolve a promise with itself")}function g(){return new TypeError("A promises callback cannot return that same promise.")}function w(e){try{return e.then}catch(t){return ue.error=t,ue}}function k(e,t,n,r){try{e.call(t,n,r)}catch(o){return o}}function E(e,t,n){Q(function(e){var r=!1,o=k(n,t,function(n){r||(r=!0,t!==n?O(e,n):R(e,n))},function(t){r||(r=!0,C(e,t))},"Settle: "+(e._label||" unknown promise"));!r&&o&&(r=!0,C(e,o))},e)}function x(e,t){t._state===ie?R(e,t._result):t._state===se?C(e,t._result):P(t,void 0,function(t){O(e,t)},function(t){C(e,t)})}function S(e,t){if(t.constructor===e.constructor)x(e,t);else{var n=w(t);n===ue?C(e,ue.error):void 0===n?R(e,t):u(n)?E(e,t,n):R(e,t)}}function O(e,t){e===t?C(e,v()):s(t)?S(e,t):R(e,t)}function T(e){e._onerror&&e._onerror(e._result),M(e)}function R(e,t){e._state===oe&&(e._result=t,e._state=ie,0!==e._subscribers.length&&Q(M,e))}function C(e,t){e._state===oe&&(e._state=se,e._result=t,Q(T,e))}function P(e,t,n,r){var o=e._subscribers,i=o.length;e._onerror=null,o[i]=t,o[i+ie]=n,o[i+se]=r,0===i&&e._state&&Q(M,e)}function M(e){var t=e._subscribers,n=e._state;if(0!==t.length){for(var r,o,i=e._result,s=0;ss;s++)P(r.resolve(e[s]),void 0,t,n);return o}function L(e){var t=this;if(e&&"object"==typeof e&&e.constructor===t)return e;var n=new t(m);return O(n,e),n}function U(e){var t=this,n=new t(m);return C(n,e),n}function q(){throw new TypeError("You must pass a resolver function as the first argument to the promise constructor")}function H(){throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.")}function K(e){this._id=de++,this._state=void 0,this._result=void 0,this._subscribers=[],m!==e&&(u(e)||q(),this instanceof K||H(),N(this,e))}function J(){var e;if("undefined"!=typeof o)e=o;else if("undefined"!=typeof self)e=self;else try{e=Function("return this")()}catch(t){throw new Error("polyfill failed because global object is unavailable in this environment")}var n=e.Promise;(!n||"[object Promise]"!==Object.prototype.toString.call(n.resolve())||n.cast)&&(e.Promise=ye)}var z;z=Array.isArray?Array.isArray:function(e){return"[object Array]"===Object.prototype.toString.call(e)};var G,V,W,X=z,Y=0,Q=({}.toString,c),$="undefined"!=typeof window?window:void 0,Z=$||{},ee=Z.MutationObserver||Z.WebKitMutationObserver,te="undefined"!=typeof process&&"[object process]"==={}.toString.call(process),ne="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel,re=new Array(1e3);W=te?f():ee?h():ne?d():void 0===$?b():y();var oe=void 0,ie=1,se=2,ue=new A,ae=new A;D.prototype._validateInput=function(e){return X(e)},D.prototype._validationError=function(){return new Error("Array Methods must be provided an Array")},D.prototype._init=function(){this._result=new Array(this.length)};var ce=D;D.prototype._enumerate=function(){for(var e=this,t=e.length,n=e.promise,r=e._input,o=0;n._state===oe&&t>o;o++)e._eachEntry(r[o],o)},D.prototype._eachEntry=function(e,t){var n=this,r=n._instanceConstructor;a(e)?e.constructor===r&&e._state!==oe?(e._onerror=null,n._settledAt(e._state,t,e._result)):n._willSettleAt(r.resolve(e),t):(n._remaining--,n._result[t]=e)},D.prototype._settledAt=function(e,t,n){var r=this,o=r.promise;o._state===oe&&(r._remaining--,e===se?C(o,n):r._result[t]=n),0===r._remaining&&R(o,r._result)},D.prototype._willSettleAt=function(e,t){var n=this;P(e,void 0,function(e){n._settledAt(ie,t,e)},function(e){n._settledAt(se,t,e)})};var le=F,fe=I,pe=L,he=U,de=0,ye=K;K.all=le,K.race=fe,K.resolve=pe,K.reject=he,K._setScheduler=l,K._asap=Q,K.prototype={constructor:K,then:function(e,t){var n=this,r=n._state;if(r===ie&&!e||r===se&&!t)return this;var o=new this.constructor(m),i=n._result;if(r){var s=arguments[r-1];Q(function(){B(r,o,s,i)})}else P(n,o,e,t);return o},"catch":function(e){return this.then(null,e)}};var _e=J,be={Promise:ye,polyfill:_e};n(8).amd?(r=function(){return be}.call(t,n,t,i),!(void 0!==r&&(i.exports=r))):"undefined"!=typeof i&&i.exports?i.exports=be:"undefined"!=typeof this&&(this.ES6Promise=be),_e()}).call(this)}).call(t,n(5).setImmediate,function(){return this}(),n(7)(e))},function(e,t,n){(function(e,r){function o(e,t){this._id=e,this._clearFn=t}var i=n(6).nextTick,s=Function.prototype.apply,u=Array.prototype.slice,a={},c=0;t.setTimeout=function(){return new o(s.call(setTimeout,window,arguments),clearTimeout)},t.setInterval=function(){return new o(s.call(setInterval,window,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e.close()},o.prototype.unref=o.prototype.ref=function(){},o.prototype.close=function(){this._clearFn.call(window,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout(function(){e._onTimeout&&e._onTimeout()},t))},t.setImmediate="function"==typeof e?e:function(e){var n=c++,r=arguments.length<2?!1:u.call(arguments,1);return a[n]=!0,i(function(){a[n]&&(r?e.apply(null,r):e.call(null),t.clearImmediate(n))}),n},t.clearImmediate="function"==typeof r?r:function(e){delete a[e]}}).call(t,n(5).setImmediate,n(5).clearImmediate)},function(e,t){function n(){c=!1,s.length?a=s.concat(a):l=-1,a.length&&r()}function r(){if(!c){var e=setTimeout(n);c=!0;for(var t=a.length;t;){for(s=a,a=[];++l1)for(var n=1;n-1?t:e}function c(e,t){t=t||{};var r=t.body;if(c.prototype.isPrototypeOf(e)){if(e.bodyUsed)throw new TypeError("Already read");this.url=e.url,this.credentials=e.credentials,t.headers||(this.headers=new n(e.headers)),this.method=e.method,this.mode=e.mode,r||(r=e._bodyInit,e.bodyUsed=!0)}else this.url=e;if(this.credentials=t.credentials||this.credentials||"omit",(t.headers||!this.headers)&&(this.headers=new n(t.headers)),this.method=a(t.method||this.method||"GET"),this.mode=t.mode||this.mode||null,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&r)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(r)}function l(e){var t=new FormData;return e.trim().split("&").forEach(function(e){if(e){var n=e.split("="),r=n.shift().replace(/\+/g," "),o=n.join("=").replace(/\+/g," ");t.append(decodeURIComponent(r),decodeURIComponent(o))}}),t}function f(e){var t=new n,r=e.getAllResponseHeaders().trim().split("\n");return r.forEach(function(e){var n=e.trim().split(":"),r=n.shift().trim(),o=n.join(":").trim();t.append(r,o)}),t}function p(e,t){t||(t={}),this._initBody(e),this.type="default",this.url=null,this.status=t.status,this.ok=this.status>=200&&this.status<300,this.statusText=t.statusText,this.headers=t.headers instanceof n?t.headers:new n(t.headers),this.url=t.url||""}if(!self.fetch){n.prototype.append=function(n,r){n=e(n),r=t(r);var o=this.map[n];o||(o=[],this.map[n]=o),o.push(r)},n.prototype["delete"]=function(t){delete this.map[e(t)]},n.prototype.get=function(t){var n=this.map[e(t)];return n?n[0]:null},n.prototype.getAll=function(t){return this.map[e(t)]||[]},n.prototype.has=function(t){return this.map.hasOwnProperty(e(t))},n.prototype.set=function(n,r){this.map[e(n)]=[t(r)]},n.prototype.forEach=function(e,t){Object.getOwnPropertyNames(this.map).forEach(function(n){this.map[n].forEach(function(r){e.call(t,r,n,this)},this)},this)};var h={blob:"FileReader"in self&&"Blob"in self&&function(){try{return new Blob,!0}catch(e){return!1}}(),formData:"FormData"in self},d=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];u.call(c.prototype),u.call(p.prototype),self.Headers=n,self.Request=c,self.Response=p,self.fetch=function(e,t){var n;return n=c.prototype.isPrototypeOf(e)&&!t?e:new c(e,t),new Promise(function(e,t){function r(){return"responseURL"in o?o.responseURL:/^X-Request-URL:/m.test(o.getAllResponseHeaders())?o.getResponseHeader("X-Request-URL"):void 0}var o=new XMLHttpRequest;o.onload=function(){var n=1223===o.status?204:o.status;if(100>n||n>599)return void t(new TypeError("Network request failed"));var i={status:n,statusText:o.statusText,headers:f(o),url:r()},s="response"in o?o.response:o.responseText;e(new p(s,i))},o.onerror=function(){t(new TypeError("Network request failed"))},o.open(n.method,n.url,!0),"include"===n.credentials&&(o.withCredentials=!0),"responseType"in o&&h.blob&&(o.responseType="blob"),n.headers.forEach(function(e,t){o.setRequestHeader(t,e)}),o.send("undefined"==typeof n._bodyInit?null:n._bodyInit)})},self.fetch.polyfill=!0}}()},function(module,exports,__webpack_require__){(function(module){function unique(){return"x"+ ++NOW+ +new Date}function rnow(){return+new Date}function build_url(e,t){var n=e.join(URLBIT),r=[];return t?(each(t,function(e,t){var n="object"==typeof t?JSON.stringify(t):t;"undefined"!=typeof t&&null!=t&&encode(n).length>0&&r.push(e+"="+encode(n))}),n+="?"+r.join(PARAMSBIT)):n}function updater(e,t){var n,r=0,o=function(){r+t>rnow()?(clearTimeout(n),n=setTimeout(o,t)):(r=rnow(),e())};return o}function grep(e,t){var n=[];return each(e||[],function(e){t(e)&&n.push(e)}),n}function supplant(e,t){return e.replace(REPL,function(e,n){return t[n]||e})}function timeout(e,t){return setTimeout(e,t)}function generate_uuid(e){var t="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){var t=16*Math.random()|0,n="x"==e?t:3&t|8;return n.toString(16)});return e&&e(t),t}function isArray(e){return!!e&&"string"!=typeof e&&(Array.isArray&&Array.isArray(e)||"number"==typeof e.length)}function each(e,t){if(e&&t)if(isArray(e))for(var n=0,r=e.length;r>n;)t.call(e[n],e[n],n++);else for(var n in e)e.hasOwnProperty&&e.hasOwnProperty(n)&&t.call(e[n],n,e[n])}function map(e,t){var n=[];return each(e||[],function(e,r){n.push(t(e,r))}),n}function pam_encode(e){return encodeURIComponent(e).replace(/[!'()*~]/g,function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})}function encode(e){return encodeURIComponent(e)}function generate_channel_list(e,t){var n=[];return each(e,function(e,r){t?e.search("-pnpres")<0&&r.subscribed&&n.push(e):r.subscribed&&n.push(e)}),n.sort()}function generate_channel_group_list(e,t){var n=[];return each(e,function(e,r){t?e.search("-pnpres")<0&&r.subscribed&&n.push(e):r.subscribed&&n.push(e)}),n.sort()}function ready(){timeout(function(){READY||(READY=1,each(READY_BUFFER,function(e){e()}))},SECOND)}function PNmessage(e){return msg=e||{apns:{}},msg.getPubnubMessage=function(){var e={};if(Object.keys(msg.apns).length){e.pn_apns={aps:{alert:msg.apns.alert,badge:msg.apns.badge}};for(var t in msg.apns)e.pn_apns[t]=msg.apns[t];var n=["badge","alert"];for(var t in n)delete e.pn_apns[n[t]]}msg.gcm&&(e.pn_gcm={data:msg.gcm});for(var t in msg)e[t]=msg[t];var r=["apns","gcm","publish","channel","callback","error"];for(var t in r)delete e[r[t]];return e},msg.publish=function(){var e=msg.getPubnubMessage();msg.pubnub&&msg.channel&&msg.pubnub.publish({message:e,channel:msg.channel,callback:msg.callback,error:msg.error})},msg}function PN_API(e){function t(e){return e||(e={}),each(ie,function(t,n){t in e||(e[t]=n)}),e}function r(e){var t=[];return each(e,function(e,n){t.push(e)}),t}function o(e){return r(e).sort()}function i(e){var t="",n=o(e);for(var r in n){var i=n[r];t+=i+"="+pam_encode(e[i]),r!=n.length-1&&(t+="&")}return t}function s(e,t,n){var r=!1;if("undefined"==typeof e)return t;if("number"==typeof e)r=e>PRESENCE_HB_THRESHOLD||0==e?!1:!0;else{if("boolean"==typeof e)return e?PRESENCE_HB_DEFAULT:0;r=!0}return r?(n&&n("Presence Heartbeat value invalid. Valid range ( x > "+PRESENCE_HB_THRESHOLD+" or x = 0). Current Value : "+(t||PRESENCE_HB_THRESHOLD)),t||PRESENCE_HB_THRESHOLD):e}function u(e,t){return be.encrypt(e,t||le)||e}function a(e,t){return be.decrypt(e,t||le)||be.decrypt(e,le)||e}function c(){return clearTimeout($),!ee||ee>=500||1>ee||!generate_channel_list(X,!0).length&&!generate_channel_group_list(Y,!0).length?void(te=!1):(te=!0,void me.presence_heartbeat({callback:function(e){$=timeout(c,ee*SECOND)},error:function(e){se&&se("Presence Heartbeat unable to reach Pubnub servers."+JSON.stringify(e)),$=timeout(c,ee*SECOND)}}))}function l(){!te&&c()}function f(e){if(ne){if(!U.length)return}else{if(e&&(U.sending=0),U.sending||!U.length)return;U.sending=1}oe(U.shift())}function p(e){var t=0;return each(generate_channel_group_list(Y),function(n){var r=Y[n];r&&(t++,(e||function(){})(r))}),t}function h(e){var t=0;return each(generate_channel_list(X),function(n){var r=X[n];r&&(t++,(e||function(){})(r))}),t}function d(e,t,n){if("object"==typeof e){if(e.error){var r={};return e.message&&(r.message=e.message),e.payload&&(r.payload=e.payload),void(n&&n(r))}if(e.payload)return void(e.next_page?t&&t(e.payload,e.next_page):t&&t(e.payload))}t&&t(e)}function y(e,t){if("object"==typeof e&&e.error){var n={};return e.message&&(n.message=e.message),e.payload&&(n.payload=e.payload),void(t&&t(n))}t&&t(e)}function _(e,n,r,o){var n=e.callback||n,i=e.error||se,s=ae();o=o||{},o.auth||(o.auth=e.auth_key||A);var u=[F,"v1","channel-registration","sub-key",M];u.push.apply(u,r),s&&(o.callback=s),oe({callback:s,data:t(o),success:function(e){d(e,n,i)},fail:function(e){y(e,i)},url:u})}function b(){ue()||v(1,{error:"Offline. Please check your network settings. "}),E&&clearTimeout(E),E=timeout(b,SECOND)}function m(){R&&me.time(function(e){w(function(){},e),e||v(1,{error:"Heartbeat failed to connect to Pubnub Servers.Please check your network settings."}),x&&clearTimeout(x),x=timeout(m,T)})}function v(e,t){z&&z(e,t),z=null,clearTimeout(E),clearTimeout(x)}function g(e){var t=rnow()-H;return t-e/1e4}function w(e,t){function n(t){if(t){var n=t/1e4,o=(rnow()-r)/2;H=rnow()-(n+o),e&&e(H)}}var r=rnow();t&&n(t)||me.time(n)}var E,x,S=+e.windowing||DEF_WINDOWING,O=(+e.timeout||DEF_SUB_TIMEOUT)*SECOND,T=(+e.keepalive||DEF_KEEPALIVE)*SECOND,R=e.timecheck||0,C=e.noleave||0,P=e.publish_key,M=e.subscribe_key,A=e.auth_key||"",j=e.secret_key||"",B=e.hmac_SHA256,N=e.ssl?"s":"",D="http"+N+"://"+(e.origin||"pubsub.pubnub.com"),F=nextorigin(D),I=nextorigin(D),L=function(){},U=[],q=!0,H=0,K=0,J=0,z=0,G=e.restore||0,V=0,W=!1,X={},Y={},Q={},$=null,Z=s(e.heartbeat||e.pnexpires||0,e.error),ee=e.heartbeat_interval||Z/2-1,te=!1,ne=e.no_wait_for_pending,re=e["compatible_3.5"]||!1,oe=e.xdr,ie=e.params||{},se=e.error||function(){},ue=e._is_online||function(){return 1},ae=e.jsonp_cb||function(){return 0},ce=e.db||{get:function(){},set:function(){}},le=e.cipher_key,fe=e.uuid||!e.unique_uuid&&ce&&ce.get(M+"uuid")||"",pe=e.instance_id||!1,he="",de=e.shutdown,ye="undefined"!=typeof e.use_send_beacon?e.use_send_beacon:!0,_e=ye?e.sendBeacon:null;2===Z&&(ee=1);var be=e.crypto_obj||{encrypt:function(e,t){return e},decrypt:function(e,t){return e}},me={LEAVE:function(e,n,r,o,i){var s,u={uuid:fe,auth:r||A},a=nextorigin(D),o=o||function(){},c=i||function(){},l=ae();if(e.indexOf(PRESENCE_SUFFIX)>0)return!0;if(re){if(!N)return!1;if("0"==l)return!1}return C?!1:("0"!=l&&(u.callback=l),pe&&(u.instanceid=he),s=[a,"v2","presence","sub_key",M,"channel",encode(e),"leave"],ie=t(u),_e&&(url_string=build_url(s,ie),_e(url_string))?(o&&o({status:200,action:"leave",message:"OK",service:"Presence"}),!0):(oe({blocking:n||N,timeout:2e3,callback:l,data:ie,success:function(e){d(e,o,c)},fail:function(e){y(e,c)},url:s}),!0))},LEAVE_GROUP:function(e,n,r,o,i){var s={uuid:fe,auth:r||A},u=nextorigin(D),o=o||function(){},a=i||function(){},c=ae();if(e.indexOf(PRESENCE_SUFFIX)>0)return!0;if(re){if(!N)return!1;if("0"==c)return!1}return C?!1:("0"!=c&&(s.callback=c),e&&e.length>0&&(s["channel-group"]=e),pe&&(s.instanceid=he),oe({blocking:n||N,timeout:5e3,callback:c,data:t(s),success:function(e){d(e,o,a)},fail:function(e){y(e,a)},url:[u,"v2","presence","sub_key",M,"channel",encode(","),"leave"]}),!0)},set_resumed:function(e){W=e},get_cipher_key:function(){return le},set_cipher_key:function(e){le=e},raw_encrypt:function(e,t){return u(e,t)},raw_decrypt:function(e,t){return a(e,t)},get_heartbeat:function(){return Z},set_heartbeat:function(e,t){Z=s(e,Z,se),ee=t||Z/2-1,2==Z&&(ee=1),L(),c()},get_heartbeat_interval:function(){return ee},set_heartbeat_interval:function(e){ee=e,c()},get_version:function(){return SDK_VER},getGcmMessageObject:function(e){return{data:e}},getApnsMessageObject:function(e){var t={aps:{badge:1,alert:""}};for(k in e)k[t]=e[k];return t},newPnMessage:function(){var e={};gcm&&(e.pn_gcm=gcm),apns&&(e.pn_apns=apns);for(k in n)e[k]=n[k];return e},_add_param:function(e,t){ie[e]=t},channel_group:function(e,t){var n,r,o=e.channel_group,t=t||e.callback,i=e.channels||e.channel,s=e.cloak,u=[],a={},c=e.mode||"add";if(o){var l=o.split(":");l.length>1?(n="*"===l[0]?null:l[0],r=l[1]):r=l[0]}n&&u.push("namespace")&&u.push(encode(n)),u.push("channel-group"),r&&"*"!==r&&u.push(r),i?(isArray(i)&&(i=i.join(",")),a[c]=i,a.cloak=q?"true":"false"):"remove"===c&&u.push("remove"),"undefined"!=typeof s&&(a.cloak=s?"true":"false"),_(e,t,u,a)},channel_group_list_groups:function(e,t){var n;n=e.namespace||e.ns||e.channel_group||null,n&&(e.channel_group=n+":*"),me.channel_group(e,t)},channel_group_list_channels:function(e,t){return e.channel_group?void me.channel_group(e,t):se("Missing Channel Group")},channel_group_remove_channel:function(e,t){return e.channel_group?e.channel||e.channels?(e.mode="remove",void me.channel_group(e,t)):se("Missing Channel"):se("Missing Channel Group")},channel_group_remove_group:function(e,t){return e.channel_group?e.channel?se("Use channel_group_remove_channel if you want to remove a channel from a group."):(e.mode="remove",void me.channel_group(e,t)):se("Missing Channel Group")},channel_group_add_channel:function(e,t){return e.channel_group?e.channel||e.channels?void me.channel_group(e,t):se("Missing Channel"):se("Missing Channel Group")},channel_group_cloak:function(e,t){return"undefined"==typeof e.cloak?void t(q):(q=e.cloak,void me.channel_group(e,t))},channel_group_list_namespaces:function(e,t){var n=["namespace"];_(e,t,n)},channel_group_remove_namespace:function(e,t){var n=["namespace",e.namespace,"remove"];_(e,t,n)},history:function(e,n){var n=e.callback||n,r=e.count||e.limit||100,o=e.reverse||"false",i=e.error||function(){},s=e.auth_key||A,u=e.cipher_key,c=e.channel,l=e.channel_group,f=e.start,p=e.end,h=e.include_token,d=e.string_message_token||!1,_={},b=ae();return c||l?n?M?(_.stringtoken="true",_.count=r,_.reverse=o,_.auth=s,l&&(_["channel-group"]=l,c||(c=",")),b&&(_.callback=b),f&&(_.start=f),p&&(_.end=p),h&&(_.include_token="true"),d&&(_.string_message_token="true"),void oe({callback:b,data:t(_),success:function(e){if("object"==typeof e&&e.error)return void i({message:e.message,payload:e.payload});for(var t=e[0],r=[],o=0;o2&&(s.state=JSON.stringify(Q)),Z&&(s.heartbeat=Z),pe&&(s.instanceid=he),l(),z=oe({timeout:E,callback:e,fail:function(e){e&&e.error&&e.service?(y(e,d),r(1)):me.time(function(t){!t&&y(e,d),r(t)})},data:t(s),url:[I,"subscribe",M,encode(n),e,V],success:function(e){if(!e||"object"==typeof e&&"error"in e&&e.error)return d(e.error),timeout(L,SECOND);if(_(e[1]),V=!V&&G&&ce.get(M)||e[1],h(function(e){e.connected||(e.connected=1,e.connect(e.name))}),p(function(e){e.connected||(e.connected=1,e.connect(e.name))}),W&&!G)return V=0,W=!1,ce.set(M,0),void timeout(o,x);w&&(V=1e4,w=0),ce.set(M,e[1]);var t=function(){var t="",n="";e.length>3?(t=e[3],n=e[2]):t=e.length>2?e[2]:map(generate_channel_list(X),function(t){return map(Array(e[0].length).join(",").split(","),function(){return t})}).join(",");var r=t.split(","),o=n?n.split(","):[];return function(){var e=r.shift()||J,t=o.shift(),n={};t?(e&&e.indexOf("-pnpres")>=0&&t.indexOf("-pnpres")<0&&(t+="-pnpres"),n=Y[t]||X[t]||{callback:function(){}}):n=X[e];var i=[n.callback||K,e.split(PRESENCE_SUFFIX)[0]]; +return t&&i.push(t.split(PRESENCE_SUFFIX)[0]),i}}(),n=g(+e[1]);each(e[0],function(r){var o=t(),i=a(r,X[o[1]]?X[o[1]].cipher_key:null);o[0]&&o[0](i,e,o[2]||o[1],n,o[1])}),timeout(o,x)}})}}var i=e.channel,s=e.channel_group,n=n||e.callback,n=n||e.message,u=e.connect||function(){},c=e.reconnect||function(){},f=e.disconnect||function(){},d=e.error||d||function(){},_=e.idle||function(){},b=e.presence||0,m=e.noheresync||0,w=e.backfill||0,k=e.timetoken||0,E=e.timeout||O,x=e.windowing||S,T=e.state,R=e.heartbeat||e.pnexpires,C=e.heartbeat_interval,P=e.restore||G;return A=e.auth_key||A,G=P,V=k,i||s?n?M?((R||0===R||C||0===C)&&me.set_heartbeat(R,C),i&&each((i.join?i.join(","):""+i).split(","),function(r){var o=X[r]||{};X[J=r]={name:r,connected:o.connected,disconnected:o.disconnected,subscribed:1,callback:K=n,cipher_key:e.cipher_key,connect:u,disconnect:f,reconnect:c},T&&(r in T?Q[r]=T[r]:Q[r]=T),b&&(me.subscribe({channel:r+PRESENCE_SUFFIX,callback:b,restore:P}),o.subscribed||m||me.here_now({channel:r,data:t({uuid:fe,auth:A}),callback:function(e){each("uuids"in e?e.uuids:[],function(t){b({action:"join",uuid:t,timestamp:Math.floor(rnow()/1e3),occupancy:e.occupancy||1},e,r)})}}))}),s&&each((s.join?s.join(","):""+s).split(","),function(r){var o=Y[r]||{};Y[r]={name:r,connected:o.connected,disconnected:o.disconnected,subscribed:1,callback:K=n,cipher_key:e.cipher_key,connect:u,disconnect:f,reconnect:c},b&&(me.subscribe({channel_group:r+PRESENCE_SUFFIX,callback:b,restore:P,auth_key:A}),o.subscribed||m||me.here_now({channel_group:r,data:t({uuid:fe,auth:A}),callback:function(e){each("uuids"in e?e.uuids:[],function(t){b({action:"join",uuid:t,timestamp:Math.floor(rnow()/1e3),occupancy:e.occupancy||1},e,r)})}}))}),L=function(){v(),timeout(o,x)},READY?void L():READY_BUFFER.push(L)):se("Missing Subscribe Key"):se("Missing Callback"):se("Missing Channel")},here_now:function(e,n){var n=e.callback||n,r=e.error||function(){},o=e.auth_key||A,i=e.channel,s=e.channel_group,u=ae(),a="uuids"in e?e.uuids:!0,c=e.state,l={uuid:fe,auth:o};if(a||(l.disable_uuids=1),c&&(l.state=1),!n)return se("Missing Callback");if(!M)return se("Missing Subscribe Key");var f=[F,"v2","presence","sub_key",M];i&&f.push("channel")&&f.push(encode(i)),"0"!=u&&(l.callback=u),s&&(l["channel-group"]=s,!i&&f.push("channel")&&f.push(",")),pe&&(l.instanceid=he),oe({callback:u,data:t(l),success:function(e){d(e,n,r)},fail:function(e){y(e,r)},url:f})},where_now:function(e,n){var n=e.callback||n,r=e.error||function(){},o=e.auth_key||A,i=ae(),s=e.uuid||fe,u={auth:o};return n?M?("0"!=i&&(u.callback=i),pe&&(u.instanceid=he),void oe({callback:i,data:t(u),success:function(e){d(e,n,r)},fail:function(e){y(e,r)},url:[F,"v2","presence","sub_key",M,"uuid",encode(s)]})):se("Missing Subscribe Key"):se("Missing Callback")},state:function(e,n){var r,n=e.callback||n||function(e){},o=e.error||function(){},i=e.auth_key||A,s=ae(),u=e.state,a=e.uuid||fe,c=e.channel,l=e.channel_group,f=t({auth:i});return M?a?c||l?("0"!=s&&(f.callback=s),"undefined"!=typeof c&&X[c]&&X[c].subscribed&&u&&(Q[c]=u),"undefined"!=typeof l&&Y[l]&&Y[l].subscribed&&(u&&(Q[l]=u),f["channel-group"]=l,c||(c=",")),f.state=JSON.stringify(u),pe&&(f.instanceid=he),r=u?[F,"v2","presence","sub-key",M,"channel",c,"uuid",a,"data"]:[F,"v2","presence","sub-key",M,"channel",c,"uuid",encode(a)],void oe({callback:s,data:t(f),success:function(e){d(e,n,o)},fail:function(e){y(e,o)},url:r})):se("Missing Channel"):se("Missing UUID"):se("Missing Subscribe Key")},grant:function(e,n){var n=e.callback||n,r=e.error||function(){},o=e.channel||e.channels,s=e.channel_group,u=ae(),a=e.ttl,c=e.read?"1":"0",l=e.write?"1":"0",f=e.manage?"1":"0",p=e.auth_key||e.auth_keys;if(!n)return se("Missing Callback");if(!M)return se("Missing Subscribe Key");if(!P)return se("Missing Publish Key");if(!j)return se("Missing Secret Key");var h=Math.floor((new Date).getTime()/1e3),_=M+"\n"+P+"\ngrant\n",b={w:l,r:c,timestamp:h};e.manage&&(b.m=f),isArray(o)&&(o=o.join(",")),isArray(p)&&(p=p.join(",")),"undefined"!=typeof o&&null!=o&&o.length>0&&(b.channel=o),"undefined"!=typeof s&&null!=s&&s.length>0&&(b["channel-group"]=s),"0"!=u&&(b.callback=u),(a||0===a)&&(b.ttl=a),p&&(b.auth=p),b=t(b),p||delete b.auth,_+=i(b);var m=B(_,j);m=m.replace(/\+/g,"-"),m=m.replace(/\//g,"_"),b.signature=m,oe({callback:u,data:b,success:function(e){d(e,n,r)},fail:function(e){y(e,r)},url:[F,"v1","auth","grant","sub-key",M]})},mobile_gw_provision:function(e){var t,n,r=e.callback||function(){},o=e.auth_key||A,i=e.error||function(){},s=ae(),u=e.channel,a=e.op,c=e.gw_type,l=e.device_id;return l?c?a?u?P?M?(n=[F,"v1/push/sub-key",M,"devices",l],t={uuid:fe,auth:o,type:c},"add"==a?t.add=u:"remove"==a&&(t.remove=u),pe&&(data.instanceid=he),void oe({callback:s,data:t,success:function(e){d(e,r,i)},fail:function(e){y(e,i)},url:n})):se("Missing Subscribe Key"):se("Missing Publish Key"):se("Missing gw destination Channel (channel)"):se("Missing GW Operation (op: add or remove)"):se("Missing GW Type (gw_type: gcm or apns)"):se("Missing Device ID (device_id)")},audit:function(e,n){var n=e.callback||n,r=e.error||function(){},o=e.channel,s=e.channel_group,u=e.auth_key,a=ae();if(!n)return se("Missing Callback");if(!M)return se("Missing Subscribe Key");if(!P)return se("Missing Publish Key");if(!j)return se("Missing Secret Key");var c=Math.floor((new Date).getTime()/1e3),l=M+"\n"+P+"\naudit\n",f={timestamp:c};"0"!=a&&(f.callback=a),"undefined"!=typeof o&&null!=o&&o.length>0&&(f.channel=o),"undefined"!=typeof s&&null!=s&&s.length>0&&(f["channel-group"]=s),u&&(f.auth=u),f=t(f),u||delete f.auth,l+=i(f);var p=B(l,j);p=p.replace(/\+/g,"-"),p=p.replace(/\//g,"_"),f.signature=p,oe({callback:a,data:f,success:function(e){d(e,n,r)},fail:function(e){y(e,r)},url:[F,"v1","auth","audit","sub-key",M]})},revoke:function(e,t){e.read=!1,e.write=!1,me.grant(e,t)},set_uuid:function(e){fe=e,L()},get_uuid:function(){return fe},isArray:function(e){return isArray(e)},get_subscibed_channels:function(){return generate_channel_list(X,!0)},presence_heartbeat:function(e){var n=e.callback||function(){},r=e.error||function(){},o=ae(),i={uuid:fe,auth:A},s=JSON.stringify(Q);s.length>2&&(i.state=JSON.stringify(Q)),Z>0&&320>Z&&(i.heartbeat=Z),"0"!=o&&(i.callback=o);var u=encode(generate_channel_list(X,!0).join(",")),a=generate_channel_group_list(Y,!0).join(",");u||(u=","),a&&(i["channel-group"]=a),pe&&(i.instanceid=he),oe({callback:o,data:t(i),timeout:5*SECOND,url:[F,"v2","presence","sub-key",M,"channel",u,"heartbeat"],success:function(e){d(e,n,r)},fail:function(e){y(e,r)}})},stop_timers:function(){clearTimeout(E),clearTimeout(x),clearTimeout($)},shutdown:function(){me.stop_timers(),de&&de()},xdr:oe,ready:ready,db:ce,uuid:generate_uuid,map:map,each:each,"each-channel":h,grep:grep,offline:function(){v(1,{message:"Offline. Please check your network settings."})},supplant:supplant,now:rnow,unique:unique,updater:updater};return fe||(fe=me.uuid()),he||(he=me.uuid()),ce.set(M+"uuid",fe),E=timeout(b,SECOND),x=timeout(m,T),$=timeout(l,(ee-3)*SECOND),w(),me}function crypto_obj(){function e(e){return CryptoJS.SHA256(e).toString(CryptoJS.enc.Hex)}function t(e){return e=e||{},e.hasOwnProperty("encryptKey")||(e.encryptKey=l.encryptKey),e.hasOwnProperty("keyEncoding")||(e.keyEncoding=l.keyEncoding),e.hasOwnProperty("keyLength")||(e.keyLength=l.keyLength),e.hasOwnProperty("mode")||(e.mode=l.mode),-1==u.indexOf(e.keyEncoding.toLowerCase())&&(e.keyEncoding=l.keyEncoding),-1==a.indexOf(parseInt(e.keyLength,10))&&(e.keyLength=l.keyLength),-1==c.indexOf(e.mode.toLowerCase())&&(e.mode=l.mode),e}function n(e,t){return"base64"==t.keyEncoding?CryptoJS.enc.Base64.parse(e):"hex"==t.keyEncoding?CryptoJS.enc.Hex.parse(e):e}function r(t,r){return t=n(t,r),r.encryptKey?CryptoJS.enc.Utf8.parse(e(t).slice(0,32)):t}function o(e){return"ecb"==e.mode?CryptoJS.mode.ECB:CryptoJS.mode.CBC}function i(e){return"cbc"==e.mode?CryptoJS.enc.Utf8.parse(s):null}var s="0123456789012345",u=["hex","utf8","base64","binary"],a=[128,256],c=["ecb","cbc"],l={encryptKey:!0,keyEncoding:"utf8",keyLength:256,mode:"cbc"};return{encrypt:function(e,n,s){if(!n)return e;s=t(s);var u=i(s),a=o(s),c=r(n,s),l=JSON.stringify(e),f=CryptoJS.AES.encrypt(l,c,{iv:u,mode:a}).ciphertext,p=f.toString(CryptoJS.enc.Base64);return p||e},decrypt:function(e,n,s){if(!n)return e;s=t(s);var u=i(s),a=o(s),c=r(n,s);try{var l=CryptoJS.enc.Base64.parse(e),f=CryptoJS.AES.decrypt({ciphertext:l},c,{iv:u,mode:a}).toString(CryptoJS.enc.Utf8),p=JSON.parse(f);return p}catch(h){return void 0}}}}window.JSON&&window.JSON.stringify||function(){function toJSON(e){try{return this.valueOf()}catch(t){return null}}function quote(e){return escapable.lastIndex=0,escapable.test(e)?'"'+e.replace(escapable,function(e){var t=meta[e];return"string"==typeof t?t:"\\u"+("0000"+e.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+e+'"'}function str(e,t){var n,r,o,i,s,u=gap,a=t[e];switch(a&&"object"==typeof a&&(a=toJSON.call(a,e)),"function"==typeof rep&&(a=rep.call(t,e,a)),typeof a){case"string":return quote(a);case"number":return isFinite(a)?String(a):"null";case"boolean":case"null":return String(a);case"object":if(!a)return"null";if(gap+=indent,s=[],"[object Array]"===Object.prototype.toString.apply(a)){for(i=a.length,n=0;i>n;n+=1)s[n]=str(n,a)||"null";return o=0===s.length?"[]":gap?"[\n"+gap+s.join(",\n"+gap)+"\n"+u+"]":"["+s.join(",")+"]",gap=u,o}if(rep&&"object"==typeof rep)for(i=rep.length,n=0;i>n;n+=1)r=rep[n],"string"==typeof r&&(o=str(r,a),o&&s.push(quote(r)+(gap?": ":":")+o));else for(r in a)Object.hasOwnProperty.call(a,r)&&(o=str(r,a),o&&s.push(quote(r)+(gap?": ":":")+o));return o=0===s.length?"{}":gap?"{\n"+gap+s.join(",\n"+gap)+"\n"+u+"}":"{"+s.join(",")+"}",gap=u,o}}window.JSON||(window.JSON={});var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={"\b":"\\b"," ":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},rep;"function"!=typeof JSON.stringify&&(JSON.stringify=function(e,t,n){var r;if(gap="",indent="","number"==typeof n)for(r=0;n>r;r+=1)indent+=" ";else"string"==typeof n&&(indent=n);if(rep=t,t&&"function"!=typeof t&&("object"!=typeof t||"number"!=typeof t.length))throw new Error("JSON.stringify");return str("",{"":e})}),"function"!=typeof JSON.parse&&(JSON.parse=function(text){return eval("("+text+")")})}();var NOW=1,READY=!1,READY_BUFFER=[],PRESENCE_SUFFIX="-pnpres",DEF_WINDOWING=10,DEF_TIMEOUT=1e4,DEF_SUB_TIMEOUT=310,DEF_KEEPALIVE=60,SECOND=1e3,URLBIT="/",PARAMSBIT="&",PRESENCE_HB_THRESHOLD=5,PRESENCE_HB_DEFAULT=30,SDK_VER="3.7.14",REPL=/{([\w\-]+)}/g,nextorigin=function(){var e=20,t=Math.floor(Math.random()*e);return function(n,r){return n.indexOf("pubsub.")>0&&n.replace("pubsub","ps"+(r?generate_uuid().split("-")[0]:++t0&&"number"==typeof t[n]?"px":"")}catch(r){}}function a(e){return document.createElement(e)}function c(){return v||d()?0:unique()}function l(e){if(v||d())return f(e);var n=a("script"),r=e.callback,o=unique(),u=0,c=e.timeout||DEF_TIMEOUT,l=timeout(function(){m(1,{message:"timeout"})},c),p=e.fail||function(){},h=e.data||{},y=e.success||function(){},b=function(){i().appendChild(n)},m=function(e,r){u||(u=1,n.onerror=null,clearTimeout(l),e||!r||y(r),timeout(function(){e&&p();var n=t(o),r=n&&n.parentNode;r&&r.removeChild(n)},SECOND))};return window[r]=function(e){m(0,e)},e.blocking||(n[_]=_),n.onerror=function(){m(1)},n.src=build_url(e.url,h),s(n,"id",o),b(),m}function f(e){var t,n,r=function(){if(!i){i=1,clearTimeout(u);try{n=JSON.parse(t.responseText)}catch(e){return h(1)}o=1,f(n)}},o=0,i=0,s=e.timeout||DEF_TIMEOUT,u=timeout(function(){h(1,{message:"timeout"})},s),a=e.fail||function(){},c=e.data||{},f=e.success||function(){},p=!e.blocking,h=function(e,n){o||(o=1,clearTimeout(u),t&&(t.onerror=t.onload=null,t.abort&&t.abort(),t=null),e&&a(n))};try{t=d()||window.XDomainRequest&&new XDomainRequest||new XMLHttpRequest,t.onerror=t.onabort=function(e){h(1,e||t&&t.responseText||{error:"Network Connection Error"})},t.onload=t.onloadend=r,t.onreadystatechange=function(){if(t&&4==t.readyState)switch(t.status){case 200:break;default:try{n=JSON.parse(t.responseText),h(1,n)}catch(e){return h(1,{status:t.status,payload:null,message:t.responseText})}return}};var y=build_url(e.url,c);t.open("GET",y,p),p&&(t.timeout=s),t.send()}catch(_){return h(0),v=0,l(e)}return h}function p(){if(!("onLine"in navigator))return 1;try{return navigator.onLine}catch(e){return!0}}function h(e){return"sendBeacon"in navigator?navigator.sendBeacon(e):!1}function d(){if(!S||!S.get)return 0;var e={id:d.id++,send:function(){},abort:function(){e.id={}},open:function(t,n){d[e.id]=e,S.get(e.id,n)}};return e}var y="https://pubnub.a.ssl.fastly.net/pubnub.swf",_="async",b=navigator.userAgent,m="PubNub-JS-Web/3.7.14",v=-1==b.indexOf("MSIE 6");window.console||(window.console=window.console||{}),console.log||(console.log=console.error=(window.opera||{}).postError||function(){});var g=function(){var e={},t=!1;try{t=window.localStorage}catch(n){}var r=function(e){return-1==document.cookie.indexOf(e)?null:((document.cookie||"").match(RegExp(e+"=([^;]+)"))||[])[1]||null},o=function(e,t){document.cookie=e+"="+t+"; expires=Thu, 1 Aug 2030 20:00:00 UTC; path=/"},i=function(){try{return o("pnctest","1"),"1"===r("pnctest")}catch(e){return!1}}();return{get:function(n){try{return t?t.getItem(n):i?r(n):e[n]}catch(o){return e[n]}},set:function(n,r){try{if(t)return t.setItem(n,r)&&0;i&&o(n,r),e[n]=r}catch(s){e[n]=r}}}}(),w={list:{},unbind:function(e){w.list[e]=[]},bind:function(e,t){(w.list[e]=w.list[e]||[]).push(t)},fire:function(e,t){each(w.list[e]||[],function(e){e(t)})}},k=t("pubnub")||0,E=function(f){v=f.jsonp?0:-1==b.indexOf("MSIE 6");var d=f.subscribe_key||"",y=((+f.keepalive||DEF_KEEPALIVE)*SECOND,f.uuid||g.get(d+"uuid")||"",f.leave_on_unload||0);f.xdr=l,f.db=g,f.error=f.error||n,f._is_online=p,f.jsonp_cb=c,f.hmac_SHA256=e,f.crypto_obj=crypto_obj(),f.sendBeacon=h,f.params={pnsdk:m};var _=function(e){return E(e)},k=PN_API(f);for(var x in k)k.hasOwnProperty(x)&&(_[x]=k[x]);return _.css=u,_.$=t,_.create=a,_.bind=o,_.head=i,_.search=r,_.attr=s,_.events=w,_.init=_,_.secure=_,_.crypto_obj=crypto_obj(),o("beforeunload",window,function(){return y&&_["each-channel"](function(e){_.LEAVE(e.name,0)}),!0}),f.notest?_:(o("offline",window,_.offline),o("offline",document,_.offline),_)};E.init=E,E.secure=E,E.crypto_obj=crypto_obj(),"complete"===document.readyState?timeout(ready,0):o("load",window,function(){timeout(ready,0)});var x=k||{};PUBNUB=E({notest:1,publish_key:s(x,"pub-key"),subscribe_key:s(x,"sub-key"),ssl:!document.location.href.indexOf("https")||"on"==s(x,"ssl"),origin:s(x,"origin"),uuid:s(x,"uuid")}),window.jQuery&&(window.jQuery.PUBNUB=E),"undefined"!=typeof module&&(module.exports=PUBNUB)&&ready();var S=t("pubnubs")||0;k&&(u(k,{position:"absolute",top:-SECOND}),("opera"in window||s(k,"flash"))&&(k.innerHTML=""),PUBNUB.rdx=function(e,t){return t?(d[e].responseText=unescape(t),void d[e].onload()):d[e].onerror()},d.id=SECOND)}(),function(){var e=PUBNUB.ws=function(t,n){if(!(this instanceof e))return new e(t,n);var r=this,t=r.url=t||"",o=(r.protocol=n||"Sec-WebSocket-Protocol",t.split("/")),i={ssl:"wss:"===o[0],origin:o[2],publish_key:o[3],subscribe_key:o[4],channel:o[5]};return r.CONNECTING=0,r.OPEN=1,r.CLOSING=2,r.CLOSED=3,r.CLOSE_NORMAL=1e3,r.CLOSE_GOING_AWAY=1001,r.CLOSE_PROTOCOL_ERROR=1002,r.CLOSE_UNSUPPORTED=1003,r.CLOSE_TOO_LARGE=1004,r.CLOSE_NO_STATUS=1005,r.CLOSE_ABNORMAL=1006,r.onclose=r.onerror=r.onmessage=r.onopen=r.onsend=function(){},r.binaryType="",r.extensions="",r.bufferedAmount=0,r.trasnmitting=!1,r.buffer=[],r.readyState=r.CONNECTING,t?(r.pubnub=PUBNUB.init(i),r.pubnub.setup=i,r.setup=i,void r.pubnub.subscribe({restore:!1,channel:i.channel,disconnect:r.onerror,reconnect:r.onopen,error:function(){r.onclose({code:r.CLOSE_ABNORMAL,reason:"Missing URL",wasClean:!1})},callback:function(e){r.onmessage({data:e})},connect:function(){r.readyState=r.OPEN,r.onopen()}})):(r.readyState=r.CLOSED,r.onclose({code:r.CLOSE_ABNORMAL,reason:"Missing URL",wasClean:!0}),r)};e.prototype.send=function(e){var t=this;t.pubnub.publish({channel:t.pubnub.setup.channel,message:e,callback:function(e){t.onsend({data:e})}})},e.prototype.close=function(){var e=this;e.pubnub.unsubscribe({channel:e.pubnub.setup.channel}),e.readyState=e.CLOSED,e.onclose({})}}();var CryptoJS=CryptoJS||function(e,t){var n={},r=n.lib={},o=function(){},i=r.Base={extend:function(e){o.prototype=this;var t=new o;return e&&t.mixIn(e),t.hasOwnProperty("init")||(t.init=function(){t.$super.init.apply(this,arguments)}),t.init.prototype=t,t.$super=this,t},create:function(){var e=this.extend();return e.init.apply(e,arguments),e},init:function(){},mixIn:function(e){for(var t in e)e.hasOwnProperty(t)&&(this[t]=e[t]);e.hasOwnProperty("toString")&&(this.toString=e.toString)},clone:function(){return this.init.prototype.extend(this)}},s=r.WordArray=i.extend({init:function(e,n){e=this.words=e||[],this.sigBytes=n!=t?n:4*e.length},toString:function(e){return(e||a).stringify(this)},concat:function(e){var t=this.words,n=e.words,r=this.sigBytes;if(e=e.sigBytes,this.clamp(),r%4)for(var o=0;e>o;o++)t[r+o>>>2]|=(n[o>>>2]>>>24-8*(o%4)&255)<<24-8*((r+o)%4);else if(65535o;o+=4)t[r+o>>>2]=n[o>>>2];else t.push.apply(t,n);return this.sigBytes+=e,this},clamp:function(){var t=this.words,n=this.sigBytes;t[n>>>2]&=4294967295<<32-8*(n%4),t.length=e.ceil(n/4)},clone:function(){var e=i.clone.call(this);return e.words=this.words.slice(0),e},random:function(t){for(var n=[],r=0;t>r;r+=4)n.push(4294967296*e.random()|0);return new s.init(n,t)}}),u=n.enc={},a=u.Hex={stringify:function(e){var t=e.words;e=e.sigBytes;for(var n=[],r=0;e>r;r++){var o=t[r>>>2]>>>24-8*(r%4)&255;n.push((o>>>4).toString(16)),n.push((15&o).toString(16))}return n.join("")},parse:function(e){for(var t=e.length,n=[],r=0;t>r;r+=2)n[r>>>3]|=parseInt(e.substr(r,2),16)<<24-4*(r%8);return new s.init(n,t/2)}},c=u.Latin1={stringify:function(e){var t=e.words;e=e.sigBytes;for(var n=[],r=0;e>r;r++)n.push(String.fromCharCode(t[r>>>2]>>>24-8*(r%4)&255));return n.join("")},parse:function(e){for(var t=e.length,n=[],r=0;t>r;r++)n[r>>>2]|=(255&e.charCodeAt(r))<<24-8*(r%4);return new s.init(n,t)}},l=u.Utf8={stringify:function(e){try{return decodeURIComponent(escape(c.stringify(e)))}catch(t){throw Error("Malformed UTF-8 data")}},parse:function(e){return c.parse(unescape(encodeURIComponent(e)))}},f=r.BufferedBlockAlgorithm=i.extend({reset:function(){this._data=new s.init,this._nDataBytes=0},_append:function(e){"string"==typeof e&&(e=l.parse(e)),this._data.concat(e),this._nDataBytes+=e.sigBytes},_process:function(t){var n=this._data,r=n.words,o=n.sigBytes,i=this.blockSize,u=o/(4*i),u=t?e.ceil(u):e.max((0|u)-this._minBufferSize,0);if(t=u*i,o=e.min(4*t,o),t){for(var a=0;t>a;a+=i)this._doProcessBlock(r,a);a=r.splice(0,t),n.sigBytes-=o}return new s.init(a,o)},clone:function(){var e=i.clone.call(this);return e._data=this._data.clone(),e},_minBufferSize:0});r.Hasher=f.extend({cfg:i.extend(),init:function(e){this.cfg=this.cfg.extend(e),this.reset()},reset:function(){f.reset.call(this),this._doReset()},update:function(e){return this._append(e),this._process(),this},finalize:function(e){return e&&this._append(e),this._doFinalize()},blockSize:16,_createHelper:function(e){return function(t,n){return new e.init(n).finalize(t)}},_createHmacHelper:function(e){return function(t,n){return new p.HMAC.init(e,n).finalize(t)}}});var p=n.algo={};return n}(Math);!function(e){for(var t=CryptoJS,n=t.lib,r=n.WordArray,o=n.Hasher,n=t.algo,i=[],s=[],u=function(e){return 4294967296*(e-(0|e))|0},a=2,c=0;64>c;){var l;e:{l=a;for(var f=e.sqrt(l),p=2;f>=p;p++)if(!(l%p)){l=!1;break e}l=!0}l&&(8>c&&(i[c]=u(e.pow(a,.5))),s[c]=u(e.pow(a,1/3)),c++),a++}var h=[],n=n.SHA256=o.extend({_doReset:function(){this._hash=new r.init(i.slice(0))},_doProcessBlock:function(e,t){for(var n=this._hash.words,r=n[0],o=n[1],i=n[2],u=n[3],a=n[4],c=n[5],l=n[6],f=n[7],p=0;64>p;p++){if(16>p)h[p]=0|e[t+p];else{var d=h[p-15],y=h[p-2];h[p]=((d<<25|d>>>7)^(d<<14|d>>>18)^d>>>3)+h[p-7]+((y<<15|y>>>17)^(y<<13|y>>>19)^y>>>10)+h[p-16]}d=f+((a<<26|a>>>6)^(a<<21|a>>>11)^(a<<7|a>>>25))+(a&c^~a&l)+s[p]+h[p],y=((r<<30|r>>>2)^(r<<19|r>>>13)^(r<<10|r>>>22))+(r&o^r&i^o&i),f=l,l=c,c=a,a=u+d|0,u=i,i=o,o=r,r=d+y|0}n[0]=n[0]+r|0,n[1]=n[1]+o|0,n[2]=n[2]+i|0,n[3]=n[3]+u|0,n[4]=n[4]+a|0,n[5]=n[5]+c|0,n[6]=n[6]+l|0,n[7]=n[7]+f|0},_doFinalize:function(){var t=this._data,n=t.words,r=8*this._nDataBytes,o=8*t.sigBytes;return n[o>>>5]|=128<<24-o%32,n[(o+64>>>9<<4)+14]=e.floor(r/4294967296),n[(o+64>>>9<<4)+15]=r,t.sigBytes=4*n.length,this._process(),this._hash},clone:function(){var e=o.clone.call(this);return e._hash=this._hash.clone(),e}});t.SHA256=o._createHelper(n),t.HmacSHA256=o._createHmacHelper(n)}(Math),function(){var e=CryptoJS,t=e.enc.Utf8;e.algo.HMAC=e.lib.Base.extend({init:function(e,n){e=this._hasher=new e.init,"string"==typeof n&&(n=t.parse(n));var r=e.blockSize,o=4*r;n.sigBytes>o&&(n=e.finalize(n)),n.clamp();for(var i=this._oKey=n.clone(),s=this._iKey=n.clone(),u=i.words,a=s.words,c=0;r>c;c++)u[c]^=1549556828,a[c]^=909522486;i.sigBytes=s.sigBytes=o,this.reset()},reset:function(){var e=this._hasher;e.reset(),e.update(this._iKey)},update:function(e){return this._hasher.update(e),this},finalize:function(e){var t=this._hasher;return e=t.finalize(e),t.reset(),t.finalize(this._oKey.clone().concat(e))}})}(),function(){var e=CryptoJS,t=e.lib.WordArray;e.enc.Base64={stringify:function(e){var t=e.words,n=e.sigBytes,r=this._map;e.clamp(),e=[];for(var o=0;n>o;o+=3)for(var i=(t[o>>>2]>>>24-8*(o%4)&255)<<16|(t[o+1>>>2]>>>24-8*((o+1)%4)&255)<<8|t[o+2>>>2]>>>24-8*((o+2)%4)&255,s=0;4>s&&n>o+.75*s;s++)e.push(r.charAt(i>>>6*(3-s)&63));if(t=r.charAt(64))for(;e.length%4;)e.push(t);return e.join("")},parse:function(e){var n=e.length,r=this._map,o=r.charAt(64);o&&(o=e.indexOf(o),-1!=o&&(n=o));for(var o=[],i=0,s=0;n>s;s++)if(s%4){var u=r.indexOf(e.charAt(s-1))<<2*(s%4),a=r.indexOf(e.charAt(s))>>>6-2*(s%4);o[i>>>2]|=(u|a)<<24-8*(i%4),i++}return t.create(o,i)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}}(),function(e){function t(e,t,n,r,o,i,s){return e=e+(t&n|~t&r)+o+s,(e<>>32-i)+t}function n(e,t,n,r,o,i,s){return e=e+(t&r|n&~r)+o+s,(e<>>32-i)+t}function r(e,t,n,r,o,i,s){return e=e+(t^n^r)+o+s,(e<>>32-i)+t}function o(e,t,n,r,o,i,s){return e=e+(n^(t|~r))+o+s,(e<>>32-i)+t}for(var i=CryptoJS,s=i.lib,u=s.WordArray,a=s.Hasher,s=i.algo,c=[],l=0;64>l;l++)c[l]=4294967296*e.abs(e.sin(l+1))|0;s=s.MD5=a.extend({_doReset:function(){this._hash=new u.init([1732584193,4023233417,2562383102,271733878])},_doProcessBlock:function(e,i){for(var s=0;16>s;s++){var u=i+s,a=e[u];e[u]=16711935&(a<<8|a>>>24)|4278255360&(a<<24|a>>>8)}var s=this._hash.words,u=e[i+0],a=e[i+1],l=e[i+2],f=e[i+3],p=e[i+4],h=e[i+5],d=e[i+6],y=e[i+7],_=e[i+8],b=e[i+9],m=e[i+10],v=e[i+11],g=e[i+12],w=e[i+13],k=e[i+14],E=e[i+15],x=s[0],S=s[1],O=s[2],T=s[3],x=t(x,S,O,T,u,7,c[0]),T=t(T,x,S,O,a,12,c[1]),O=t(O,T,x,S,l,17,c[2]),S=t(S,O,T,x,f,22,c[3]),x=t(x,S,O,T,p,7,c[4]),T=t(T,x,S,O,h,12,c[5]),O=t(O,T,x,S,d,17,c[6]),S=t(S,O,T,x,y,22,c[7]),x=t(x,S,O,T,_,7,c[8]),T=t(T,x,S,O,b,12,c[9]),O=t(O,T,x,S,m,17,c[10]),S=t(S,O,T,x,v,22,c[11]),x=t(x,S,O,T,g,7,c[12]),T=t(T,x,S,O,w,12,c[13]),O=t(O,T,x,S,k,17,c[14]),S=t(S,O,T,x,E,22,c[15]),x=n(x,S,O,T,a,5,c[16]),T=n(T,x,S,O,d,9,c[17]),O=n(O,T,x,S,v,14,c[18]),S=n(S,O,T,x,u,20,c[19]),x=n(x,S,O,T,h,5,c[20]),T=n(T,x,S,O,m,9,c[21]),O=n(O,T,x,S,E,14,c[22]),S=n(S,O,T,x,p,20,c[23]),x=n(x,S,O,T,b,5,c[24]),T=n(T,x,S,O,k,9,c[25]),O=n(O,T,x,S,f,14,c[26]),S=n(S,O,T,x,_,20,c[27]),x=n(x,S,O,T,w,5,c[28]),T=n(T,x,S,O,l,9,c[29]),O=n(O,T,x,S,y,14,c[30]),S=n(S,O,T,x,g,20,c[31]),x=r(x,S,O,T,h,4,c[32]),T=r(T,x,S,O,_,11,c[33]),O=r(O,T,x,S,v,16,c[34]),S=r(S,O,T,x,k,23,c[35]),x=r(x,S,O,T,a,4,c[36]),T=r(T,x,S,O,p,11,c[37]),O=r(O,T,x,S,y,16,c[38]),S=r(S,O,T,x,m,23,c[39]),x=r(x,S,O,T,w,4,c[40]),T=r(T,x,S,O,u,11,c[41]),O=r(O,T,x,S,f,16,c[42]),S=r(S,O,T,x,d,23,c[43]),x=r(x,S,O,T,b,4,c[44]),T=r(T,x,S,O,g,11,c[45]),O=r(O,T,x,S,E,16,c[46]),S=r(S,O,T,x,l,23,c[47]),x=o(x,S,O,T,u,6,c[48]),T=o(T,x,S,O,y,10,c[49]),O=o(O,T,x,S,k,15,c[50]),S=o(S,O,T,x,h,21,c[51]),x=o(x,S,O,T,g,6,c[52]),T=o(T,x,S,O,f,10,c[53]),O=o(O,T,x,S,m,15,c[54]),S=o(S,O,T,x,a,21,c[55]),x=o(x,S,O,T,_,6,c[56]),T=o(T,x,S,O,E,10,c[57]),O=o(O,T,x,S,d,15,c[58]),S=o(S,O,T,x,w,21,c[59]),x=o(x,S,O,T,p,6,c[60]),T=o(T,x,S,O,v,10,c[61]),O=o(O,T,x,S,l,15,c[62]),S=o(S,O,T,x,b,21,c[63]);s[0]=s[0]+x|0,s[1]=s[1]+S|0,s[2]=s[2]+O|0,s[3]=s[3]+T|0},_doFinalize:function(){var t=this._data,n=t.words,r=8*this._nDataBytes,o=8*t.sigBytes;n[o>>>5]|=128<<24-o%32;var i=e.floor(r/4294967296);for(n[(o+64>>>9<<4)+15]=16711935&(i<<8|i>>>24)|4278255360&(i<<24|i>>>8),n[(o+64>>>9<<4)+14]=16711935&(r<<8|r>>>24)|4278255360&(r<<24|r>>>8),t.sigBytes=4*(n.length+1),this._process(),t=this._hash,n=t.words,r=0;4>r;r++)o=n[r],n[r]=16711935&(o<<8|o>>>24)|4278255360&(o<<24|o>>>8);return t},clone:function(){var e=a.clone.call(this);return e._hash=this._hash.clone(),e}}),i.MD5=a._createHelper(s),i.HmacMD5=a._createHmacHelper(s)}(Math),function(){var e=CryptoJS,t=e.lib,n=t.Base,r=t.WordArray,t=e.algo,o=t.EvpKDF=n.extend({cfg:n.extend({keySize:4,hasher:t.MD5,iterations:1}),init:function(e){this.cfg=this.cfg.extend(e)},compute:function(e,t){for(var n=this.cfg,o=n.hasher.create(),i=r.create(),s=i.words,u=n.keySize,n=n.iterations;s.lengthc;c++)a=o.finalize(a),o.reset();i.concat(a)}return i.sigBytes=4*u,i}});e.EvpKDF=function(e,t,n){return o.create(n).compute(e,t)}}(),CryptoJS.lib.Cipher||function(e){var t=CryptoJS,n=t.lib,r=n.Base,o=n.WordArray,i=n.BufferedBlockAlgorithm,s=t.enc.Base64,u=t.algo.EvpKDF,a=n.Cipher=i.extend({cfg:r.extend(),createEncryptor:function(e,t){return this.create(this._ENC_XFORM_MODE,e,t)},createDecryptor:function(e,t){return this.create(this._DEC_XFORM_MODE,e,t)},init:function(e,t,n){this.cfg=this.cfg.extend(n),this._xformMode=e,this._key=t,this.reset()},reset:function(){i.reset.call(this),this._doReset()},process:function(e){return this._append(e),this._process()},finalize:function(e){return e&&this._append(e),this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(e){return{encrypt:function(t,n,r){return("string"==typeof n?d:h).encrypt(e,t,n,r)},decrypt:function(t,n,r){return("string"==typeof n?d:h).decrypt(e,t,n,r)}}}});n.StreamCipher=a.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var c=t.mode={},l=function(t,n,r){var o=this._iv;o?this._iv=e:o=this._prevBlock;for(var i=0;r>i;i++)t[n+i]^=o[i]},f=(n.BlockCipherMode=r.extend({createEncryptor:function(e,t){return this.Encryptor.create(e,t)},createDecryptor:function(e,t){return this.Decryptor.create(e,t)},init:function(e,t){this._cipher=e,this._iv=t}})).extend();f.Encryptor=f.extend({processBlock:function(e,t){var n=this._cipher,r=n.blockSize;l.call(this,e,t,r),n.encryptBlock(e,t),this._prevBlock=e.slice(t,t+r)}}),f.Decryptor=f.extend({processBlock:function(e,t){var n=this._cipher,r=n.blockSize,o=e.slice(t,t+r);n.decryptBlock(e,t),l.call(this,e,t,r),this._prevBlock=o}}),c=c.CBC=f,f=(t.pad={}).Pkcs7={pad:function(e,t){for(var n=4*t,n=n-e.sigBytes%n,r=n<<24|n<<16|n<<8|n,i=[],s=0;n>s;s+=4)i.push(r);n=o.create(i,n),e.concat(n)},unpad:function(e){e.sigBytes-=255&e.words[e.sigBytes-1>>>2]}},n.BlockCipher=a.extend({cfg:a.cfg.extend({mode:c,padding:f}),reset:function(){a.reset.call(this);var e=this.cfg,t=e.iv,e=e.mode;if(this._xformMode==this._ENC_XFORM_MODE)var n=e.createEncryptor;else n=e.createDecryptor,this._minBufferSize=1;this._mode=n.call(e,this,t&&t.words)},_doProcessBlock:function(e,t){this._mode.processBlock(e,t)},_doFinalize:function(){var e=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){e.pad(this._data,this.blockSize);var t=this._process(!0)}else t=this._process(!0),e.unpad(t);return t},blockSize:4});var p=n.CipherParams=r.extend({init:function(e){this.mixIn(e)},toString:function(e){return(e||this.formatter).stringify(this)}}),c=(t.format={}).OpenSSL={stringify:function(e){var t=e.ciphertext;return e=e.salt,(e?o.create([1398893684,1701076831]).concat(e).concat(t):t).toString(s)},parse:function(e){e=s.parse(e);var t=e.words;if(1398893684==t[0]&&1701076831==t[1]){var n=o.create(t.slice(2,4));t.splice(0,4),e.sigBytes-=16}return p.create({ciphertext:e,salt:n})}},h=n.SerializableCipher=r.extend({cfg:r.extend({format:c}),encrypt:function(e,t,n,r){r=this.cfg.extend(r);var o=e.createEncryptor(n,r);return t=o.finalize(t),o=o.cfg,p.create({ciphertext:t,key:n,iv:o.iv,algorithm:e,mode:o.mode,padding:o.padding,blockSize:e.blockSize,formatter:r.format})},decrypt:function(e,t,n,r){return r=this.cfg.extend(r),t=this._parse(t,r.format),e.createDecryptor(n,r).finalize(t.ciphertext)},_parse:function(e,t){return"string"==typeof e?t.parse(e,this):e}}),t=(t.kdf={}).OpenSSL={execute:function(e,t,n,r){return r||(r=o.random(8)),e=u.create({keySize:t+n}).compute(e,r),n=o.create(e.words.slice(t),4*n),e.sigBytes=4*t,p.create({key:e,iv:n,salt:r})}},d=n.PasswordBasedCipher=h.extend({cfg:h.cfg.extend({kdf:t}),encrypt:function(e,t,n,r){return r=this.cfg.extend(r),n=r.kdf.execute(n,e.keySize,e.ivSize),r.iv=n.iv,e=h.encrypt.call(this,e,t,n.key,r),e.mixIn(n),e},decrypt:function(e,t,n,r){return r=this.cfg.extend(r),t=this._parse(t,r.format),n=r.kdf.execute(n,e.keySize,e.ivSize,t.salt),r.iv=n.iv,h.decrypt.call(this,e,t,n.key,r)}})}(),function(){for(var e=CryptoJS,t=e.lib.BlockCipher,n=e.algo,r=[],o=[],i=[],s=[],u=[],a=[],c=[],l=[],f=[],p=[],h=[],d=0;256>d;d++)h[d]=128>d?d<<1:d<<1^283;for(var y=0,_=0,d=0;256>d;d++){var b=_^_<<1^_<<2^_<<3^_<<4,b=b>>>8^255&b^99;r[y]=b,o[b]=y;var m=h[y],v=h[m],g=h[v],w=257*h[b]^16843008*b;i[y]=w<<24|w>>>8,s[y]=w<<16|w>>>16,u[y]=w<<8|w>>>24,a[y]=w,w=16843009*g^65537*v^257*m^16843008*y,c[b]=w<<24|w>>>8,l[b]=w<<16|w>>>16,f[b]=w<<8|w>>>24,p[b]=w,y?(y=m^h[h[h[g^m]]],_^=h[h[_]]):y=_=1}var k=[0,1,2,4,8,16,32,64,128,27,54],n=n.AES=t.extend({_doReset:function(){for(var e=this._key,t=e.words,n=e.sigBytes/4,e=4*((this._nRounds=n+6)+1),o=this._keySchedule=[],i=0;e>i;i++)if(n>i)o[i]=t[i];else{var s=o[i-1];i%n?n>6&&4==i%n&&(s=r[s>>>24]<<24|r[s>>>16&255]<<16|r[s>>>8&255]<<8|r[255&s]):(s=s<<8|s>>>24,s=r[s>>>24]<<24|r[s>>>16&255]<<16|r[s>>>8&255]<<8|r[255&s],s^=k[i/n|0]<<24),o[i]=o[i-n]^s}for(t=this._invKeySchedule=[],n=0;e>n;n++)i=e-n,s=n%4?o[i]:o[i-4],t[n]=4>n||4>=i?s:c[r[s>>>24]]^l[r[s>>>16&255]]^f[r[s>>>8&255]]^p[r[255&s]]},encryptBlock:function(e,t){this._doCryptBlock(e,t,this._keySchedule,i,s,u,a,r)},decryptBlock:function(e,t){var n=e[t+1];e[t+1]=e[t+3],e[t+3]=n,this._doCryptBlock(e,t,this._invKeySchedule,c,l,f,p,o),n=e[t+1],e[t+1]=e[t+3],e[t+3]=n},_doCryptBlock:function(e,t,n,r,o,i,s,u){for(var a=this._nRounds,c=e[t]^n[0],l=e[t+1]^n[1],f=e[t+2]^n[2],p=e[t+3]^n[3],h=4,d=1;a>d;d++)var y=r[c>>>24]^o[l>>>16&255]^i[f>>>8&255]^s[255&p]^n[h++],_=r[l>>>24]^o[f>>>16&255]^i[p>>>8&255]^s[255&c]^n[h++],b=r[f>>>24]^o[p>>>16&255]^i[c>>>8&255]^s[255&l]^n[h++],p=r[p>>>24]^o[c>>>16&255]^i[l>>>8&255]^s[255&f]^n[h++],c=y,l=_,f=b; +y=(u[c>>>24]<<24|u[l>>>16&255]<<16|u[f>>>8&255]<<8|u[255&p])^n[h++],_=(u[l>>>24]<<24|u[f>>>16&255]<<16|u[p>>>8&255]<<8|u[255&c])^n[h++],b=(u[f>>>24]<<24|u[p>>>16&255]<<16|u[c>>>8&255]<<8|u[255&l])^n[h++],p=(u[p>>>24]<<24|u[c>>>16&255]<<16|u[l>>>8&255]<<8|u[255&f])^n[h++],e[t]=y,e[t+1]=_,e[t+2]=b,e[t+3]=p},keySize:8});e.AES=t._createHelper(n)}(),CryptoJS.mode.ECB=function(){var e=CryptoJS.lib.BlockCipherMode.extend();return e.Encryptor=e.extend({processBlock:function(e,t){this._cipher.encryptBlock(e,t)}}),e.Decryptor=e.extend({processBlock:function(e,t){this._cipher.decryptBlock(e,t)}}),e}()}).call(exports,__webpack_require__(7)(module))},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var r=function(){function e(e,t){for(var n=0;n1?n-1:0),o=1;n>o;o++)r[o-1]=arguments[o];var i=null;return this.hasListeners(e)?(this._listeners[e].some(function(e){return i=e.apply(t,r),i===!1}),i):null},e.prototype.off=function(e,t){var n=this;if(e)if(t){if(!this.hasListeners(e))return this;this._listeners[e].forEach(function(r,o){r===t&&delete n._listeners[e][o]})}else delete this._listeners[e];else this._listeners={};return this},e}();t["default"]=r,e.exports=t["default"]},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var o=function(){function e(e,t){for(var n=0;n-1?"&":"?")+a.queryStringify(e.query)),c.findHeaderName("Accept",e.headers)||(e.headers.Accept=h["default"]._jsonContentType),"string"!=typeof e.body||!e.body){var n=c.findHeaderName(h["default"]._contentType,e.headers);n||(n=h["default"]._contentType,e.headers[n]=h["default"]._jsonContentType);var r=e.headers[n];r.indexOf(h["default"]._jsonContentType)>-1?e.body=JSON.stringify(e.body):r.indexOf(h["default"]._urlencodedContentType)>-1&&(e.body=a.queryStringify(e.body))}var o=new u.Request(e.url,e);return o.originalBody=e.body,o},s(t,null,[{key:"_allowedMethods",value:["GET","POST","PUT","DELETE","PATCH","OPTIONS","HEAD"],enumerable:!0}]),t}(f["default"]);t["default"]=d,e.exports=t["default"]},function(e,t,n){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t["default"]=e,t}function o(e,t){t=t||{};var n=new s.Response(e,t);return a.isNodeJS()&&(n._text=e,n._decode=function(){return this._text}),n}function i(e,t){return e=e.toLowerCase(),Object.keys(t).reduce(function(t,n){return t?t:e==n.toLowerCase()?n:t},null)}t.__esModule=!0,t.createResponse=o,t.findHeaderName=i;var s=n(3),u=n(2),a=r(u)},function(e,t,n){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t["default"]=e,t}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(e,t){for(var n=0;n-1},e.prototype._getContentType=function(){return this._response.headers.get(e._contentType)||""},e.prototype._isMultipart=function(){return this._isContentType(e._multipartContentType)},e.prototype._isUrlEncoded=function(){return this._isContentType(e._urlencodedContentType)},e.prototype._isJson=function(){return this._isContentType(e._jsonContentType)},e.create=function(t,n,r){t=t||"",n=n||200,r=r||"OK",t=t.replace(/\r/g,"");var o=new s.Headers,i=t.split(e._bodySeparator),u=i.length>1?i.shift():"";return t=i.join(e._bodySeparator),(u||"").split("\n").forEach(function(t){var n=t.trim().split(e._headerSeparator),r=n.shift().trim(),i=n.join(e._headerSeparator).trim();r&&o.append(r,i)}),new e(null,a.createResponse(t,{headers:o,status:n,statusText:r}),t)},e}();t["default"]=c,e.exports=t["default"]},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var s=n(18),u=r(s),a=n(14),c=r(a),l=function(e){function t(){o(this,t),e.call(this),this._registry=new u["default"]}return i(t,e),t.prototype.registry=function(){return this._registry},t.prototype._loadResponse=function(e){var t;return regeneratorRuntime.async(function(n){for(;;)switch(n.prev=n.next){case 0:return t=this._registry.find(e),n.next=3,regeneratorRuntime.awrap(t.getResponse(e));case 3:return n.abrupt("return",n.sent);case 4:case"end":return n.stop()}},null,this)},t}(c["default"]);t["default"]=l,e.exports=t["default"]},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=n(19),s=r(i),u=function(){function e(){o(this,e),this._mocks=[]}return e.prototype.add=function(e){return this._mocks.push(e),this},e.prototype.clear=function(){return this._mocks=[],this},e.prototype.find=function(e){var t=this._mocks.shift();if(!t)throw new Error("No mock in registry for request "+e.method+" "+e.url);if(!t.test(e))throw new Error("Wrong request "+e.method+" "+e.url+" for expected mock "+t.method()+" "+t.path());return t},e.prototype.apiCall=function(e,t,n,r,o){return this.add(new s["default"](e,t,n,r,o)),this},e.prototype.authentication=function(){return this.apiCall("POST","/restapi/oauth/token",{access_token:"ACCESS_TOKEN",token_type:"bearer",expires_in:3600,refresh_token:"REFRESH_TOKEN",refresh_token_expires_in:60480,scope:"SMS RCM Foo Boo",expireTime:(new Date).getTime()+36e5}),this},e.prototype.logout=function(){return this.apiCall("POST","/restapi/oauth/revoke",{}),this},e.prototype.presenceLoad=function(e){return this.apiCall("GET","/restapi/v1.0/account/~/extension/"+e+"/presence",{uri:"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/"+e+"/presence",extension:{uri:"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/"+e,id:e,extensionNumber:"101"},activeCalls:[],presenceStatus:"Available",telephonyStatus:"Ringing",userStatus:"Available",dndStatus:"TakeAllCalls",extensionId:e}),this},e.prototype.subscribeGeneric=function(e){e=e||54e3;var t=new Date;return this.apiCall("POST","/restapi/v1.0/subscription",{eventFilters:["/restapi/v1.0/account/~/extension/~/presence"],expirationTime:new Date(t.getTime()+1e3*e).toISOString(),expiresIn:e,deliveryMode:{transportType:"PubNub",encryption:!1,address:"123_foo",subscriberKey:"sub-c-foo",secretKey:"sec-c-bar"},id:"foo-bar-baz",creationTime:t.toISOString(),status:"Active",uri:"https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz"}),this},e.prototype.subscribeOnPresence=function(e,t){e=e||"1";var n=new Date;return this.apiCall("POST","/restapi/v1.0/subscription",{eventFilters:["/restapi/v1.0/account/~/extension/"+e+"/presence"+(t?"?detailedTelephonyState=true":"")],expirationTime:new Date(n.getTime()+54e6).toISOString(),deliveryMode:{transportType:"PubNub",encryption:!0,address:"123_foo",subscriberKey:"sub-c-foo",secretKey:"sec-c-bar",encryptionAlgorithm:"AES",encryptionKey:"VQwb6EVNcQPBhE/JgFZ2zw=="},creationTime:n.toISOString(),id:"foo-bar-baz",status:"Active",uri:"https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz"}),this},e.prototype.tokenRefresh=function(e){return e?this.apiCall("POST","/restapi/oauth/token",{message:"Wrong token",error_description:"Wrong token",description:"Wrong token"},400):this.apiCall("POST","/restapi/oauth/token",{access_token:"ACCESS_TOKEN_FROM_REFRESH",token_type:"bearer",expires_in:3600,refresh_token:"REFRESH_TOKEN_FROM_REFRESH",refresh_token_expires_in:60480,scope:"SMS RCM Foo Boo"}),this},e}();t["default"]=u,e.exports=t["default"]},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=n(16),s=r(i),u=n(2),a=n(15),c=function(){function e(t,n,r,i,s,u){o(this,e),this._method=t.toUpperCase(),this._path=n,this._json=r||{},this._delay=u||10,this._status=i||200,this._statusText=s||"OK"}return e.prototype.path=function(){return this._path},e.prototype.method=function(){return this._method},e.prototype.test=function(e){return e.url.indexOf(this._path)>-1&&e.method.toUpperCase()==this._method},e.prototype.getResponse=function(e){return regeneratorRuntime.async(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,regeneratorRuntime.awrap(u.delay(this._delay));case 2:return e.abrupt("return",this.createResponse(this._json));case 3:case"end":return e.stop()}},null,this)},e.prototype.createResponse=function(e,t){t=t||{},t.status=t.status||this._status,t.statusText=t.statusText||this._statusText;var n=JSON.stringify(e),r=a.createResponse(n,t);return r.headers.set(s["default"]._contentType,s["default"]._jsonContentType),r},e}();t["default"]=c,e.exports=t["default"]},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var s=function(){function e(e,t){for(var n=0;n-1?"&":"?"),n.addMethod&&(r+="_method="+n.addMethod),n.addToken&&(r+=(n.addMethod?"&":"")+"access_token="+this._auth.accessToken()),r},t.prototype.authUrl=function(e){return e=e||{},this.createUrl(t._authorizeEndpoint+"?"+h.queryStringify({response_type:"code",redirect_uri:e.redirectUri||"",client_id:this._appKey,state:e.state||"",brand_id:e.brandId||"",display:e.display||"",prompt:e.prompt||""}),{addServer:!0})},t.prototype.parseAuthRedirectUrl=function(e){var t=h.parseQueryString(e.split("?").reverse()[0]),n=t.error_description||t.error;if(n){var r=new Error(n);throw r.error=t.error,r}return t},t.prototype.loggedIn=function(){return regeneratorRuntime.async(function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,regeneratorRuntime.awrap(this._ensureAuthentication());case 3:return e.abrupt("return",!0);case 6:return e.prev=6,e.t0=e["catch"](0),e.abrupt("return",!1);case 9:case"end":return e.stop()}},null,this,[[0,6]])},t.prototype.login=function(e){var n,r,o;return regeneratorRuntime.async(function(i){for(;;)switch(i.prev=i.next){case 0:return i.prev=0,e=e||{},e.remember=e.remember||!1,this.emit(this.events.beforeLogin),n={access_token_ttl:t._accessTokenTtl,refresh_token_ttl:e.remember?t._refreshTokenTtlRemember:t._refreshTokenTtl},e.code?e.code&&(n.grant_type="authorization_code",n.code=e.code,n.redirect_uri=e.redirectUri):(n.grant_type="password",n.username=e.username,n.password=e.password,n.extension=e.extension||""),e.endpointId&&(n.endpoint_id=e.endpointId),i.next=9,regeneratorRuntime.awrap(this._tokenRequest(t._tokenEndpoint,n));case 9:return r=i.sent,o=r.json(),this._auth.setData(o).setRemember(e.remember),this.emit(this.events.loginSuccess,r),i.abrupt("return",r);case 16:throw i.prev=16,i.t0=i["catch"](0),this._cache.clean(),this.emit(this.events.loginError,i.t0),i.t0;case 21:case"end":return i.stop()}},null,this,[[0,16]])},t.prototype.refresh=function(){var e,n;return regeneratorRuntime.async(function(r){for(;;)switch(r.prev=r.next){case 0:if(r.prev=0,this.emit(this.events.beforeRefresh),!this._queue.isPaused()){r.next=9;break}return r.next=5,regeneratorRuntime.awrap(this._queue.poll());case 5:if(this._isAccessTokenValid()){r.next=7;break}throw new Error("Automatic authentification timeout");case 7:return this.emit(this.events.refreshSuccess,null),r.abrupt("return",null);case 9:return this._queue.pause(),r.next=12,regeneratorRuntime.awrap(h.delay(t._refreshDelayMs));case 12:if(this._auth.refreshToken()){r.next=14;break}throw new Error("Refresh token is missing");case 14:if(this._auth.refreshTokenValid()){r.next=16;break}throw new Error("Refresh token has expired");case 16:if(this._queue.isPaused()){r.next=18;break}throw new Error("Queue was resumed before refresh call");case 18:return r.next=20,regeneratorRuntime.awrap(this._tokenRequest(t._tokenEndpoint,{grant_type:"refresh_token",refresh_token:this._auth.refreshToken(),access_token_ttl:t._accessTokenTtl,refresh_token_ttl:this._auth.remember()?t._refreshTokenTtlRemember:t._refreshTokenTtl}));case 20:if(e=r.sent,n=e.json(),n.access_token){r.next=24;break}throw this._client.makeError(new Error("Malformed OAuth response"),e);case 24:return this._auth.setData(n),this._queue.resume(),this.emit(this.events.refreshSuccess,e),r.abrupt("return",e);case 30:throw r.prev=30,r.t0=r["catch"](0),r.t0=this._client.makeError(r.t0),t._clearCacheOnRefreshError&&this._cache.clean(),this.emit(this.events.refreshError,r.t0),r.t0;case 36:case"end":return r.stop()}},null,this,[[0,30]])},t.prototype.logout=function(){var e;return regeneratorRuntime.async(function(n){for(;;)switch(n.prev=n.next){case 0:return n.prev=0,this.emit(this.events.beforeLogout),this._queue.pause(),n.next=5,regeneratorRuntime.awrap(this._tokenRequest(t._revokeEndpoint,{token:this._auth.accessToken()}));case 5:return e=n.sent,this._queue.resume(),this._cache.clean(),this.emit(this.events.logoutSuccess,e),n.abrupt("return",e);case 12:throw n.prev=12,n.t0=n["catch"](0),this._queue.resume(),this.emit(this.events.logoutError,n.t0),n.t0;case 17:case"end":return n.stop()}},null,this,[[0,12]])},t.prototype.inflateRequest=function(e,t){return regeneratorRuntime.async(function(n){for(;;)switch(n.prev=n.next){case 0:if(t=t||{},!t.skipAuthCheck){n.next=3;break}return n.abrupt("return",e);case 3:return n.next=5,regeneratorRuntime.awrap(this._ensureAuthentication());case 5:return e.headers.set("Authorization",this._authHeader()),n.abrupt("return",e);case 7:case"end":return n.stop()}},null,this)},t.prototype.sendRequest=function(e,t){return regeneratorRuntime.async(function(n){for(;;)switch(n.prev=n.next){case 0:return n.prev=0,n.next=3,regeneratorRuntime.awrap(this.inflateRequest(e,t));case 3:return e=n.sent,n.next=6,regeneratorRuntime.awrap(this._client.sendRequest(e));case 6:return n.abrupt("return",n.sent);case 9:if(n.prev=9,n.t0=n["catch"](0),n.t0.apiResponse&&n.t0.apiResponse.response()&&401==n.t0.apiResponse.response().status){n.next=13;break}throw n.t0;case 13:return this._auth.cancelAccessToken(),n.next=16,regeneratorRuntime.awrap(this.sendRequest(e,t));case 16:return n.abrupt("return",n.sent);case 17:case"end":return n.stop()}},null,this,[[0,9]])},t.prototype.send=function(){var e=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];return regeneratorRuntime.async(function(t){for(;;)switch(t.prev=t.next){case 0:return e.url=this.createUrl(e.url,{addServer:!0}),t.next=3,regeneratorRuntime.awrap(this.sendRequest(this._client.createRequest(e),e));case 3:return t.abrupt("return",t.sent);case 4:case"end":return t.stop()}},null,this)},t.prototype.get=function(e,t,n){return regeneratorRuntime.async(function(r){for(;;)switch(r.prev=r.next){case 0:return n=n||{},n.method="GET",n.url=e,n.query=t,r.next=6,regeneratorRuntime.awrap(this.send(n));case 6:return r.abrupt("return",r.sent);case 7:case"end":return r.stop()}},null,this)},t.prototype.post=function(e,t,n,r){return regeneratorRuntime.async(function(o){for(;;)switch(o.prev=o.next){case 0:return r=r||{},r.method="POST",r.url=e,r.query=n,r.body=t,o.next=7,regeneratorRuntime.awrap(this.send(r));case 7:return o.abrupt("return",o.sent);case 8:case"end":return o.stop()}},null,this)},t.prototype.put=function(e,t,n,r){return regeneratorRuntime.async(function(o){for(;;)switch(o.prev=o.next){case 0:return r=r||{},r.method="PUT",r.url=e,r.query=n,r.body=t,o.next=7,regeneratorRuntime.awrap(this.send(r));case 7:return o.abrupt("return",o.sent);case 8:case"end":return o.stop()}},null,this)},t.prototype["delete"]=function(e,t,n){return regeneratorRuntime.async(function(r){for(;;)switch(r.prev=r.next){case 0:return n=n||{},n.method="DELETE",n.url=e,n.query=t,r.next=6,regeneratorRuntime.awrap(this.send(n));case 6:return r.abrupt("return",r.sent);case 7:case"end":return r.stop()}},null,this)},t.prototype._tokenRequest=function(e,t){return regeneratorRuntime.async(function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,regeneratorRuntime.awrap(this.send({url:e,skipAuthCheck:!0,body:t,method:"POST",headers:{Authorization:"Basic "+this._apiKey(),"Content-Type":"application/x-www-form-urlencoded"}}));case 2:return n.abrupt("return",n.sent);case 3:case"end":return n.stop()}},null,this)},t.prototype._ensureAuthentication=function(){return regeneratorRuntime.async(function(e){for(;;)switch(e.prev=e.next){case 0:if(!this._isAccessTokenValid()){e.next=2;break}return e.abrupt("return",null);case 2:return e.next=4,regeneratorRuntime.awrap(this.refresh());case 4:return e.abrupt("return",e.sent);case 5:case"end":return e.stop()}},null,this)},t.prototype._isAccessTokenValid=function(){return this._auth.accessTokenValid()&&!this._queue.isPaused()},t.prototype._apiKey=function(){var e=this._appKey+":"+this._appSecret;return"function"==typeof btoa?btoa(e):new Buffer(e).toString("base64")},t.prototype._authHeader=function(){var e=this._auth.accessToken();return this._auth.tokenType()+(e?" "+e:"")},t}(a["default"]);t["default"]=d,e.exports=t["default"]},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var r=function(){function e(e,t){for(var n=0;nDate.now()},e.prototype.refreshTokenValid=function(){return this.data().refresh_token_expire_time>Date.now()},e.prototype.cancelAccessToken=function(){return this.setData({access_token:"",expires_in:0})},e.prototype.forceAuthentication=function(){return this.setData({token_type:e.forcedTokenType,access_token:"",expires_in:0,refresh_token:"",refresh_token_expires_in:0}),this},e.prototype.setRemember=function(e){return this.setData({remember:e})},e.prototype.remember=function(){return!!this.data().remember},e}();t["default"]=o,e.exports=t["default"]},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=n(23),s=r(i),u=n(3),a=function(){function e(){o(this,e),this.crypto_obj=u.PUBNUB.crypto_obj}return e.prototype.init=function(e){return new s["default"](e)},e}();t["default"]=a,e.exports=t["default"]},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var s=n(12),u=r(s),a=n(3),c=function(e){function t(n){o(this,t),e.call(this),this.options=n,this.crypto_obj=a.PUBNUB.crypto_obj}return i(t,e),t.prototype.ready=function(){},t.prototype.subscribe=function(e){this.on("message-"+e.channel,e.message)},t.prototype.unsubscribe=function(e){this.off("message-"+e.channel)},t.prototype.receiveMessage=function(e,t){this.emit("message-"+t,e,"env",t)},t}(u["default"]);t["default"]=c,e.exports=t["default"]},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var s=function(){function e(e,t){for(var n=0;n=0;--r){var o=this.tryEntries[r],i=o.completion;if("root"===o.tryLoc)return t("end");if(o.tryLoc<=this.prev){var s=b.call(o,"catchLoc"),u=b.call(o,"finallyLoc");if(s&&u){if(this.prev=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&b.call(r,"finallyLoc")&&this.prev=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),p(n),S}},"catch":function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var o=r.arg;p(n)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:d(e),resultName:t,nextLoc:n},S}}}("object"==typeof t?t:"object"==typeof window?window:"object"==typeof self?self:this)}).call(t,function(){return this}())}])}); //# sourceMappingURL=ringcentral-bundle.min.js.map diff --git a/build/ringcentral-bundle.min.js.map b/build/ringcentral-bundle.min.js.map index cd0c3ba6..3e7fdb6c 100644 --- a/build/ringcentral-bundle.min.js.map +++ b/build/ringcentral-bundle.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","ringcentral-bundle.js","webpack:/webpack/bootstrap ab5bb5a6cdbb0cfc49a3","webpack:///src/SDK.js","webpack:///src/core/Utils.js","webpack:///src/core/Externals.js","webpack:///bower_components/es6-promise/promise.js","webpack:///(webpack)/~/node-libs-browser/~/timers-browserify/main.js","webpack:///(webpack)/~/node-libs-browser/~/process/browser.js","webpack:///(webpack)/buildin/module.js","webpack:///(webpack)/buildin/amd-define.js","webpack:///bower_components/fetch/fetch.js","webpack:///bower_components/pubnub/web/pubnub.js","webpack:///src/core/Cache.js","webpack:///src/core/Observable.js","webpack:///src/http/Client.js","webpack:///src/http/Utils.js","webpack:///src/http/ApiResponse.js","webpack:///src/mocks/ClientMock.js","webpack:///src/mocks/Registry.js","webpack:///src/mocks/Mock.js","webpack:///src/platform/Platform.js","webpack:///src/platform/Queue.js","webpack:///src/platform/Auth.js","webpack:///src/pubnub/PubnubFactory.js","webpack:///src/pubnub/PubnubMock.js","webpack:///src/subscription/Subscription.js","webpack:///~/regenerator/runtime.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","_interopRequireDefault","obj","__esModule","default","_interopRequireWildcard","newObj","key","Object","prototype","hasOwnProperty","_classCallCheck","instance","Constructor","TypeError","_createClass","defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","defineProperty","protoProps","staticProps","_coreUtils","Utils","_coreCache","_coreCache2","_coreExternals","Externals","_coreObservable","_coreObservable2","_httpClient","_httpClient2","_httpApiResponse","_httpApiResponse2","_httpUtils","HttpUtils","_mocksClientMock","_mocksClientMock2","_mocksMock","_mocksMock2","_mocksRegistry","_mocksRegistry2","_platformPlatform","_platformPlatform2","_platformAuth","_platformAuth2","_platformQueue","_platformQueue2","_pubnubPubnubFactory","_pubnubPubnubFactory2","_subscriptionSubscription","_subscriptionSubscription2","SDK","options","_cache","localStorage","cachePrefix","_client","client","_platform","server","appKey","appSecret","_pubnubFactory","pubnubFactory","PUBNUB","value","sandbox","production","platform","createSubscription","cache","Cache","Observable","Client","ApiResponse","Auth","Platform","Queue","Subscription","Registry","Mock","PubnubMockFactory","queryStringify","parameters","array","keys","forEach","k","v","isArray","vv","push","encodeURIComponent","join","parseQueryString","queryString","argsParsed","split","arg","decodeURIComponent","indexOf","trim","pair","isFunction","Array","poll","fn","interval","timeout","stopPolling","next","delay","setTimeout","clearTimeout","isNodeJS","process","isBrowser","window","_ExternalsJs","Promise","resolve","reject","_es6Promise","_es6Promise2","_nodeFetch","_nodeFetch2","_pubnub","_pubnub2","fetch","Request","Response","Headers","__WEBPACK_AMD_DEFINE_RESULT__","setImmediate","global","lib$es6$promise$utils$$objectOrFunction","x","lib$es6$promise$utils$$isFunction","lib$es6$promise$utils$$isMaybeThenable","lib$es6$promise$asap$$asap","callback","lib$es6$promise$asap$$queue","lib$es6$promise$asap$$len","lib$es6$promise$asap$$customSchedulerFn","lib$es6$promise$asap$$flush","lib$es6$promise$asap$$scheduleFlush","lib$es6$promise$asap$$setScheduler","scheduleFn","lib$es6$promise$asap$$useNextTick","nextTick","version","versions","node","match","lib$es6$promise$asap$$useVertxTimer","lib$es6$promise$asap$$vertxNext","lib$es6$promise$asap$$useMutationObserver","iterations","observer","lib$es6$promise$asap$$BrowserMutationObserver","document","createTextNode","observe","characterData","data","lib$es6$promise$asap$$useMessageChannel","channel","MessageChannel","port1","onmessage","port2","postMessage","lib$es6$promise$asap$$useSetTimeout","undefined","lib$es6$promise$asap$$attemptVertex","vertx","e","Error","code","runOnLoop","runOnContext","lib$es6$promise$$internal$$noop","lib$es6$promise$$internal$$selfFullfillment","lib$es6$promise$$internal$$cannotReturnOwn","lib$es6$promise$$internal$$getThen","promise","then","error","lib$es6$promise$$internal$$GET_THEN_ERROR","lib$es6$promise$$internal$$tryThen","fulfillmentHandler","rejectionHandler","lib$es6$promise$$internal$$handleForeignThenable","thenable","lib$es6$promise$asap$$default","sealed","lib$es6$promise$$internal$$resolve","lib$es6$promise$$internal$$fulfill","reason","lib$es6$promise$$internal$$reject","_label","lib$es6$promise$$internal$$handleOwnThenable","_state","lib$es6$promise$$internal$$FULFILLED","_result","lib$es6$promise$$internal$$REJECTED","lib$es6$promise$$internal$$subscribe","lib$es6$promise$$internal$$handleMaybeThenable","maybeThenable","constructor","lib$es6$promise$$internal$$publishRejection","_onerror","lib$es6$promise$$internal$$publish","lib$es6$promise$$internal$$PENDING","_subscribers","parent","child","onFulfillment","onRejection","subscribers","settled","detail","lib$es6$promise$$internal$$invokeCallback","lib$es6$promise$$internal$$ErrorObject","lib$es6$promise$$internal$$tryCatch","lib$es6$promise$$internal$$TRY_CATCH_ERROR","succeeded","failed","hasCallback","lib$es6$promise$$internal$$initializePromise","resolver","lib$es6$promise$enumerator$$Enumerator","input","enumerator","_instanceConstructor","_validateInput","_input","_remaining","_init","_enumerate","_validationError","lib$es6$promise$promise$all$$all","entries","lib$es6$promise$enumerator$$default","lib$es6$promise$promise$race$$race","lib$es6$promise$utils$$isArray","lib$es6$promise$promise$resolve$$resolve","object","lib$es6$promise$promise$reject$$reject","lib$es6$promise$promise$$needsResolver","lib$es6$promise$promise$$needsNew","lib$es6$promise$promise$$Promise","_id","lib$es6$promise$promise$$counter","lib$es6$promise$polyfill$$polyfill","local","self","Function","P","toString","cast","lib$es6$promise$promise$$default","lib$es6$promise$utils$$_isArray","lib$es6$promise$asap$$browserWindow","lib$es6$promise$asap$$browserGlobal","MutationObserver","WebKitMutationObserver","lib$es6$promise$asap$$isNode","lib$es6$promise$asap$$isWorker","Uint8ClampedArray","importScripts","_eachEntry","entry","_settledAt","_willSettleAt","state","lib$es6$promise$promise$all$$default","lib$es6$promise$promise$race$$default","lib$es6$promise$promise$resolve$$default","lib$es6$promise$promise$reject$$default","all","race","_setScheduler","_asap","result","arguments","catch","lib$es6$promise$polyfill$$default","lib$es6$promise$umd$$ES6Promise","polyfill","clearImmediate","Timeout","clearFn","_clearFn","apply","slice","immediateIds","nextImmediateId","setInterval","clearInterval","close","unref","ref","enroll","item","msecs","_idleTimeoutId","_idleTimeout","unenroll","_unrefActive","active","_onTimeout","args","cleanUpNextTick","draining","currentQueue","queue","concat","queueIndex","drainQueue","len","run","Item","fun","noop","title","browser","env","argv","on","addListener","once","off","removeListener","removeAllListeners","emit","binding","name","cwd","chdir","dir","umask","webpackPolyfill","deprecate","paths","children","normalizeName","String","test","toLowerCase","normalizeValue","headers","map","append","getOwnPropertyNames","consumed","body","bodyUsed","fileReaderReady","reader","onload","onerror","readBlobAsArrayBuffer","blob","FileReader","readAsArrayBuffer","readBlobAsText","readAsText","Body","_initBody","_bodyInit","_bodyText","support","Blob","isPrototypeOf","_bodyBlob","formData","FormData","_bodyFormData","rejected","arrayBuffer","text","decode","json","JSON","parse","normalizeMethod","method","upcased","toUpperCase","methods","url","credentials","mode","referrer","form","bytes","shift","replace","xhr","head","pairs","getAllResponseHeaders","header","bodyInit","type","status","ok","statusText","list","get","values","getAll","has","set","thisArg","init","request","responseURL","getResponseHeader","XMLHttpRequest","response","responseText","open","withCredentials","responseType","setRequestHeader","send","unique","NOW","Date","rnow","build_url","url_components","url_params","URLBIT","params","each","value_str","encode","PARAMSBIT","updater","rate","last","runnit","grep","fin","l","supplant","str","REPL","_","wait","generate_uuid","u","r","Math","random","o","f","pam_encode","charCodeAt","path","generate_channel_list","channels","nopresence","search","subscribed","sort","generate_channel_group_list","channel_groups","channel_group","ready","READY","READY_BUFFER","connect","SECOND","PNmessage","msg","apns","aps","alert","badge","exclude1","exclude","getPubnubMessage","publish","message","PN_API","setup","_get_url_params","_object_to_key_list","_object_to_key_list_sorted","_get_pam_sign_input_from_params","si","validate_presence_heartbeat","heartbeat","cur_heartbeat","err","PRESENCE_HB_THRESHOLD","PRESENCE_HB_DEFAULT","encrypt","crypto_obj","CIPHER_KEY","decrypt","_presence_heartbeat","PRESENCE_HB_TIMEOUT","PRESENCE_HB_INTERVAL","CHANNELS","CHANNEL_GROUPS","PRESENCE_HB_RUNNING","SELF","stringify","start_presence_heartbeat","NO_WAIT_FOR_PENDING","PUB_QUEUE","sending","xdr","each_channel_group","count","chang","each_channel","chan","_invoke_callback","callback_data","_invoke_error","CR","url1","jsonp","jsonp_cb","AUTH_KEY","STD_ORIGIN","SUBSCRIBE_KEY","success","fail","_poll_online","_is_online","_reset_offline","_poll_timer","_poll_online2","TIME_CHECK","detect_time_detla","_poll_timer2","KEEPALIVE","SUB_RECEIVER","detect_latency","tt","adjusted_time","TIME_DRIFT","cb","time","calculate","ptime","latency","stime","SUB_WINDOWING","DEF_WINDOWING","SUB_TIMEOUT","DEF_SUB_TIMEOUT","DEF_KEEPALIVE","NOLEAVE","PUBLISH_KEY","SECRET_KEY","hmac_SHA256","SSL","ORIGIN","nextorigin","SUB_ORIGIN","CONNECT","CLOAK","SUB_CALLBACK","SUB_CHANNEL","SUB_RESTORE","TIMETOKEN","RESUMED","STATE","PRESENCE_HB","COMPATIBLE_35","db","UUID","USE_INSTANCEID","INSTANCEID","shutdown","use_send_beacon","sendBeacon","a","b","LEAVE","blocking","auth_key","uuid","auth","origin","PRESENCE_SUFFIX","url_string","action","service","LEAVE_GROUP","set_resumed","resumed","get_cipher_key","set_cipher_key","raw_encrypt","raw_decrypt","get_heartbeat","set_heartbeat","heartbeat_interval","get_heartbeat_interval","set_heartbeat_interval","get_version","SDK_VER","getGcmMessageObject","getApnsMessageObject","newPnMessage","gcm","n","_add_param","val","namespace","ns_ch","cloak","ns_ch_a","channel_group_list_groups","channel_group_list_channels","channel_group_remove_channel","channel_group_remove_group","channel_group_add_channel","channel_group_cloak","channel_group_list_namespaces","channel_group_remove_namespace","history","reverse","cipher_key","start","end","include_token","string_msg_token","payload","messages","decrypted_messages","new_message","replay","source","destination","stop","limit","post","store","add_msg","unsubscribe","ch","CB_CALLED","chg","subscribe","_test_connection","windowing","disconnected","reconnect","disconnect","_connect","st","sub_timeout","SUB_ERROR","idlecb","connected","backfill","next_callback","channels2","list2","channel2","chobj","decrypted_msg","presence","noheresync","timetoken","restore","settings","here","uid","timestamp","floor","occupancy","here_now","uuids","where_now","grant","ttl","w","getTime","sign_input","signature","mobile_gw_provision","op","gw_type","device_id","audit","revoke","set_uuid","get_uuid","get_subscibed_channels","presence_heartbeat","stop_timers","each-channel","offline","now","SHA256","s","CryptoJS","parse_options","defaultOptions","allowedKeyEncodings","allowedKeyLengths","parseInt","allowedModes","decode_key","get_padded_key","get_mode","get_iv","iv","encryptKey","keyEncoding","keyLength","hex_message","encryptedHexArray","base_64_encrypted","binary_enc","json_plain","ciphertext","plaintext","toJSON","valueOf","quote","string","escapable","lastIndex","meta","holder","partial","mind","gap","rep","isFinite","indent","cx","\b","\t","\n","\f","\r","\"","\\","replacer","space","eval","DEF_TIMEOUT","max","ori","failover","get_hmac_SHA256","hash","$","getElementById","console","elements","el","getElementsByTagName","bind","etype","rapfun","event","cancelBubble","preventDefault","stopPropagation","addEventListener","attachEvent","attr","attribute","setAttribute","getAttribute","css","element","styles","style","create","createElement","XORIGN","FDomainRequest","ajax","script","finished","xhrtme","timer","done","appendChild","parentNode","removeChild","ASYNC","src","complete","async","abort","XDomainRequest","onabort","onloadend","onreadystatechange","readyState","eee","navigator","pubnubs","fdomainrequest","SWF","UA","userAgent","PNSDK","log","opera","postError","ls","cookieGet","cookie","RegExp","cookieSet","cookieTest","getItem","setItem","events","unbind","fire","PDIV","CREATE_PUBNUB","leave_on_unload","pnsdk","PN","prop","pdiv","notest","publish_key","subscribe_key","ssl","location","href","position","top","unescape","WS","protocols","bits","protocol","pubnub","wasClean","h","g","lib","q","Base","extend","mixIn","$super","clone","WordArray","words","sigBytes","d","clamp","ceil","enc","Hex","substr","Latin1","fromCharCode","j","Utf8","escape","BufferedBlockAlgorithm","reset","_data","_nDataBytes","_append","_process","blockSize","_minBufferSize","min","_doProcessBlock","splice","Hasher","cfg","_doReset","update","finalize","_doFinalize","_createHelper","_createHmacHelper","t","HMAC","algo","sqrt","pow","_hash","HmacSHA256","_hasher","_oKey","_iKey","Base64","_map","charAt","abs","sin","MD5","z","A","B","C","D","E","HmacMD5","EvpKDF","keySize","hasher","compute","Cipher","createEncryptor","_ENC_XFORM_MODE","createDecryptor","_DEC_XFORM_MODE","_xformMode","_key","ivSize","StreamCipher","_iv","_prevBlock","BlockCipherMode","Encryptor","Decryptor","_cipher","processBlock","encryptBlock","decryptBlock","CBC","pad","Pkcs7","unpad","BlockCipher","padding","_mode","CipherParams","formatter","format","OpenSSL","salt","SerializableCipher","algorithm","_parse","kdf","execute","PasswordBasedCipher","F","G","y","H","AES","_nRounds","_keySchedule","_invKeySchedule","_doCryptBlock","ECB","offset","storage","prefix","setPrefix","_storage","_prefix","defaultPrefix","_prefixKey","removeItem","clean","hasListeners","_listeners","_this","_this2","_len","some","_this3","_inherits","subClass","superClass","setPrototypeOf","__proto__","_Utils","_ApiResponse","_ApiResponse2","_Observable","beforeRequest","requestSuccess","requestError","sendRequest","apiResponse","regeneratorRuntime","context$2$0","prev","awrap","_loadResponse","_response","sent","_isMultipart","_isJson","_text","abrupt","t0","makeError","originalMessage","createRequest","_allowedMethods","query","findHeaderName","_jsonContentType","contentTypeHeaderName","_contentType","contentType","_urlencodedContentType","req","originalBody","createResponse","stringBody","utils","_decode","reduce","res","_request","_json","_multipart","skipOKCheck","error_description","description","multipart","boundary","_getContentType","parts","_boundarySeparator","pop","statusInfo","part","_isContentType","_multipartContentType","_isUrlEncoded","headersAndBody","_bodySeparator","headersText","_headerSeparator","_Registry","_Registry2","_HttpClient","_registry","registry","mock","find","getResponse","_Mock","_Mock2","_mocks","add","clear","apiCall","authentication","access_token","token_type","expires_in","refresh_token","refresh_token_expires_in","scope","expireTime","logout","presenceLoad","uri","extension","extensionNumber","activeCalls","presenceStatus","telephonyStatus","userStatus","dndStatus","extensionId","subscribeGeneric","expiresIn","date","eventFilters","expirationTime","toISOString","deliveryMode","transportType","encryption","address","subscriberKey","secretKey","creationTime","subscribeOnPresence","detailed","encryptionAlgorithm","encryptionKey","tokenRefresh","failure","_method","_path","_delay","_status","_statusText","_Queue","_Queue2","_Auth","_Auth2","beforeLogin","loginSuccess","loginError","beforeRefresh","refreshSuccess","refreshError","beforeLogout","logoutSuccess","logoutError","_server","_appKey","_appSecret","_queue","_cacheId","_auth","createUrl","builtUrl","hasHttp","addServer","_urlPrefix","_apiVersion","addMethod","addToken","accessToken","authUrl","_authorizeEndpoint","response_type","redirect_uri","redirectUri","client_id","brand_id","brandId","display","prompt","parseAuthRedirectUrl","qs","loggedIn","_ensureAuthentication","login","remember","access_token_ttl","_accessTokenTtl","refresh_token_ttl","_refreshTokenTtlRemember","_refreshTokenTtl","grant_type","username","password","endpointId","endpoint_id","_tokenRequest","_tokenEndpoint","setData","setRemember","refresh","isPaused","_isAccessTokenValid","pause","_refreshDelayMs","refreshToken","refreshTokenValid","resume","_clearCacheOnRefreshError","_revokeEndpoint","token","inflateRequest","skipAuthCheck","_authHeader","cancelAccessToken","put","Authorization","_apiKey","Content-Type","accessTokenValid","apiKey","btoa","Buffer","tokenType","cacheId","_promise","_releaseTimeout","_pollInterval","newData","expire_time","refresh_token_expire_time","authData","forcedTokenType","refreshHandicapMs","forceAuthentication","_PubnubMockJs","_PubnubMockJs2","PubnubMock","receiveMessage","notification","removeSuccess","removeError","renewSuccess","renewError","subscribeSuccess","subscribeError","_timeout","_subscription","alive","_renewHandicapMs","setSubscription","subscription","_clearTimeout","_subscribeAtPubnub","_setTimeout","register","renew","addEventFilters","setEventFilters","_getFullEventFilters","remove","restoreFromCache","cacheKey","cachedSubscriptionData","_decrypt","_notify","wrap","innerFn","outerFn","tryLocsList","generator","Generator","context","Context","_invoke","makeInvokeMethod","tryCatch","GeneratorFunction","GeneratorFunctionPrototype","defineIteratorMethods","AwaitArgument","AsyncIterator","invoke","invokeNext","invokeThrow","unwrapped","enqueue","callInvokeWithMethodAndArg","previousPromise","domain","GenStateSuspendedStart","GenStateExecuting","GenStateCompleted","doneResult","delegate","iterator","returnMethod","record","info","GenStateSuspendedYield","resultName","nextLoc","dispatchException","ContinueSentinel","pushTryEntry","locs","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","iterable","iteratorMethod","iteratorSymbol","isNaN","hasOwn","Symbol","inModule","runtime","Gp","displayName","isGeneratorFunction","genFun","ctor","mark","iter","skipTempReset","rootEntry","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","finish","thrown","delegateYield"],"mappings":"CAAA,SAAAA,EAAAC,GACA,gBAAAC,UAAA,gBAAAC,QACAA,OAAAD,QAAAD,IACA,kBAAAG,SAAAA,OAAAC,IACAD,UAAAH,GACA,gBAAAC,SACAA,QAAA,IAAAD,KAEAD,EAAA,YAAAA,EAAA,gBAAiDA,EAAA,YAAA,IAAAC,MAChDK,KAAA,WACD,MCAgB,UAAUC,GCN1B,QAAAC,GAAAC,GAGA,GAAAC,EAAAD,GACA,MAAAC,GAAAD,GAAAP,OAGA,IAAAC,GAAAO,EAAAD,IACAP,WACAS,GAAAF,EACAG,QAAA,EAUA,OANAL,GAAAE,GAAAI,KAAAV,EAAAD,QAAAC,EAAAA,EAAAD,QAAAM,GAGAL,EAAAS,QAAA,EAGAT,EAAAD,QAvBA,GAAAQ,KAqCA,OATAF,GAAAM,EAAAP,EAGAC,EAAAO,EAAAL,EAGAF,EAAAQ,EAAA,UAGAR,EAAA,KDgBM,SAASL,EAAQD,EAASM,GAEhCL,EAAOD,QAAUM,EAAoB,IAK/B,SAASL,EAAQD,EAASM,GAEhC,YAMA,SAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAEzF,QAASG,GAAwBH,GAAO,GAAIA,GAAOA,EAAIC,WAAc,MAAOD,EAAc,IAAII,KAAa,IAAW,MAAPJ,EAAe,IAAK,GAAIK,KAAOL,GAAWM,OAAOC,UAAUC,eAAeb,KAAKK,EAAKK,KAAMD,EAAOC,GAAOL,EAAIK,GAAmC,OAAzBD,GAAO,WAAaJ,EAAYI,EAErQ,QAASK,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCARhH5B,EAAQiB,YAAa,CAErB,IAAIY,GAAe,WAAe,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAIC,GAAI,EAAGA,EAAID,EAAME,OAAQD,IAAK,CAAE,GAAIE,GAAaH,EAAMC,EAAIE,GAAWC,WAAaD,EAAWC,aAAc,EAAOD,EAAWE,cAAe,EAAU,SAAWF,KAAYA,EAAWG,UAAW,GAAMhB,OAAOiB,eAAeR,EAAQI,EAAWd,IAAKc,IAAiB,MAAO,UAAUR,EAAaa,EAAYC,GAAiJ,MAA9HD,IAAYV,EAAiBH,EAAYJ,UAAWiB,GAAiBC,GAAaX,EAAiBH,EAAac,GAAqBd,MAQ7hBe,EAAapC,EE3EM,GAAXqC,EAAKxB,EAAAuB,GF+EbE,EAAatC,EE9EC,IFgFduC,EAAc9B,EAAuB6B,GAErCE,EAAiBxC,EEjFM,GAAfyC,EAAS5B,EAAA2B,GFqFjBE,EAAkB1C,EEpFC,IFsFnB2C,EAAmBlC,EAAuBiC,GAE1CE,EAAc5C,EEtFC,IFwFf6C,EAAepC,EAAuBmC,GAEtCE,EAAmB9C,EEzFC,IF2FpB+C,EAAoBtC,EAAuBqC,GAE3CE,EAAahD,EE5FU,IAAfiD,EAASpC,EAAAmC,GFgGjBE,EAAmBlD,EE9Fa,IFgGhCmD,EAAoB1C,EAAuByC,GAE3CE,EAAapD,EEjGA,IFmGbqD,EAAc5C,EAAuB2C,GAErCE,EAAiBtD,EEpGA,IFsGjBuD,EAAkB9C,EAAuB6C,GAEzCE,EAAoBxD,EEtGH,IFwGjByD,EAAqBhD,EAAuB+C,GAE5CE,EAAgB1D,EEzGH,IF2Gb2D,EAAiBlD,EAAuBiD,GAExCE,EAAiB5D,EE5GH,IF8Gd6D,EAAkBpD,EAAuBmD,GAEzCE,EAAuB9D,EE9GG,IFgH1B+D,EAAwBtD,EAAuBqD,GAE/CE,EAA4BhE,EEhHP,IFkHrBiE,EAA6BxD,EAAuBuD,EEhHxDhE,GAAQ,GFoHR,IElHqBkE,GAAG,WAqBT,QArBMA,GAqBLC,GFyHRhD,EAAgBrB,KE9IHoE,GAuBbC,EAAUA,MAEVrE,KAAKsE,OAAS,GAAA7B,GAAA,WAAUE,EAAU4B,aAAcF,EAAQG,aAExDxE,KAAKyE,QAAUJ,EAAQK,QAAU,GAAA3B,GAAA,WAEjC/C,KAAK2E,UAAY,GAAAhB,GAAA,WAAa3D,KAAKyE,QAASzE,KAAKsE,OAAQD,EAAQO,OAAQP,EAAQQ,OAAQR,EAAQS,WAEjG9E,KAAK+E,eAAiBV,EAAQW,eAAiBrC,EAAUsC,OFmM7D,MA/GAxD,GEnHiB2C,EAAG,OFoHhBnD,IAAK,UACLiE,MEnHa,QFoHblD,YAAY,IAEZf,IAAK,SACLiE,OEpHAC,QAAS,2CACTC,WAAY,oCFoIZpD,YAAY,KE1ICoC,EAAGjD,UAsCpBkE,SAAQ,WACJ,MAAOrF,MAAK2E,WAvCCP,EAAGjD,UA6CpBmE,mBAAkB,WACd,MAAO,IAAAnB,GAAA,WAAiBnE,KAAK+E,eAAgB/E,KAAK2E,UAAW3E,KAAKsE,SA9CrDF,EAAGjD,UAoDpBoE,MAAK,WACD,MAAOvF,MAAKsE,QF8HhB7C,EEnLiB2C,EAAG,OFoLhBnD,IAAK,OACLiE,OE5HAM,MAAK/C,EAAA,WACLgD,WAAU5C,EAAA,WACVN,MAAOA,EACPI,UAAWA,GF+HXX,YAAY,IAEZf,IAAK,OACLiE,OE9HAQ,OAAM3C,EAAA,WACN4C,YAAW1C,EAAA,WACXV,MAAOY,GFiIPnB,YAAY,IAEZf,IAAK,WACLiE,OEhIAU,KAAI/B,EAAA,WACJgC,SAAQlC,EAAA,WACRmC,MAAK/B,EAAA,YFmIL/B,YAAY,IAEZf,IAAK,eACLiE,OElIAa,aAAY5B,EAAA,YFqIZnC,YAAY,IAEZf,IAAK,QACLiE,OEpIAQ,OAAMrC,EAAA,WACN2C,SAAQvC,EAAA,WACRwC,KAAI1C,EAAA,YFuIJvB,YAAY,IAEZf,IAAK,SACLiE,OEtIAgB,kBAAiBjC,EAAA,YFyIjBjC,YAAY,KE/NCoC,IFqOrBxE,GAAQ,WErOawE,EFsOrBvE,EAAOD,QAAUA,EAAQ,YAInB,SAASC,EAAQD,EAASM,GAEhC,YG3PO,SAASiG,GAAeC,GAE3B,GAAIC,KAkBJ,OAhBAD,GAAaA,MAEblF,OAAOoF,KAAKF,GAAYG,QAAQ,SAACC,GAE7B,GAAIC,GAAIL,EAAWI,EAEfE,GAAQD,GACRA,EAAEF,QAAQ,SAACI,GACPN,EAAMO,KAAKC,mBAAmBL,GAAK,IAAMK,mBAAmBF,MAGhEN,EAAMO,KAAKC,mBAAmBL,GAAK,IAAMK,mBAAmBJ,MAK7DJ,EAAMS,KAAK,KAUf,QAASC,GAAiBC,GAE7B,GAAIC,KA2BJ,OAzBAD,GAAYE,MAAM,KAAKX,QAAQ,SAACY,GAI5B,GAFAA,EAAMC,mBAAmBD,GAED,IAApBA,EAAIE,QAAQ,KAEZJ,EAAWE,EAAIG,SAAU,MAEtB,CAEH,GAAIC,GAAOJ,EAAID,MAAM,KACjBjG,EAAMsG,EAAK,GAAGD,OACdpC,EAAQqC,EAAK,GAAGD,MAEhBrG,KAAOgG,IACHhG,IAAOgG,KAAeP,EAAQO,EAAWhG,MAAOgG,EAAWhG,IAAQgG,EAAWhG,KAClFgG,EAAWhG,GAAK2F,KAAK1B,IAErB+B,EAAWhG,GAAOiE,KAOvB+B,EAQJ,QAASO,GAAW5G,GACvB,MAAsB,kBAARA,GAOX,QAAS8F,GAAQ9F,GACpB,MAAO6G,OAAMf,QAAUe,MAAMf,QAAQ9F,GAAsB,eAARA,GAQhD,QAAS8G,GAAKC,EAAIC,EAAUC,GAE/BhI,EAAOD,QAAQkI,YAAYD,GAE3BD,EAAWA,GAAY,GAEvB,IAAIG,GAAO,QAAPA,GAAQC,GAMR,MAJAA,GAAQA,GAASJ,EAEjBA,EAAWI,EAEJC,WAAW,WAEdN,EAAGI,EAAMC,IAEVA,GAIP,OAAOD,KAIJ,QAASD,GAAYD,GACpBA,GAASK,aAAaL,GAGvB,QAASM,KACZ,MAA2B,mBAAZC,SAGZ,QAASC,KACZ,MAA0B,mBAAXC,QAGZ,QAASN,GAAMH,GAClB,MAAO,IAAAU,GAAAC,QAAY,SAACC,EAASC,GACzBT,WAAW,WACPQ,EAAQ,OACTZ,KHiIXjI,EAAQiB,YAAa,EACrBjB,EAAQuG,eAAiBA,EACzBvG,EAAQmH,iBAAmBA,EAC3BnH,EAAQ4H,WAAaA,EACrB5H,EAAQ8G,QAAUA,EAClB9G,EAAQ8H,KAAOA,EACf9H,EAAQkI,YAAcA,EACtBlI,EAAQuI,SAAWA,EACnBvI,EAAQyI,UAAYA,EACpBzI,EAAQoI,MAAQA,CAEhB,IAAIO,GAAerI,EGhRG,IHuZhB,SAASL,EAAQD,EAASM,GAEhC,YAIA,SAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAFzFhB,EAAQiB,YAAa,CAIrB,IAAI8H,GAAczI,EI/ZK,GJianB0I,EAAejI,EAAuBgI,GAEtCE,EAAa3I,EIlaK,GJoalB4I,EAAcnI,EAAuBkI,GAErCE,EAAU7I,EIraK,IJuaf8I,EAAWrI,EAAuBoI,GIra3BP,EAAWI,EAAA,YAAcA,EAAA,WAAWJ,SAAYF,OAAOE,OJyalE5I,GAAQ4I,QAAUA,CIvaX,IAAIS,GAAQH,EAAA,YAAaR,OAAOW,KJyavCrJ,GAAQqJ,MAAQA,CIxaT,IAAIC,GAAUD,EAAMC,SAAWZ,OAAOY,OJ0a7CtJ,GAAQsJ,QAAUA,CIzaX,IAAIC,GAAWF,EAAME,UAAYb,OAAOa,QJ2a/CvJ,GAAQuJ,SAAWA,CI1aZ,IAAIC,GAAUH,EAAMG,SAAWd,OAAOc,OJ6a7CxJ,GAAQwJ,QAAUA,CI3aX,IAAInE,GAAS+D,EAAA,YAAUV,OAAOrD,MJ8arCrF,GAAQqF,OAASA,CI5aV,IAAIV,GAAkC,mBAAX+D,SACwB,mBAAxBA,QAAO/D,aAAgC+D,OAAO/D,eJ6ahF3E,GAAQ2E,aAAeA,GAIjB,SAAS1E,EAAQD,EAASM,GAEhC,GAAgBmJ,IKjchB,SAAAC,EAAAC,EAAA1J,IAQA,WACA,YACA,SAAA2J,GAAAC,GACA,MAAA,kBAAAA,IAAA,gBAAAA,IAAA,OAAAA,EAGA,QAAAC,GAAAD,GACA,MAAA,kBAAAA,GAGA,QAAAE,GAAAF,GACA,MAAA,gBAAAA,IAAA,OAAAA,EAkBA,QAAAG,GAAAC,EAAA1C,GACA2C,GAAAC,GAAAF,EACAC,GAAAC,EAAA,GAAA5C,EACA4C,GAAA,EACA,IAAAA,IAIAC,EACAA,EAAAC,GAEAC,KAMA,QAAAC,GAAAC,GACAJ,EAAAI,EAcA,QAAAC,KACA,GAAAC,GAAAlC,QAAAkC,SAGAC,EAAAnC,QAAAoC,SAAAC,KAAAC,MAAA,qCAIA,OAHAjD,OAAAf,QAAA6D,IAAA,MAAAA,EAAA,IAAA,OAAAA,EAAA,KACAD,EAAAhB,GAEA,WACAgB,EAAAL,IAKA,QAAAU,KACA,MAAA,YACAC,EAAAX,IAIA,QAAAY,KACA,GAAAC,GAAA,EACAC,EAAA,GAAAC,IAAAf,GACAQ,EAAAQ,SAAAC,eAAA,GAGA,OAFAH,GAAAI,QAAAV,GAA8BW,eAAA,IAE9B,WACAX,EAAAY,KAAAP,IAAAA,EAAA,GAKA,QAAAQ,KACA,GAAAC,GAAA,GAAAC,eAEA,OADAD,GAAAE,MAAAC,UAAAzB,EACA,WACAsB,EAAAI,MAAAC,YAAA,IAIA,QAAAC,KACA,MAAA,YACA5D,WAAAgC,EAAA,IAKA,QAAAA,KACA,IAAA,GAAApI,GAAA,EAAqBkI,EAAAlI,EAA+BA,GAAA,EAAA,CACpD,GAAAgI,GAAAC,GAAAjI,GACAsF,EAAA2C,GAAAjI,EAAA,EAEAgI,GAAA1C,GAEA2C,GAAAjI,GAAAiK,OACAhC,GAAAjI,EAAA,GAAAiK,OAGA/B,EAAA,EAGA,QAAAgC,KACA,IACA,GACAC,GAAA9L,GAAA,WAAA,GAAA+L,GAAA,GAAAC,OAAA,6BAAA,MAAAD,GAAAE,KAAA,mBAAAF,KAEA,OADArB,GAAAoB,EAAAI,WAAAJ,EAAAK,aACA1B,IACO,MAAAsB,GACP,MAAAJ,MAkBA,QAAAS,MAQA,QAAAC,KACA,MAAA,IAAA/K,WAAA,4CAGA,QAAAgL,KACA,MAAA,IAAAhL,WAAA,wDAGA,QAAAiL,GAAAC,GACA,IACA,MAAAA,GAAAC,KACO,MAAAC,GAEP,MADAC,IAAAD,MAAAA,EACAC,IAIA,QAAAC,GAAAH,EAAAzH,EAAA6H,EAAAC,GACA,IACAL,EAAApM,KAAA2E,EAAA6H,EAAAC,GACO,MAAAf,GACP,MAAAA,IAIA,QAAAgB,GAAAP,EAAAQ,EAAAP,GACAQ,EAAA,SAAAT,GACA,GAAAU,IAAA,EACAR,EAAAE,EAAAH,EAAAO,EAAA,SAAAhI,GACAkI,IACAA,GAAA,EACAF,IAAAhI,EACAmI,EAAAX,EAAAxH,GAEAoI,EAAAZ,EAAAxH,KAES,SAAAqI,GACTH,IACAA,GAAA,EAEAI,EAAAd,EAAAa,KACS,YAAAb,EAAAe,QAAA,sBAETL,GAAAR,IACAQ,GAAA,EACAI,EAAAd,EAAAE,KAEOF,GAGP,QAAAgB,GAAAhB,EAAAQ,GACAA,EAAAS,SAAAC,GACAN,EAAAZ,EAAAQ,EAAAW,SACOX,EAAAS,SAAAG,GACPN,EAAAd,EAAAQ,EAAAW,SAEAE,EAAAb,EAAApB,OAAA,SAAA5G,GACAmI,EAAAX,EAAAxH,IACS,SAAAqI,GACTC,EAAAd,EAAAa,KAKA,QAAAS,GAAAtB,EAAAuB,GACA,GAAAA,EAAAC,cAAAxB,EAAAwB,YACAR,EAAAhB,EAAAuB,OACO,CACP,GAAAtB,GAAAF,EAAAwB,EAEAtB,KAAAE,GACAW,EAAAd,EAAAG,GAAAD,OACSd,SAAAa,EACTW,EAAAZ,EAAAuB,GACSvE,EAAAiD,GACTM,EAAAP,EAAAuB,EAAAtB,GAEAW,EAAAZ,EAAAuB,IAKA,QAAAZ,GAAAX,EAAAxH,GACAwH,IAAAxH,EACAsI,EAAAd,EAAAH,KACO/C,EAAAtE,GACP8I,EAAAtB,EAAAxH,GAEAoI,EAAAZ,EAAAxH,GAIA,QAAAiJ,GAAAzB,GACAA,EAAA0B,UACA1B,EAAA0B,SAAA1B,EAAAmB,SAGAQ,EAAA3B,GAGA,QAAAY,GAAAZ,EAAAxH,GACAwH,EAAAiB,SAAAW,KAEA5B,EAAAmB,QAAA3I,EACAwH,EAAAiB,OAAAC,GAEA,IAAAlB,EAAA6B,aAAAzM,QACAqL,EAAAkB,EAAA3B,IAIA,QAAAc,GAAAd,EAAAa,GACAb,EAAAiB,SAAAW,KACA5B,EAAAiB,OAAAG,GACApB,EAAAmB,QAAAN,EAEAJ,EAAAgB,EAAAzB,IAGA,QAAAqB,GAAAS,EAAAC,EAAAC,EAAAC,GACA,GAAAC,GAAAJ,EAAAD,aACAzM,EAAA8M,EAAA9M,MAEA0M,GAAAJ,SAAA,KAEAQ,EAAA9M,GAAA2M,EACAG,EAAA9M,EAAA8L,IAAAc,EACAE,EAAA9M,EAAAgM,IAAAa,EAEA,IAAA7M,GAAA0M,EAAAb,QACAR,EAAAkB,EAAAG,GAIA,QAAAH,GAAA3B,GACA,GAAAkC,GAAAlC,EAAA6B,aACAM,EAAAnC,EAAAiB,MAEA,IAAA,IAAAiB,EAAA9M,OAAA,CAIA,IAAA,GAFA2M,GAAA5E,EAAAiF,EAAApC,EAAAmB,QAEAhM,EAAA,EAAqBA,EAAA+M,EAAA9M,OAAwBD,GAAA,EAC7C4M,EAAAG,EAAA/M,GACAgI,EAAA+E,EAAA/M,EAAAgN,GAEAJ,EACAM,EAAAF,EAAAJ,EAAA5E,EAAAiF,GAEAjF,EAAAiF,EAIApC,GAAA6B,aAAAzM,OAAA,GAGA,QAAAkN,KACAhP,KAAA4M,MAAA,KAKA,QAAAqC,GAAApF,EAAAiF,GACA,IACA,MAAAjF,GAAAiF,GACO,MAAA7C,GAEP,MADAiD,IAAAtC,MAAAX,EACAiD,IAIA,QAAAH,GAAAF,EAAAnC,EAAA7C,EAAAiF,GACA,GACA5J,GAAA0H,EAAAuC,EAAAC,EADAC,EAAA3F,EAAAG,EAGA,IAAAwF,GAWA,GAVAnK,EAAA+J,EAAApF,EAAAiF,GAEA5J,IAAAgK,IACAE,GAAA,EACAxC,EAAA1H,EAAA0H,MACA1H,EAAA,MAEAiK,GAAA,EAGAzC,IAAAxH,EAEA,WADAsI,GAAAd,EAAAF,SAKAtH,GAAA4J,EACAK,GAAA,CAGAzC,GAAAiB,SAAAW,KAEOe,GAAAF,EACP9B,EAAAX,EAAAxH,GACOkK,EACP5B,EAAAd,EAAAE,GACOiC,IAAAjB,GACPN,EAAAZ,EAAAxH,GACO2J,IAAAf,IACPN,EAAAd,EAAAxH,IAIA,QAAAoK,GAAA5C,EAAA6C,GACA,IACAA,EAAA,SAAArK,GACAmI,EAAAX,EAAAxH,IACS,SAAAqI,GACTC,EAAAd,EAAAa,KAEO,MAAAtB,GACPuB,EAAAd,EAAAT,IAIA,QAAAuD,GAAAjO,EAAAkO,GACA,GAAAC,GAAA1P,IAEA0P,GAAAC,qBAAApO,EACAmO,EAAAhD,QAAA,GAAAnL,GAAA+K,GAEAoD,EAAAE,eAAAH,IACAC,EAAAG,OAAAJ,EACAC,EAAA5N,OAAA2N,EAAA3N,OACA4N,EAAAI,WAAAL,EAAA3N,OAEA4N,EAAAK,QAEA,IAAAL,EAAA5N,OACAwL,EAAAoC,EAAAhD,QAAAgD,EAAA7B,UAEA6B,EAAA5N,OAAA4N,EAAA5N,QAAA,EACA4N,EAAAM,aACA,IAAAN,EAAAI,YACAxC,EAAAoC,EAAAhD,QAAAgD,EAAA7B,WAIAL,EAAAkC,EAAAhD,QAAAgD,EAAAO,oBA2EA,QAAAC,GAAAC,GACA,MAAA,IAAAC,IAAApQ,KAAAmQ,GAAAzD,QAGA,QAAA2D,GAAAF,GAaA,QAAAzB,GAAAxJ,GACAmI,EAAAX,EAAAxH,GAGA,QAAAyJ,GAAApB,GACAC,EAAAd,EAAAa,GAhBA,GAAAhM,GAAAvB,KAEA0M,EAAA,GAAAnL,GAAA+K,EAEA,KAAAgE,EAAAH,GAEA,MADA3C,GAAAd,EAAA,GAAAlL,WAAA,oCACAkL,CAaA,KAAA,GAVA5K,GAAAqO,EAAArO,OAUAD,EAAA,EAAqB6K,EAAAiB,SAAAW,IAAAxM,EAAAD,EAAqEA,IAC1FkM,EAAAxM,EAAAkH,QAAA0H,EAAAtO,IAAAiK,OAAA4C,EAAAC,EAGA,OAAAjC,GAGA,QAAA6D,GAAAC,GAEA,GAAAjP,GAAAvB,IAEA,IAAAwQ,GAAA,gBAAAA,IAAAA,EAAAtC,cAAA3M,EACA,MAAAiP,EAGA,IAAA9D,GAAA,GAAAnL,GAAA+K,EAEA,OADAe,GAAAX,EAAA8D,GACA9D,EAGA,QAAA+D,GAAAlD,GAEA,GAAAhM,GAAAvB,KACA0M,EAAA,GAAAnL,GAAA+K,EAEA,OADAkB,GAAAd,EAAAa,GACAb,EAMA,QAAAgE,KACA,KAAA,IAAAlP,WAAA,sFAGA,QAAAmP,KACA,KAAA,IAAAnP,WAAA,yHA2GA,QAAAoP,GAAArB,GACAvP,KAAA6Q,IAAAC,KACA9Q,KAAA2N,OAAA7B,OACA9L,KAAA6N,QAAA/B,OACA9L,KAAAuO,gBAEAjC,IAAAiD,IACA7F,EAAA6F,IACAmB,IAGA1Q,eAAA4Q,IACAD,IAGArB,EAAAtP,KAAAuP,IAqQA,QAAAwB,KACA,GAAAC,EAEA,IAAA,mBAAAzH,GACAyH,EAAAzH,MACO,IAAA,mBAAA0H,MACPD,EAAAC,SAEA,KACAD,EAAAE,SAAA,iBACW,MAAAjF,GACX,KAAA,IAAAC,OAAA,4EAIA,GAAAiF,GAAAH,EAAAxI,UAEA2I,GAAA,qBAAAjQ,OAAAC,UAAAiQ,SAAA7Q,KAAA4Q,EAAA1I,YAAA0I,EAAAE,QAIAL,EAAAxI,QAAA8I,IA75BA,GAAAC,EAMAA,GALA9J,MAAAf,QAKAe,MAAAf,QAJA,SAAA+C,GACA,MAAA,mBAAAvI,OAAAC,UAAAiQ,SAAA7Q,KAAAkJ,GAMA,IAGAmB,GACAZ,EA0GAE,EA9GAoG,EAAAiB,EACAxH,EAAA,EAqBAoD,MApB2CiE,SAoB3CxH,GAKA4H,EAAA,mBAAAlJ,QAAAA,OAAAwD,OACA2F,EAAAD,MACAxG,GAAAyG,EAAAC,kBAAAD,EAAAE,uBACAC,GAAA,mBAAAxJ,UAA2E,wBAAAgJ,SAAA7Q,KAAA6H,SAG3EyJ,GAAA,mBAAAC,oBACA,mBAAAC,gBACA,mBAAAvG,gBAiDA1B,GAAA,GAAArC,OAAA,IA6BAyC,GADA0H,GACAvH,IACKW,GACLH,IACKgH,GACLvG,IACKQ,SAAA0F,EACLzF,IAEAF,GAKA,IAAAyC,IAAA,OACAV,GAAA,EACAE,GAAA,EAEAjB,GAAA,GAAAmC,GAkKAE,GAAA,GAAAF,EAwFAQ,GAAArO,UAAAyO,eAAA,SAAAH,GACA,MAAAa,GAAAb,IAGAD,EAAArO,UAAA8O,iBAAA,WACA,MAAA,IAAA/D,OAAA,4CAGAsD,EAAArO,UAAA4O,MAAA,WACA/P,KAAA6N,QAAA,GAAApG,OAAAzH,KAAA8B,QAGA,IAAAsO,IAAAZ,CAEAA,GAAArO,UAAA6O,WAAA,WAOA,IAAA,GANAN,GAAA1P,KAEA8B,EAAA4N,EAAA5N,OACA4K,EAAAgD,EAAAhD,QACA+C,EAAAC,EAAAG,OAEAhO,EAAA,EAAqB6K,EAAAiB,SAAAW,IAAAxM,EAAAD,EAAqEA,IAC1F6N,EAAAsC,WAAAvC,EAAA5N,GAAAA,IAIA2N,EAAArO,UAAA6Q,WAAA,SAAAC,EAAApQ,GACA,GAAA6N,GAAA1P,KACAS,EAAAiP,EAAAC,oBAEAhG,GAAAsI,GACAA,EAAA/D,cAAAzN,GAAAwR,EAAAtE,SAAAW,IACA2D,EAAA7D,SAAA,KACAsB,EAAAwC,WAAAD,EAAAtE,OAAA9L,EAAAoQ,EAAApE,UAEA6B,EAAAyC,cAAA1R,EAAAgI,QAAAwJ,GAAApQ,IAGA6N,EAAAI,aACAJ,EAAA7B,QAAAhM,GAAAoQ,IAIAzC,EAAArO,UAAA+Q,WAAA,SAAAE,EAAAvQ,EAAAqD,GACA,GAAAwK,GAAA1P,KACA0M,EAAAgD,EAAAhD,OAEAA,GAAAiB,SAAAW,KACAoB,EAAAI,aAEAsC,IAAAtE,GACAN,EAAAd,EAAAxH,GAEAwK,EAAA7B,QAAAhM,GAAAqD,GAIA,IAAAwK,EAAAI,YACAxC,EAAAZ,EAAAgD,EAAA7B,UAIA2B,EAAArO,UAAAgR,cAAA,SAAAzF,EAAA7K,GACA,GAAA6N,GAAA1P,IAEA+N,GAAArB,EAAAZ,OAAA,SAAA5G,GACAwK,EAAAwC,WAAAtE,GAAA/L,EAAAqD,IACO,SAAAqI,GACPmC,EAAAwC,WAAApE,GAAAjM,EAAA0L,KAMA,IAAA8E,IAAAnC,EA4BAoC,GAAAjC,EAaAkC,GAAAhC,EAQAiC,GAAA/B,EAEAK,GAAA,EAUAQ,GAAAV,CA2HAA,GAAA6B,IAAAJ,GACAzB,EAAA8B,KAAAJ,GACA1B,EAAAnI,QAAA8J,GACA3B,EAAAlI,OAAA8J,GACA5B,EAAA+B,cAAAxI,EACAyG,EAAAgC,MAAAzF,EAEAyD,EAAAzP,WACA+M,YAAA0C,EAmMAjE,KAAA,SAAA+B,EAAAC,GACA,GAAAH,GAAAxO,KACAoS,EAAA5D,EAAAb,MAEA,IAAAyE,IAAAxE,KAAAc,GAAA0D,IAAAtE,KAAAa,EACA,MAAA3O,KAGA,IAAAyO,GAAA,GAAAzO,MAAAkO,YAAA5B,GACAuG,EAAArE,EAAAX,OAEA,IAAAuE,EAAA,CACA,GAAAvI,GAAAiJ,UAAAV,EAAA,EACAjF,GAAA,WACA4B,EAAAqD,EAAA3D,EAAA5E,EAAAgJ,SAGA9E,GAAAS,EAAAC,EAAAC,EAAAC,EAGA,OAAAF,IA8BAsE,QAAA,SAAApE,GACA,MAAA3O,MAAA2M,KAAA,KAAAgC,IA0BA,IAAAqE,IAAAjC,EAEAkC,IACAzK,QAAA8I,GACA4B,SAAAF,GAIA9S,GAAA,GAAA,KACAmJ,EAAA,WAAyB,MAAA4J,KAA0C1S,KAAAX,EAAAM,EAAAN,EAAAC,KAAAiM,SAAAzC,IAAAxJ,EAAAD,QAAAyJ,KAC9D,mBAAAxJ,IAAAA,EAAA,QACLA,EAAA,QAAAoT,GACK,mBAAAjT,QACLA,KAAA,WAAAiT,IAGAD,OACCzS,KAAAP,QLoc4BO,KAAKX,EAASM,EAAoB,GAAGoJ,aAAe,WAAa,MAAOtJ,SAAYE,EAAoB,GAAGL,KAIlI,SAASA,EAAQD,EAASM,IM94ChC,SAAAoJ,EAAA6J,GAiBA,QAAAC,GAAA/S,EAAAgT,GACArT,KAAA6Q,IAAAxQ,EACAL,KAAAsT,SAAAD,EAnBA,GAAA/I,GAAApK,EAAA,GAAAoK,SACAiJ,EAAArC,SAAA/P,UAAAoS,MACAC,EAAA/L,MAAAtG,UAAAqS,MACAC,KACAC,EAAA,CAIA9T,GAAAqI,WAAA,WACA,MAAA,IAAAmL,GAAAG,EAAAhT,KAAA0H,WAAAK,OAAAwK,WAAA5K,eAEAtI,EAAA+T,YAAA,WACA,MAAA,IAAAP,GAAAG,EAAAhT,KAAAoT,YAAArL,OAAAwK,WAAAc,gBAEAhU,EAAAsI,aACAtI,EAAAgU,cAAA,SAAA/L,GAA2CA,EAAAgM,SAM3CT,EAAAjS,UAAA2S,MAAAV,EAAAjS,UAAA4S,IAAA,aACAX,EAAAjS,UAAA0S,MAAA,WACA7T,KAAAsT,SAAA/S,KAAA+H,OAAAtI,KAAA6Q,MAIAjR,EAAAoU,OAAA,SAAAC,EAAAC,GACAhM,aAAA+L,EAAAE,gBACAF,EAAAG,aAAAF,GAGAtU,EAAAyU,SAAA,SAAAJ,GACA/L,aAAA+L,EAAAE,gBACAF,EAAAG,aAAA,IAGAxU,EAAA0U,aAAA1U,EAAA2U,OAAA,SAAAN,GACA/L,aAAA+L,EAAAE,eAEA,IAAAD,GAAAD,EAAAG,YACAF,IAAA,IACAD,EAAAE,eAAAlM,WAAA,WACAgM,EAAAO,YACAP,EAAAO,cACKN,KAKLtU,EAAA0J,aAAA,kBAAAA,GAAAA,EAAA,SAAA3B,GACA,GAAAtH,GAAAqT,IACAe,EAAA3B,UAAAhR,OAAA,GAAA,EAAA0R,EAAAjT,KAAAuS,UAAA,EAkBA,OAhBAW,GAAApT,IAAA,EAEAiK,EAAA,WACAmJ,EAAApT,KAGAoU,EACA9M,EAAA4L,MAAA,KAAAkB,GAEA9M,EAAApH,KAAA,MAGAX,EAAAuT,eAAA9S,MAIAA,GAGAT,EAAAuT,eAAA,kBAAAA,GAAAA,EAAA,SAAA9S,SACAoT,GAAApT,MNk5C6BE,KAAKX,EAASM,EAAoB,GAAGoJ,aAAcpJ,EAAoB,GAAGiT,iBAIjG,SAAStT,EAAQD,GOx9CvB,QAAA8U,KACAC,GAAA,EACAC,EAAA9S,OACA+S,EAAAD,EAAAE,OAAAD,GAEAE,EAAA,GAEAF,EAAA/S,QACAkT,IAIA,QAAAA,KACA,IAAAL,EAAA,CAGA,GAAA9M,GAAAI,WAAAyM,EACAC,IAAA,CAGA,KADA,GAAAM,GAAAJ,EAAA/S,OACAmT,GAAA,CAGA,IAFAL,EAAAC,EACAA,OACAE,EAAAE,GACAL,GACAA,EAAAG,GAAAG,KAGAH,GAAA,GACAE,EAAAJ,EAAA/S,OAEA8S,EAAA,KACAD,GAAA,EACAzM,aAAAL,IAiBA,QAAAsN,GAAAC,EAAA/O,GACArG,KAAAoV,IAAAA,EACApV,KAAAqG,MAAAA,EAYA,QAAAgP,MAtEA,GAGAT,GAHAxM,EAAAvI,EAAAD,WACAiV,KACAF,GAAA,EAEAI,EAAA,EAsCA3M,GAAAkC,SAAA,SAAA8K,GACA,GAAAX,GAAA,GAAAhN,OAAAqL,UAAAhR,OAAA,EACA,IAAAgR,UAAAhR,OAAA,EACA,IAAA,GAAAD,GAAA,EAAuBA,EAAAiR,UAAAhR,OAAsBD,IAC7C4S,EAAA5S,EAAA,GAAAiR,UAAAjR,EAGAgT,GAAAjO,KAAA,GAAAuO,GAAAC,EAAAX,IACA,IAAAI,EAAA/S,QAAA6S,GACA1M,WAAA+M,EAAA,IASAG,EAAAhU,UAAA+T,IAAA,WACAlV,KAAAoV,IAAA7B,MAAA,KAAAvT,KAAAqG,QAEA+B,EAAAkN,MAAA,UACAlN,EAAAmN,SAAA,EACAnN,EAAAoN,OACApN,EAAAqN,QACArN,EAAAmC,QAAA,GACAnC,EAAAoC,YAIApC,EAAAsN,GAAAL,EACAjN,EAAAuN,YAAAN,EACAjN,EAAAwN,KAAAP,EACAjN,EAAAyN,IAAAR,EACAjN,EAAA0N,eAAAT,EACAjN,EAAA2N,mBAAAV,EACAjN,EAAA4N,KAAAX,EAEAjN,EAAA6N,QAAA,SAAAC,GACA,KAAA,IAAAhK,OAAA,qCAGA9D,EAAA+N,IAAA,WAA2B,MAAA,KAC3B/N,EAAAgO,MAAA,SAAAC,GACA,KAAA,IAAAnK,OAAA,mCAEA9D,EAAAkO,MAAA,WAA4B,MAAA,KPu+CtB,SAASzW,EAAQD,GQjkDvBC,EAAAD,QAAA,SAAAC,GAQA,MAPAA,GAAA0W,kBACA1W,EAAA2W,UAAA,aACA3W,EAAA4W,SAEA5W,EAAA6W,YACA7W,EAAA0W,gBAAA,GAEA1W,IRykDM,SAASA,EAAQD,GSjlDvBC,EAAAD,QAAA,WAA6B,KAAA,IAAAsM,OAAA,oCTwlDvB,SAASrM,EAAQD,IUxlDvB,WACA,YAMA,SAAA+W,GAAAT,GAIA,GAHA,gBAAAA,KACAA,EAAAU,OAAAV,IAEA,6BAAAW,KAAAX,GACA,KAAA,IAAA1U,WAAA,yCAEA,OAAA0U,GAAAY,cAGA,QAAAC,GAAA7R,GAIA,MAHA,gBAAAA,KACAA,EAAA0R,OAAA1R,IAEAA,EAGA,QAAAkE,GAAA4N,GACAhX,KAAAiX,OAEAD,YAAA5N,GACA4N,EAAAzQ,QAAA,SAAArB,EAAAgR,GACAlW,KAAAkX,OAAAhB,EAAAhR,IACOlF,MAEFgX,GACL9V,OAAAiW,oBAAAH,GAAAzQ,QAAA,SAAA2P,GACAlW,KAAAkX,OAAAhB,EAAAc,EAAAd,KACOlW,MA4CP,QAAAoX,GAAAC,GACA,MAAAA,GAAAC,SACA9O,QAAAE,OAAA,GAAAlH,WAAA,sBAEA6V,EAAAC,UAAA,GAGA,QAAAC,GAAAC,GACA,MAAA,IAAAhP,SAAA,SAAAC,EAAAC,GACA8O,EAAAC,OAAA,WACAhP,EAAA+O,EAAA3E,SAEA2E,EAAAE,QAAA,WACAhP,EAAA8O,EAAA5K,UAKA,QAAA+K,GAAAC,GACA,GAAAJ,GAAA,GAAAK,WAEA,OADAL,GAAAM,kBAAAF,GACAL,EAAAC,GAGA,QAAAO,GAAAH,GACA,GAAAJ,GAAA,GAAAK,WAEA,OADAL,GAAAQ,WAAAJ,GACAL,EAAAC,GAeA,QAAAS,KAsEA,MArEAjY,MAAAsX,UAAA,EAGAtX,KAAAkY,UAAA,SAAAb,GAEA,GADArX,KAAAmY,UAAAd,EACA,gBAAAA,GACArX,KAAAoY,UAAAf,MACO,IAAAgB,EAAAT,MAAAU,KAAAnX,UAAAoX,cAAAlB,GACPrX,KAAAwY,UAAAnB,MACO,IAAAgB,EAAAI,UAAAC,SAAAvX,UAAAoX,cAAAlB,GACPrX,KAAA2Y,cAAAtB,MACO,CAAA,GAAAA,EAGP,KAAA,IAAAnL,OAAA,4BAFAlM,MAAAoY,UAAA,KAMAC,EAAAT,MACA5X,KAAA4X,KAAA,WACA,GAAAgB,GAAAxB,EAAApX,KACA,IAAA4Y,EACA,MAAAA,EAGA,IAAA5Y,KAAAwY,UACA,MAAAhQ,SAAAC,QAAAzI,KAAAwY,UACS,IAAAxY,KAAA2Y,cACT,KAAA,IAAAzM,OAAA,uCAEA,OAAA1D,SAAAC,QAAA,GAAA6P,OAAAtY,KAAAoY,cAIApY,KAAA6Y,YAAA,WACA,MAAA7Y,MAAA4X,OAAAjL,KAAAgL,IAGA3X,KAAA8Y,KAAA,WACA,GAAAF,GAAAxB,EAAApX,KACA,IAAA4Y,EACA,MAAAA,EAGA,IAAA5Y,KAAAwY,UACA,MAAAT,GAAA/X,KAAAwY,UACS,IAAAxY,KAAA2Y,cACT,KAAA,IAAAzM,OAAA,uCAEA,OAAA1D,SAAAC,QAAAzI,KAAAoY,aAIApY,KAAA8Y,KAAA,WACA,GAAAF,GAAAxB,EAAApX,KACA,OAAA4Y,GAAAA,EAAApQ,QAAAC,QAAAzI,KAAAoY,YAIAC,EAAAI,WACAzY,KAAAyY,SAAA,WACA,MAAAzY,MAAA8Y,OAAAnM,KAAAoM,KAIA/Y,KAAAgZ,KAAA,WACA,MAAAhZ,MAAA8Y,OAAAnM,KAAAsM,KAAAC,QAGAlZ,KAMA,QAAAmZ,GAAAC,GACA,GAAAC,GAAAD,EAAAE,aACA,OAAAC,GAAAlS,QAAAgS,GAAA,GAAAA,EAAAD,EAGA,QAAAlQ,GAAAuG,EAAApL,GACAA,EAAAA,KACA,IAAAgT,GAAAhT,EAAAgT,IACA,IAAAnO,EAAA/H,UAAAoX,cAAA9I,GAAA,CACA,GAAAA,EAAA6H,SACA,KAAA,IAAA9V,WAAA,eAEAxB,MAAAwZ,IAAA/J,EAAA+J,IACAxZ,KAAAyZ,YAAAhK,EAAAgK,YACApV,EAAA2S,UACAhX,KAAAgX,QAAA,GAAA5N,GAAAqG,EAAAuH,UAEAhX,KAAAoZ,OAAA3J,EAAA2J,OACApZ,KAAA0Z,KAAAjK,EAAAiK,KACArC,IACAA,EAAA5H,EAAA0I,UACA1I,EAAA6H,UAAA,OAGAtX,MAAAwZ,IAAA/J,CAWA,IARAzP,KAAAyZ,YAAApV,EAAAoV,aAAAzZ,KAAAyZ,aAAA,QACApV,EAAA2S,UAAAhX,KAAAgX,WACAhX,KAAAgX,QAAA,GAAA5N,GAAA/E,EAAA2S,UAEAhX,KAAAoZ,OAAAD,EAAA9U,EAAA+U,QAAApZ,KAAAoZ,QAAA,OACApZ,KAAA0Z,KAAArV,EAAAqV,MAAA1Z,KAAA0Z,MAAA,KACA1Z,KAAA2Z,SAAA,MAEA,QAAA3Z,KAAAoZ,QAAA,SAAApZ,KAAAoZ,SAAA/B,EACA,KAAA,IAAA7V,WAAA,4CAEAxB,MAAAkY,UAAAb,GAGA,QAAA0B,GAAA1B,GACA,GAAAuC,GAAA,GAAAlB,SASA,OARArB,GAAA/P,OAAAJ,MAAA,KAAAX,QAAA,SAAAsT,GACA,GAAAA,EAAA,CACA,GAAA3S,GAAA2S,EAAA3S,MAAA,KACAgP,EAAAhP,EAAA4S,QAAAC,QAAA,MAAA,KACA7U,EAAAgC,EAAAJ,KAAA,KAAAiT,QAAA,MAAA,IACAH,GAAA1C,OAAA9P,mBAAA8O,GAAA9O,mBAAAlC,OAGA0U,EAGA,QAAA5C,GAAAgD,GACA,GAAAC,GAAA,GAAA7Q,GACA8Q,EAAAF,EAAAG,wBAAA7S,OAAAJ,MAAA,KAOA,OANAgT,GAAA3T,QAAA,SAAA6T,GACA,GAAAlT,GAAAkT,EAAA9S,OAAAJ,MAAA,KACAjG,EAAAiG,EAAA4S,QAAAxS,OACApC,EAAAgC,EAAAJ,KAAA,KAAAQ,MACA2S,GAAA/C,OAAAjW,EAAAiE,KAEA+U,EAKA,QAAA9Q,GAAAkR,EAAAhW,GACAA,IACAA,MAGArE,KAAAkY,UAAAmC,GACAra,KAAAsa,KAAA,UACAta,KAAAwZ,IAAA,KACAxZ,KAAAua,OAAAlW,EAAAkW,OACAva,KAAAwa,GAAAxa,KAAAua,QAAA,KAAAva,KAAAua,OAAA,IACAva,KAAAya,WAAApW,EAAAoW,WACAza,KAAAgX,QAAA3S,EAAA2S,kBAAA5N,GAAA/E,EAAA2S,QAAA,GAAA5N,GAAA/E,EAAA2S,SACAhX,KAAAwZ,IAAAnV,EAAAmV,KAAA,GAlRA,IAAAvI,KAAAhI,MAAA,CAoCAG,EAAAjI,UAAA+V,OAAA,SAAAhB,EAAAhR,GACAgR,EAAAS,EAAAT,GACAhR,EAAA6R,EAAA7R,EACA,IAAAwV,GAAA1a,KAAAiX,IAAAf,EACAwE,KACAA,KACA1a,KAAAiX,IAAAf,GAAAwE,GAEAA,EAAA9T,KAAA1B,IAGAkE,EAAAjI,UAAA,UAAA,SAAA+U,SACAlW,MAAAiX,IAAAN,EAAAT,KAGA9M,EAAAjI,UAAAwZ,IAAA,SAAAzE,GACA,GAAA0E,GAAA5a,KAAAiX,IAAAN,EAAAT,GACA,OAAA0E,GAAAA,EAAA,GAAA,MAGAxR,EAAAjI,UAAA0Z,OAAA,SAAA3E,GACA,MAAAlW,MAAAiX,IAAAN,EAAAT,SAGA9M,EAAAjI,UAAA2Z,IAAA,SAAA5E,GACA,MAAAlW,MAAAiX,IAAA7V,eAAAuV,EAAAT,KAGA9M,EAAAjI,UAAA4Z,IAAA,SAAA7E,EAAAhR,GACAlF,KAAAiX,IAAAN,EAAAT,KAAAa,EAAA7R,KAGAkE,EAAAjI,UAAAoF,QAAA,SAAAsD,EAAAmR,GACA9Z,OAAAiW,oBAAAnX,KAAAiX,KAAA1Q,QAAA,SAAA2P,GACAlW,KAAAiX,IAAAf,GAAA3P,QAAA,SAAArB,GACA2E,EAAAtJ,KAAAya,EAAA9V,EAAAgR,EAAAlW,OACOA,OACFA,MAiCL,IAAAqY,IACAT,KAAA,cAAA3G,OAAA,QAAAA,OAAA,WACA,IAEA,MADA,IAAAqH,OACA,EACO,MAAArM,GACP,OAAA,MAGAwM,SAAA,YAAAxH,OA6EAsI,GAAA,SAAA,MAAA,OAAA,UAAA,OAAA,MAoEAtB,GAAA1X,KAAA2I,EAAA/H,WAiBA8W,EAAA1X,KAAA4I,EAAAhI,WAEA8P,KAAA7H,QAAAA,EACA6H,KAAA/H,QAAAA,EACA+H,KAAA9H,SAAAA,EAEA8H,KAAAhI,MAAA,SAAAwG,EAAAwL,GACA,GAAAC,EAOA,OALAA,GADAhS,EAAA/H,UAAAoX,cAAA9I,KAAAwL,EACAxL,EAEA,GAAAvG,GAAAuG,EAAAwL,GAGA,GAAAzS,SAAA,SAAAC,EAAAC,GAGA,QAAAyS,KACA,MAAA,eAAAnB,GACAA,EAAAmB,YAIA,mBAAAtE,KAAAmD,EAAAG,yBACAH,EAAAoB,kBAAA,iBADA,OARA,GAAApB,GAAA,GAAAqB,eAeArB,GAAAvC,OAAA,WACA,GAAA8C,GAAA,OAAAP,EAAAO,OAAA,IAAAP,EAAAO,MACA,IAAA,IAAAA,GAAAA,EAAA,IAEA,WADA7R,GAAA,GAAAlH,WAAA,0BAGA,IAAA6C,IACAkW,OAAAA,EACAE,WAAAT,EAAAS,WACAzD,QAAAA,EAAAgD,GACAR,IAAA2B,KAEA9D,EAAA,YAAA2C,GAAAA,EAAAsB,SAAAtB,EAAAuB,YACA9S,GAAA,GAAAU,GAAAkO,EAAAhT,KAGA2V,EAAAtC,QAAA,WACAhP,EAAA,GAAAlH,WAAA,4BAGAwY,EAAAwB,KAAAN,EAAA9B,OAAA8B,EAAA1B,KAAA,GAEA,YAAA0B,EAAAzB,cACAO,EAAAyB,iBAAA,GAGA,gBAAAzB,IAAA3B,EAAAT,OACAoC,EAAA0B,aAAA,QAGAR,EAAAlE,QAAAzQ,QAAA,SAAArB,EAAAgR,GACA8D,EAAA2B,iBAAAzF,EAAAhR,KAGA8U,EAAA4B,KAAA,mBAAAV,GAAA/C,UAAA,KAAA+C,EAAA/C,cAGAlH,KAAAhI,MAAAiK,UAAA,OVgmDM,SAASrT,OAAQD,QAASM,sBW37DhC,SAAAL,QA0KA,QAAAgc,UAAmB,MAAA,OAAAC,MAAA,GAAAC,MACnB,QAAAC,QAAmB,OAAA,GAAAD,MA0BnB,QAAAE,WAAAC,EAAAC,GACA,GAAA3C,GAAA0C,EAAApV,KAAAsV,QACAC,IAEA,OAAAF,IAEAG,KAAAH,EAAA,SAAAlb,EAAAiE,GACA,GAAAqX,GAAA,gBAAArX,GAAA+T,KAAA,UAAA/T,GAAAA,CACA,oBAAAA,IACA,MAAAA,GAAAsX,OAAAD,GAAAza,OAAA,GACAua,EAAAzV,KAAA3F,EAAA,IAAAub,OAAAD,MAGA/C,GAAA,IAAA6C,EAAAvV,KAAA2V,YATAjD,EAkBA,QAAAkD,SAAAtH,EAAAuH,GACA,GAAA9U,GACA+U,EAAA,EACAC,EAAA,WACAD,EAAAD,EAAAX,QACA9T,aAAAL,GACAA,EAAAI,WAAA4U,EAAAF,KAGAC,EAAAZ,OACA5G,KAIA,OAAAyH,GAQA,QAAAC,MAAApC,EAAAtF,GACA,GAAA2H,KAEA,OADAT,MAAA5B,MAAA,SAAAsC,GAAmC5H,EAAA4H,IAAAD,EAAAnW,KAAAoW,KACnCD,EAQA,QAAAE,UAAAC,EAAAtC,GACA,MAAAsC,GAAAnD,QAAAoD,KAAA,SAAAC,EAAA1S,GACA,MAAAkQ,GAAAlQ,IAAA0S,IASA,QAAAvV,SAAAuN,EAAAiI,GACA,MAAApV,YAAAmN,EAAAiI,GAQA,QAAAC,eAAAzT,GACA,GAAA0T,GAAA,uCAAAxD,QAAA,QACA,SAAAtZ,GACA,GAAA+c,GAAA,GAAAC,KAAAC,SAAA,EAAAjX,EAAA,KAAAhG,EAAA+c,EAAA,EAAAA,EAAA,CACA,OAAA/W,GAAA2K,SAAA,KAGA,OADAvH,IAAAA,EAAA0T,GACAA,EAGA,QAAA7W,SAAAS,GACA,QAAAA,GAAA,gBAAAA,KAAAM,MAAAf,SAAAe,MAAAf,QAAAS,IAAA,gBAAAA,GAAA,QASA,QAAAmV,MAAAqB,EAAAC,GACA,GAAAD,GAAAC,EAEA,GAAAlX,QAAAiX,GACA,IAAA,GAAA9b,GAAA,EAAAmb,EAAAW,EAAA7b,OAAsCkb,EAAAnb,GACtC+b,EAAArd,KAAAod,EAAA9b,GAAA8b,EAAA9b,GAAAA,SAEA,KAAA,GAAAA,KAAA8b,GACAA,EAAAvc,gBACAuc,EAAAvc,eAAAS,IACA+b,EAAArd,KAAAod,EAAA9b,GAAAA,EAAA8b,EAAA9b,IAQA,QAAAoV,KAAAyD,EAAAtF,GACA,GAAA2H,KAEA,OADAT,MAAA5B,MAAA,SAAAlU,EAAAC,GAAwCsW,EAAAnW,KAAAwO,EAAA5O,EAAAC,MACxCsW,EAIA,QAAAc,YAAAX,GACA,MAAArW,oBAAAqW,GAAAnD,QAAA,YAAA,SAAAtZ,GACA,MAAA,IAAAA,EAAAqd,WAAA,GAAA1M,SAAA,IAAAkI,gBASA,QAAAkD,QAAAuB,GAAuB,MAAAlX,oBAAAkX,GAOvB,QAAAC,uBAAAC,EAAAC,GACA,GAAAxD,KAUA,OATA4B,MAAA2B,EAAA,SAAA1S,EAAAgP,GACA2D,EACA3S,EAAA4S,OAAA,WAAA,GACA5D,EAAA6D,YAAA1D,EAAA9T,KAAA2E,GAGAgP,EAAA6D,YAAA1D,EAAA9T,KAAA2E,KAGAmP,EAAA2D,OAQA,QAAAC,6BAAAC,EAAAL,GACA,GAAAxD,KAUA,OATA4B,MAAAiC,EAAA,SAAAC,EAAAjE,GACA2D,EACAM,EAAAL,OAAA,WAAA,GACA5D,EAAA6D,YAAA1D,EAAA9T,KAAA4X,GAGAjE,EAAA6D,YAAA1D,EAAA9T,KAAA4X,KAGA9D,EAAA2D,OAIA,QAAAI,SAAkB5W,QAAA,WAClB6W,QACAA,MAAA,EACApC,KAAAqC,aAAA,SAAAC,GAA2CA,QAC1CC,QAED,QAAAC,WAAArK,GAoDA,MAnDAsK,KAAAtK,IAAmBuK,SACnBD,IAAA,iBAAA,WACA,GAAAve,KAEA,IAAAU,OAAAoF,KAAAyY,IAAA,MAAAjd,OAAA,CACAtB,EAAA,SACAye,KACAC,MAAAH,IAAA,KAAA,MACAI,MAAAJ,IAAA,KAAA,OAGA,KAAA,GAAAvY,KAAAuY,KAAA,KACAve,EAAA,QAAAgG,GAAAuY,IAAA,KAAAvY,EAEA,IAAA4Y,IAAA,QAAA,QACA,KAAA,GAAA5Y,KAAA4Y,SACA5e,GAAA,QAAA4e,EAAA5Y,IAMAuY,IAAA,MACAve,EAAA,QACA6K,KAAA0T,IAAA,KAIA,KAAA,GAAAvY,KAAAuY,KACAve,EAAAgG,GAAAuY,IAAAvY,EAEA,IAAA6Y,IAAA,OAAA,MAAA,UAAA,UAAA,WAAA,QACA,KAAA,GAAA7Y,KAAA6Y,SACA7e,GAAA6e,EAAA7Y,GAGA,OAAAhG,IAEAue,IAAA,QAAA,WAEA,GAAAve,GAAAue,IAAAO,kBAEAP,KAAA,QAAAA,IAAA,SACAA,IAAA,OAAAQ,SACAC,QAAAhf,EACA+K,QAAAwT,IAAA,QACAlV,SAAAkV,IAAA,SACAnS,MAAAmS,IAAA,SAIAA,IAGA,QAAAU,QAAAC,GA8DA,QAAAC,GAAAtU,GAKA,MAJAA,KAAAA,MACAiR,KAAAD,GAAA,SAAApb,EAAAiE,GACAjE,IAAAoK,KAAAA,EAAApK,GAAAiE,KAEAmG,EAGA,QAAAuU,GAAAjC,GACA,GAAAX,KAIA,OAHAV,MAAAqB,EAAA,SAAA1c,EAAAiE,GACA8X,EAAApW,KAAA3F,KAEA+b,EAEA,QAAA6C,GAAAlC,GACA,MAAAiC,GAAAjC,GAAAU,OAGA,QAAAyB,GAAAzD,GACA,GAAA0D,GAAA,GACA/C,EAAA6C,EAAAxD,EAEA,KAAA,GAAAxa,KAAAmb,GAAA,CACA,GAAAxW,GAAAwW,EAAAnb,EACAke,IAAAvZ,EAAA,IAAAqX,WAAAxB,EAAA7V,IACA3E,GAAAmb,EAAAlb,OAAA,IAAAie,GAAA,KAEA,MAAAA,GAGA,QAAAC,GAAAC,EAAAC,EAAAtT,GACA,GAAAuT,IAAA,CAEA,IAAA,mBAAAF,GACA,MAAAC,EAGA,IAAA,gBAAAD,GAEAE,EADAF,EAAAG,uBAAA,GAAAH,GACA,GAEA,MACS,CAAA,GAAA,iBAAAA,GACT,MAAAA,GAGAI,oBAFA,CAKAF,IAAA,EAGA,MAAAA,IACAvT,GAAAA,EAAA,uDAAAwT,sBAAA,gCAAAF,GAAAE,wBACAF,GAAAE,uBACSH,EAGT,QAAAK,GAAA7Q,EAAAxO,GACA,MAAAsf,IAAA,QAAA9Q,EAAAxO,GAAAuf,KAAA/Q,EAEA,QAAAgR,GAAAhR,EAAAxO,GACA,MAAAsf,IAAA,QAAA9Q,EAAAxO,GAAAuf,KACAD,GAAA,QAAA9Q,EAAA+Q,KACA/Q,EAOA,QAAAiR,KAIA,MAFAxY,cAAAyY,IAEAC,IAAAA,IAAA,KACA,EAAAA,KACA5C,sBAAA6C,GAAA,GAAA/e,SAAAwc,4BAAAwC,GAAA,GAAAhf,YAEAif,IAAA,IAIAA,IAAA,MACAC,IAAA,oBACAnX,SAAA,SAAA2T,GACAmD,EAAA9Y,QAAA6Y,EAAA,GAAA7B,SAEAjS,MAAA,SAAAX,GACAW,IAAAA,GAAA,qDAAAqM,KAAAgI,UAAAhV,IACA0U,EAAA9Y,QAAA6Y,EAAA,GAAA7B,YAKA,QAAAqC,MACAH,IAAAL,IAGA,QAAAnB,GAAAxX,GAEA,GAAAoZ,IACA,IAAAC,EAAAtf,OAAA,WACS,CAET,GADAiG,IAAAqZ,EAAAC,QAAA,GACAD,EAAAC,UAAAD,EAAAtf,OAAA,MACAsf,GAAAC,QAAA,EAGAC,GAAAF,EAAAtH,SAEA,QAAAyH,GAAA1X,GACA,GAAA2X,GAAA,CAWA,OATAlF,MAAAgC,4BAAAwC,GAAA,SAAAtC,GACA,GAAAiD,GAAAX,EAAAtC,EAEAiD,KAEAD,KACA3X,GAAA,cAAmC4X,MAGnCD,EAGA,QAAAE,GAAA7X,GACA,GAAA2X,GAAA,CAWA,OATAlF,MAAA0B,sBAAA6C,GAAA,SAAAtV,GACA,GAAAoW,GAAAd,EAAAtV,EAEAoW,KAEAH,KACA3X,GAAA,cAAmC8X,MAGnCH,EAEA,QAAAI,GAAAtG,EAAAzR,EAAAsW,GACA,GAAA,gBAAA7E,GAAA,CACA,GAAAA,EAAA,MAAA,CACA,GAAAuG,KAWA,OATAvG,GAAA,UACAuG,EAAA,QAAAvG,EAAA,SAGAA,EAAA,UACAuG,EAAA,QAAAvG,EAAA,cAGA6E,GAAAA,EAAA0B,IAIA,GAAAvG,EAAA,QAKA,YAJAA,EAAA,UACAzR,GAAAA,EAAAyR,EAAA,QAAAA,EAAA,WAEAzR,GAAAA,EAAAyR,EAAA,UAIAzR,GAAAA,EAAAyR,GAGA,QAAAwG,GAAAxG,EAAA6E,GAEA,GAAA,gBAAA7E,IAAAA,EAAA,MAAA,CACA,GAAAuG,KAWA,OATAvG,GAAA,UACAuG,EAAA,QAAAvG,EAAA,SAGAA,EAAA,UACAuG,EAAA,QAAAvG,EAAA,cAGA6E,GAAAA,EAAA0B,IAGA1B,GAAAA,EAAA7E,GAGA,QAAAyG,GAAAtN,EAAA5K,EAAAmY,EAAA3W,GACA,GAAAxB,GAAA4K,EAAA,UAAA5K,EACAsW,EAAA1L,EAAA,OAAA7H,GACAqV,EAAAC,IAEA7W,GAAAA,MAEAA,EAAA,OACAA,EAAA,KAAAoJ,EAAA,UAAA0N,EAGA,IAAA3I,IACA4I,EAAA,KAAA,uBACA,UAAAC,EAGA7I,GAAA5S,KAAA2M,MAAAiG,EAAAwI,GAEAC,IAAA5W,EAAA,SAAA4W,GAEAX,IACAzX,SAAAoY,EACA5W,KAAAsU,EAAAtU,GACAiX,QAAA,SAAAhH,GACAsG,EAAAtG,EAAAzR,EAAAsW,IAEAoC,KAAA,SAAAjH,GACAwG,EAAAxG,EAAA6E,IAEA3G,IAAAA,IA44CA,QAAAgJ,KACAC,MAAAC,EAAA,GACA9V,MAAA,kDAEA+V,GAAAza,aAAAya,GACAA,EAAA9a,QAAA2a,EAAA3D,QAGA,QAAA+D,KACAC,GACA7B,GAAA,KAAA,SAAAsB,GACAQ,EAAA,aAA2CR,GAC3CA,GAAAI,EAAA,GACA9V,MAAA,sFAGAmW,GAAA7a,aAAA6a,GACAA,EAAAlb,QAAA+a,EAAAI,KAIA,QAAAN,GAAAvC,EAAApB,GACAkE,GAAAA,EAAA9C,EAAApB,GACAkE,EAAA,KAEA/a,aAAAya,GACAza,aAAA6a,GAeA,QAAAG,GAAAC,GACA,GAAAC,GAAApH,OAAAqH,CACA,OAAAD,GAAAD,EAAA,IAIA,QAAAL,GAAAQ,EAAAC,GAKA,QAAAC,GAAAD,GACA,GAAAA,EAAA,CACA,GAAAE,GAAAF,EAAA,IACAG,GAAA1H,OAAA2H,GAAA,CACAN,GAAArH,QAAAyH,EAAAC,GACAJ,GAAAA,EAAAD,IATA,GAAAM,GAAA3H,MAEAuH,IAAAC,EAAAD,IAAAvC,GAAA,KAAAwC,GAptDA,GAkDAb,GACAI,EAnDAa,GAAAlE,EAAA,WAAAmE,cACAC,IAAApE,EAAA,SAAAqE,iBAAAlF,OACAmE,IAAAtD,EAAA,WAAAsE,eAAAnF,OACAgE,EAAAnD,EAAA,WAAA,EACAuE,EAAAvE,EAAA,SAAA,EACAwE,EAAAxE,EAAA,YACA2C,EAAA3C,EAAA,cACAyC,EAAAzC,EAAA,UAAA,GACAyE,EAAAzE,EAAA,YAAA,GACA0E,EAAA1E,EAAA,YACA2E,EAAA3E,EAAA,IAAA,IAAA,GACA4E,EAAA,OAAAD,EAAA,OAAA3E,EAAA,QAAA,qBACA0C,EAAAmC,WAAAD,GACAE,EAAAD,WAAAD,GACAG,EAAA,aACArD,KACAsD,GAAA,EACArB,EAAA,EACAsB,EAAA,EACAC,EAAA,EACA3B,EAAA,EACA4B,EAAAnF,EAAA,SAAA,EAEAoF,EAAA,EACAC,GAAA,EACAlE,KACAC,KAEAkE,KACArE,EAAA,KACAsE,EAAAjF,EACAN,EAAA,WAAAA,EAAA,WAAA,EAAAA,EAAA,OAEAkB,GAAAlB,EAAA,oBAAAuF,EAAA,EAAA,EACAlE,IAAA,EACAI,GAAAzB,EAAA,oBACAwF,GAAAxF,EAAA,oBAAA,EACA4B,GAAA5B,EAAA,IACArD,GAAAqD,EAAA,WACA9S,GAAA8S,EAAA,OAAA,aACA+C,GAAA/C,EAAA,YAAA,WAA2D,MAAA,IAC3DwC,GAAAxC,EAAA,UAAA,WAA2D,MAAA,IAC3DyF,GAAAzF,EAAA,KAAgD/E,IAAA,aAAmBI,IAAA,cACnEyF,GAAAd,EAAA,WACA0F,GAAA1F,EAAA,OAAAA,EAAA,aAAAyF,IAAAA,GAAA,IAAA9C,EAAA,SAAA,GACAgD,GAAA3F,EAAA,cAAA,EACA4F,GAAA,GACAC,GAAA7F,EAAA,SACA8F,GAAA,mBAAA9F,GAAA,gBAAAA,EAAA,iBAAA,EACA+F,GAAA,GAAA/F,EAAA,WAAA,IAIA,KAAAuF,IAAArE,GAAA,EAEA,IAAAL,IAAAb,EAAA,aAEAY,QAAA,SAAAoF,EAAAzkB,GAAwC,MAAAykB,IACxCjF,QAAA,SAAAkF,EAAA1kB,GAAwC,MAAA0kB,KAkOxC3E,IACA4E,MAAA,SAAAra,EAAAsa,EAAAC,EAAAjc,EAAA+C,GAEA,GAIA4M,GAJAnO,GAA0B0a,KAAAX,GAAAY,KAAAF,GAAA3D,GAC1B8D,EAAA1B,WAAAD,GACAza,EAAAA,GAAA,aACAsW,EAAAvT,GAAA,aAEAqV,EAAAC,IAKA,IAAA3W,EAAAlE,QAAA6e,iBAAA,EAAA,OAAA,CAKA,IAAAhB,GAAA,CACA,IAAAb,EAAA,OAAA,CACA,IAAA,KAAApC,EAAA,OAAA,EAGA,MAAAgC,IAAA,GAEA,KAAAhC,IAAA5W,EAAA,SAAA4W,GAEAoD,KAAAha,EAAA,WAAAia,IAEA9L,GACAyM,EAAA,KAAA,WAAA,UACA5D,EAAA,UAAA7F,OAAAjR,GAAA,SAGA8Q,GAAAsD,EAAAtU,GAGAoa,KACAU,WAAAlK,UAAAzC,EAAA6C,IACAoJ,GAAAU,cACAtc,GAAAA,GAA0C0Q,OAAA,IAAA6L,OAAA,QAAA5G,QAAA,KAAA6G,QAAA,cAC1C,IAKA/E,IACAuE,SAAAA,GAAAxB,EACAxc,QAAA,IACAgC,SAAAoY,EACA5W,KAAAgR,GACAiG,QAAA,SAAAhH,GACAsG,EAAAtG,EAAAzR,EAAAsW,IAEAoC,KAAA,SAAAjH,GACAwG,EAAAxG,EAAA6E,IAEA3G,IAAAA,KAEA,KAEA8M,YAAA,SAAA9H,EAAAqH,EAAAC,EAAAjc,EAAA+C,GAEA,GAAAvB,IAA0B0a,KAAAX,GAAAY,KAAAF,GAAA3D,GAC1B8D,EAAA1B,WAAAD,GACAza,EAAAA,GAAA,aACAsW,EAAAvT,GAAA,aACAqV,EAAAC,IAGA,IAAA1D,EAAAnX,QAAA6e,iBAAA,EAAA,OAAA,CAEA,IAAAhB,GAAA,CACA,IAAAb,EAAA,OAAA,CACA,IAAA,KAAApC,EAAA,OAAA,EAGA,MAAAgC,IAAA,GAEA,KAAAhC,IAAA5W,EAAA,SAAA4W,GAEAzD,GAAAA,EAAA1c,OAAA,IAAAuJ,EAAA,iBAAAmT,GAEA6G,KAAAha,EAAA,WAAAia,IAEAhE,IACAuE,SAAAA,GAAAxB,EACAxc,QAAA,IACAgC,SAAAoY,EACA5W,KAAAsU,EAAAtU,GACAiX,QAAA,SAAAhH,GACAsG,EAAAtG,EAAAzR,EAAAsW,IAEAoC,KAAA,SAAAjH,GACAwG,EAAAxG,EAAA6E,IAEA3G,KACAyM,EAAA,KAAA,WAAA,UACA5D,EAAA,UAAA7F,OAAA,KAAA,YAGA,IAEA+J,YAAA,SAAAC,GACAzB,EAAAyB,GAEAC,eAAA,WACA,MAAAjG,KAEAkG,eAAA,SAAAzlB,GACAuf,GAAAvf,GAEA0lB,YAAA,SAAAlX,EAAAxO,GACA,MAAAqf,GAAA7Q,EAAAxO,IAEA2lB,YAAA,SAAAnX,EAAAxO,GACA,MAAAwf,GAAAhR,EAAAxO,IAEA4lB,cAAA,WACA,MAAA5B,IAGA6B,cAAA,SAAA7G,EAAA8G,GACA9B,EAAAjF,EAAAC,EAAAgF,EAAArY,IACAgU,GAAAmG,GAAA9B,EAAA,EAAA,EACA,GAAAA,IACArE,GAAA,GAEA6D,IACA/D,KAGAsG,uBAAA,WACA,MAAApG,KAGAqG,uBAAA,SAAAF,GACAnG,GAAAmG,EACArG,KAGAwG,YAAA,WACA,MAAAC,UAEAC,oBAAA,SAAAxmB,GACA,OACAyK,KAAAzK,IAGAymB,qBAAA,SAAAzmB,GACA,GAAA6I,IACAwV,KAAyBE,MAAA,EAAAD,MAAA,IAEzB,KAAA1Y,IAAA5F,GACA4F,EAAAiD,GAAA7I,EAAA4F,EAEA,OAAAiD,IAEA6d,aAAA,WACA,GAAA7d,KACA8d,OAAA9d,EAAA,OAAA8d,KACAvI,OAAAvV,EAAA,QAAAuV,KACA,KAAAxY,IAAAghB,GACA/d,EAAAjD,GAAAghB,EAAAhhB,EAEA,OAAAiD,IAGAge,WAAA,SAAAxmB,EAAAymB,GACArL,GAAApb,GAAAymB,GAGAlJ,cAAA,SAAA/J,EAAA5K,GACA,GAIA8d,GACAnJ,EALAoJ,EAAAnT,EAAA,cACA5K,EAAAA,GAAA4K,EAAA,SACAwJ,EAAAxJ,EAAA,UAAAA,EAAA,QACAoT,EAAApT,EAAA,MAGA+E,KACAnO,KACAqO,EAAAjF,EAAA,MAAA,KAGA,IAAAmT,EAAA,CACA,GAAAE,GAAAF,EAAA1gB,MAAA,IAEA4gB,GAAAhmB,OAAA,GACA6lB,EAAA,MAAAG,EAAA,GAAA,KAAAA,EAAA,GAEAtJ,EAAAsJ,EAAA,IAEAtJ,EAAAsJ,EAAA,GAIAH,GAAAnO,EAAA5S,KAAA,cAAA4S,EAAA5S,KAAA4V,OAAAmL,IAEAnO,EAAA5S,KAAA,iBAEA4X,GAAA,MAAAA,GACAhF,EAAA5S,KAAA4X,GAGAP,GACAvX,QAAAuX,KACAA,EAAAA,EAAAnX,KAAA,MAEAuE,EAAAqO,GAAAuE,EACA5S,EAAA,MAAA,EAAA,OAAA,SAEA,WAAAqO,GAAAF,EAAA5S,KAAA,UAGA,mBAAAihB,KAAAxc,EAAA,MAAA,EAAA,OAAA,SAEA0W,EAAAtN,EAAA5K,EAAA2P,EAAAnO,IAGA0c,0BAAA,SAAAtT,EAAA5K,GACA,GAAA8d,EAEAA,GAAAlT,EAAA,WAAAA,EAAA,IAAAA,EAAA,eAAA,KACAkT,IACAlT,EAAA,cAAAkT,EAAA,MAGA3G,GAAA,cAAAvM,EAAA5K,IAGAme,4BAAA,SAAAvT,EAAA5K,GACA,MAAA4K,GAAA,kBACAuM,IAAA,cAAAvM,EAAA5K,GADA+C,GAAA,0BAIAqb,6BAAA,SAAAxT,EAAA5K,GACA,MAAA4K,GAAA,cACAA,EAAA,SAAAA,EAAA,UAEAA,EAAA,KAAA,aACAuM,IAAA,cAAAvM,EAAA5K,IAHA+C,GAAA,mBADAA,GAAA,0BAOAsb,2BAAA,SAAAzT,EAAA5K,GACA,MAAA4K,GAAA,cACAA,EAAA,QAAA7H,GAAA,mFAEA6H,EAAA,KAAA,aACAuM,IAAA,cAAAvM,EAAA5K,IAJA+C,GAAA,0BAOAub,0BAAA,SAAA1T,EAAA5K,GACA,MAAA4K,GAAA,cACAA,EAAA,SAAAA,EAAA,aACAuM,IAAA,cAAAvM,EAAA5K,GADA+C,GAAA,mBADAA,GAAA,0BAKAwb,oBAAA,SAAA3T,EAAA5K,GACA,MAAA,mBAAA4K,GAAA,UACA5K,GAAA6a,IAGAA,EAAAjQ,EAAA,UACAuM,IAAA,cAAAvM,EAAA5K,KAGAwe,8BAAA,SAAA5T,EAAA5K,GACA,GAAA2P,IAAA,YACAuI,GAAAtN,EAAA5K,EAAA2P,IAEA8O,+BAAA,SAAA7T,EAAA5K,GACA,GAAA2P,IAAA,YAAA/E,EAAA,UAAA,SACAsN,GAAAtN,EAAA5K,EAAA2P,IAUA+O,QAAA,SAAA9T,EAAA5K,GACA,GAAAA,GAAA4K,EAAA,UAAA5K,EACA2X,EAAA/M,EAAA,OAAAA,EAAA,OAAA,IACA+T,EAAA/T,EAAA,SAAA,QACA0L,EAAA1L,EAAA,OAAA,aACAqR,EAAArR,EAAA,UAAA0N,EACAsG,EAAAhU,EAAA,WACAlJ,EAAAkJ,EAAA,QACA+J,EAAA/J,EAAA,cACAiU,EAAAjU,EAAA,MACAkU,EAAAlU,EAAA,IACAmU,EAAAnU,EAAA,cACAoU,EAAApU,EAAA,uBAAA,EACA4H,KACA4F,EAAAC,IAGA,OAAA3W,IAAAiT,EACA3U,EACAwY,GAEAhG,EAAA,YAAA,OACAA,EAAA,MAAAmF,EACAnF,EAAA,QAAAmM,EACAnM,EAAA,KAAAyJ,EAEAtH,IACAnC,EAAA,iBAAAmC,EACAjT,IACAA,EAAA,MAGA0W,IAAA5F,EAAA,SAAA4F,GACAyG,IAAArM,EAAA,MAAAqM,GACAC,IAAAtM,EAAA,IAAAsM,GACAC,IAAAvM,EAAA,cAAA,QACAwM,IAAAxM,EAAA,qBAAA,YAGAiF,KACAzX,SAAAoY,EACA5W,KAAAsU,EAAAtD,GACAiG,QAAA,SAAAhH,GACA,GAAA,gBAAAA,IAAAA,EAAA,MAEA,WADA6E,IAA6BX,QAAAlE,EAAA,QAAAwN,QAAAxN,EAAA,SAK7B,KAAA,GAFAyN,GAAAzN,EAAA,GACA0N,KACAtD,EAAA,EAAmCA,EAAAqD,EAAAjnB,OAAqB4jB,IAAA,CACxD,GAAAuD,GAAAxI,EAAAsI,EAAArD,GAAA+C,EACA,KACAO,EAAA,KAAA/P,KAAA,MAAAgQ,IACyB,MAAAhd,GACzB+c,EAAA,KAAA,IAGAnf,GAAAmf,EAAA1N,EAAA,GAAAA,EAAA,MAEAiH,KAAA,SAAAjH,GACAwG,EAAAxG,EAAA6E,IAEA3G,KACA4I,EAAA,KAAA,UAAA,UACAC,EAAA,UAAA7F,OAAAjR,OA7CAqB,GAAA,yBADAA,GAAA,oBADAA,GAAA,oBA0DAsc,OAAA,SAAAzU,EAAA5K,GACA,GAWA2P,GAXA3P,EAAAA,GAAA4K,EAAA,UAAA,aACAqR,EAAArR,EAAA,UAAA0N,EACAgH,EAAA1U,EAAA,OACA2U,EAAA3U,EAAA,YACA4U,EAAA5U,EAAA,KACAiU,EAAAjU,EAAA,MACAkU,EAAAlU,EAAA,IACA+T,EAAA/T,EAAA,QACA6U,EAAA7U,EAAA,MACAwN,EAAAC,KACA7W,IAIA,OAAA8d,GACAC,EACAlF,EACA7B,GAGA,KAAAJ,IAAA5W,EAAA,SAAA4W,GACAoH,IAAAhe,EAAA,KAAA,OACAmd,IAAAnd,EAAA,QAAA,QACAqd,IAAArd,EAAA,MAAAqd,GACAC,IAAAtd,EAAA,IAAAsd,GACAW,IAAAje,EAAA,MAAAie,GAEAje,EAAA,KAAAya,EAGAtM,GACA4I,EAAA,KAAA,SACA8B,EAAA7B,EACA8G,EAAAC,OAIA9H,KACAzX,SAAAoY,EACAK,QAAA,SAAAhH,GACAsG,EAAAtG,EAAAzR,EAAAsW,MAEAoC,KAAA,WAAuC1Y,GAAA,EAAA,kBACvC2P,IAAAA,EACAnO,KAAAsU,EAAAtU,MA3BAuB,GAAA,yBADAA,GAAA,uBADAA,GAAA,+BADAA,GAAA,2BAqCAoZ,KAAA,SAAAA,GACA7D,EAAA6D,EACAvB,KAMAlB,KAAA,SAAA1Z,GACA,GAAAoY,GAAAC,KAEA7W,GAAwB0a,KAAAX,GAAAY,KAAA7D,EAExBkD,MAAAha,EAAA,WAAAia,IAEAhE,IACAzX,SAAAoY,EACA5W,KAAAsU,EAAAtU,GACAxD,QAAA,EAAAgX,OACArF,KAAA4I,EAAA,OAAAH,GACAK,QAAA,SAAAhH,GAA+CzR,EAAAyR,EAAA,KAC/CiH,KAAA,WAAuC1Y,EAAA,OAUvC0V,QAAA,SAAA9K,EAAA5K,GACA,GAAAkV,GAAAtK,EAAA,OACA,KAAAsK,EAAA,MAAAnS,IAAA,kBAEA,IASAyP,GACA7C,EAVA3P,EAAAA,GAAA4K,EAAA,UAAAsK,EAAA,UAAA,aACAxT,EAAAkJ,EAAA,SAAAsK,EAAA,QACA+G,EAAArR,EAAA,UAAA0N,EACAsG,EAAAhU,EAAA,WACA0L,EAAA1L,EAAA,OAAAsK,EAAA,OAAA,aACAwK,EAAA9U,EAAA,OAAA,EACA+U,EAAA,oBAAA/U,GAAAA,EAAA,kBAAA,EACAwN,EAAAC,KACAuH,EAAA,MAMA,OAFAhV,GAAA,UAAAgV,EAAA,WAEAle,EACA2Y,EACA7B,GAEAtD,EAAA,mBACAA,EAAAA,EAAA,oBAIAA,EAAA9F,KAAA,UAAAqH,EAAAvB,EAAA0J,IAGAjP,GACA4I,EAAA,UACA8B,EAAA7B,EACA,EAAA7F,OAAAjR,GACA0W,EAAAzF,OAAAuC,IAGA1C,GAAsB0J,KAAAX,GAAAY,KAAAF,GAEtB0D,IAAAnN,EAAA,MAAA,KAEAgJ,KAAAhJ,EAAA,WAAAiJ,IAGAlE,EAAAqI,IACA5f,SAAAoY,EACApa,QAAA,EAAAgX,OACArF,IAAAA,EACAnO,KAAAsU,EAAAtD,GACAkG,KAAA,SAAAjH,GACAwG,EAAAxG,EAAA6E,GACAZ,EAAA,IAEA+C,QAAA,SAAAhH,GACAsG,EAAAtG,EAAAzR,EAAAsW,GACAZ,EAAA,IAEA7F,KAAA,EAAA,OAAA,YAIA6F,MAzCA3S,GAAA,yBADAA,GAAA,uBADAA,GAAA,oBAiDA8c,YAAA,SAAAjV,EAAA5K,GACA,GAAA0B,GAAAkJ,EAAA,QACA+J,EAAA/J,EAAA,cACAqR,EAAArR,EAAA,UAAA0N,EACAtY,EAAAA,GAAA4K,EAAA,UAAA,aACA0L,EAAA1L,EAAA,OAAA,YAEAqQ,GAAA,EAGAvZ,IAEAA,EAAA0L,KACA1L,EAAAzE,KAAAyE,EAAAzE,KAAA,KAAA,GAAAyE,GACArE,MAAA,KAAA,SAAAqE,GACA,MAAAsV,GAAAtV,GACAA,EAAA,IAAAA,EAAA2a,gBADA,SAEiBpf,KAAA,KAGjBwV,KAAA/Q,EAAArE,MAAA,KAAA,SAAAyiB,GACA,GAAAC,IAAA,CACAD,KACA9I,EAAA8I,GAAA,EACAA,IAAA3E,UAAAA,GAAA2E,GACAjL,QACAkL,EAAA5I,GAAA,MAAA2I,EAAA,EAAA7D,EAAAjc,EAAAsW,IAEAyJ,GAAA/f,GAA8Cuc,OAAA,cAM9C5H,IAEAA,EAAAvH,KACAuH,EAAA1X,KAAA0X,EAAA1X,KAAA,KAAA,GAAA0X,GACAtX,MAAA,KAAA,SAAAsX,GACA,MAAAsC,GAAAtC,GACAA,EAAA,IAAAA,EAAA0H,gBADA,SAEiBpf,KAAA,KAGjBwV,KAAAkC,EAAAtX,MAAA,KAAA,SAAA2iB,GACA,GAAAD,IAAA,CACAC,KACA/I,EAAA+I,GAAA,EACAA,IAAA7E,UAAAA,GAAA6E,GACAnL,QACAkL,EAAA5I,GAAA,YAAA6I,EAAA,EAAA/D,EAAAjc,EAAAsW,IAEAyJ,GAAA/f,GAA8Cuc,OAAA,cAM9C3B,KASAqF,UAAA,SAAArV,EAAA5K,GAuJA,QAAAkgB,GAAAzH,GACAA,EAEAza,QAAA4c,EAAAuF,IAIA5H,EAAAmC,WAAAD,EAAA,GACAE,EAAAD,WAAAD,EAAA,GAGAzc,QAAA,WACAmZ,GAAA,KAAA+I,IACqBlL,SAIrB6C,EAAA,SAAAnW,GAEA,MAAA+W,IAAA/W,EAAA0e,cACA1e,EAAA0e,aAAA,EACA1e,EAAA2e,UAAA3e,EAAA2K,YAIAoM,GAAA/W,EAAA0e,eACA1e,EAAA0e,aAAA,EACA1e,EAAA4e,WAAA5e,EAAA2K,UAKAqL,EAAA,SAAA/C,GAEA,MAAA8D,IAAA9D,EAAAyL,cACAzL,EAAAyL,aAAA,EACAzL,EAAA0L,UAAA1L,EAAAtI,YAIAoM,GAAA9D,EAAAyL,eACAzL,EAAAyL,aAAA,EACAzL,EAAA2L,WAAA3L,EAAAtI,UAMA,QAAAkU,KACA,GAAAnI,GAAAC,KACAjE,EAAAD,sBAAA6C,GAAA/Z,KAAA,KACAyX,EAAAD,4BAAAwC,GAAAha,KAAA,IAGA,IAAAmX,GAAAM,EAAA,CAEAN,IAAAA,EAAA,KAGAyE,GAEA,IAAArX,GAAAsU,GAA4CoG,KAAAX,GAAAY,KAAA7D,GAE5C5D,KACAlT,EAAA,iBAAAkT,EAIA,IAAA8L,GAAApR,KAAAgI,UAAA+D,EACAqF,GAAAvoB,OAAA,IAAAuJ,EAAA,MAAA4N,KAAAgI,UAAA+D,IAEAC,IAAA5Z,EAAA,UAAA4Z,GAEAI,KAAAha,EAAA,WAAAia,IAEApE,IACA+B,EAAA3B,IACAzZ,QAAAyiB,EACAzgB,SAAAoY,EACAM,KAAA,SAAAjH,GACAA,GAAAA,EAAA,OAAAA,EAAA,SACAwG,EAAAxG,EAAAiP,GACAR,EAAA,IAEA/I,GAAA,KAAA,SAAAsB,IACAA,GAAAR,EAAAxG,EAAAiP,GACAR,EAAAzH,MAIAjX,KAAAsU,EAAAtU,GACAmO,KACAgL,EAAA,YACAnC,EAAA7F,OAAAyB,GACAgE,EAAA6C,GAEAxC,QAAA,SAAAyG,GAGA,IAAAA,GACA,gBAAAA,IACA,SAAAA,IACAA,EAAA,MAGA,MADAwB,GAAAxB,EAAA,OACAlhB,QAAA4c,EAAA5F,OAkCA,IA9BA2L,EAAAzB,EAAA,IAGAjE,GAAAA,GACAD,GACAM,GAAA,IAAA9C,IAAA0G,EAAA,GAYArH,EAAA,SAAAnW,GACAA,EAAAkf,YACAlf,EAAAkf,UAAA,EACAlf,EAAAqT,QAAArT,EAAA2K,SAIAqL,EAAA,SAAA/C,GACAA,EAAAiM,YACAjM,EAAAiM,UAAA,EACAjM,EAAAI,QAAAJ,EAAAtI,SAGA6O,IAAAF,EAMA,MALAC,GAAA,EACAC,GAAA,EAEAI,GAAA,IAAA9C,EAAA,OACAxa,SAAAuiB,EAAAJ,EAMAU,KACA5F,EAAA,IACA4F,EAAA,GAIAvF,GAAA,IAAA9C,EAAA0G,EAAA,GAGA,IAAA4B,GAAA,WACA,GAAA1M,GAAA,GACA2M,EAAA,EAEA7B,GAAAjnB,OAAA,GACAmc,EAAA8K,EAAA,GACA6B,EAAA7B,EAAA,IAEA9K,EAD6B8K,EAAAjnB,OAAA,EAC7BinB,EAAA,GAEA9R,IACA+G,sBAAA6C,GAAA,SAAAc,GAAqF,MAAA1K,KACrFxP,MAAAshB,EAAA,GAAAjnB,QACAgF,KAAA,KAAAI,MAAA,KACA,WAAoD,MAAAya,OACb7a,KAAA,IAGvC,IAAA4T,GAAAuD,EAAA/W,MAAA,KACA2jB,EAAA,EAAAD,EAAA1jB,MAAA,OAEA,OAAA,YACA,GAAAqE,GAAAmP,EAAAZ,SAAA8K,EACAkG,EAAAD,EAAA/Q,QAEAiR,IAEAD,IACAvf,GAAAA,EAAAlE,QAAA,YAAA,GACAyjB,EAAAzjB,QAAA,WAAA,IACAyjB,GAAA,WAEAC,EAAAjK,EAAAgK,IAAAjK,EAAAiK,KAA+FjhB,SAAA,eAE/FkhB,EAAAlK,EAAAtV,EAGA,IAAAiS,IACAuN,EACAlhB,UAAA8a,EACApZ,EAAArE,MAAAgf,iBAAA,GAGA,OADA4E,IAAAtN,EAAA5W,KAAAkkB,EAAA5jB,MAAAgf,iBAAA,IACA1I;IAIAkG,EAAAR,GAAA6F,EAAA,GACAzM,MAAAyM,EAAA,GAAA,SAAAhK,GACA,GAAAhX,GAAA4iB,IACAK,EAAAvK,EAAA1B,EACA8B,EAAA9Y,EAAA,IAAA8Y,EAAA9Y,EAAA,IAAA,WAAA,KACAA,GAAA,IAAAA,EAAA,GAAAijB,EAAAjC,EAAAhhB,EAAA,IAAAA,EAAA,GAAA2b,EAAA3b,EAAA,MAGAF,QAAAuiB,EAAAJ,OA5WA,GAAAze,GAAAkJ,EAAA,QACA+J,EAAA/J,EAAA,cACA5K,EAAAA,GAAA4K,EAAA,SACA5K,EAAAA,GAAA4K,EAAA,QACAmK,EAAAnK,EAAA,SAAA,aACAyV,EAAAzV,EAAA,WAAA,aACA0V,EAAA1V,EAAA,YAAA,aACA8V,EAAA9V,EAAA,OAAA8V,GAAA,aACAC,EAAA/V,EAAA,MAAA,aACAwW,EAAAxW,EAAA,UAAA,EACAyW,EAAAzW,EAAA,YAAA,EACAiW,EAAAjW,EAAA,UAAA,EACA0W,EAAA1W,EAAA,WAAA,EACA6V,EAAA7V,EAAA,SAAAqP,EACAkG,EAAAvV,EAAA,WAAAmP,EACAxR,EAAAqC,EAAA,MACAwL,EAAAxL,EAAA,WAAAA,EAAA,UACAsS,EAAAtS,EAAA,mBACA2W,EAAA3W,EAAA,SAAAoQ,CAWA,OATA1C,GAAA1N,EAAA,UAAA0N,EAGA0C,EAAAuG,EAGAtG,EAAAqG,EAGA5f,GAAAiT,EAIA3U,EACAwY,IAEApC,GAAA,IAAAA,GAAA8G,GAAA,IAAAA,IACA/F,GAAA,cAAAf,EAAA8G,GAIAxb,GACA+Q,MAAA/Q,EAAAzE,KAAAyE,EAAAzE,KAAA,KAAA,GAAAyE,GAAArE,MAAA,KACA,SAAAqE,GACA,GAAA8f,GAAAxK,EAAAtV,MAGAsV,GAAA+D,EAAArZ,IACA2K,KAAA3K,EACAkf,UAAAY,EAAAZ,UACAR,aAAAoB,EAAApB,aACA7L,WAAA,EACAvU,SAAA8a,EAAA9a,EACA4e,WAAAhU,EAAA,WACAmK,QAAAA,EACAuL,WAAAA,EACAD,UAAAA,GAGA9X,IACA7G,IAAA6G,GACA4S,EAAAzZ,GAAA6G,EAAA7G,GAEAyZ,EAAAzZ,GAAA6G,GAKA6Y,IAGAjK,GAAA,WACAzV,QAAAA,EAAA2a,gBACArc,SAAAohB,EACAG,QAAAA,IAIAC,EAAAjN,YAGA8M,GACAlK,GAAA,UACAzV,QAAAA,EACAF,KAAAsU,GAAsDoG,KAAAX,GAAAY,KAAA7D,IACtDtY,SAAA,SAAAyhB,GACAhP,KAAA,SAAAgP,GAAAA,EAAA,SACA,SAAAC,GAA2CN,GAC3C7E,OAAA,OACAL,KAAAwF,EACAC,UAAA/N,KAAAgO,MAAAzP,OAAA,KACA0P,UAAAJ,EAAA,WAAA,GAC6BA,EAAA/f,WAO7BiT,GACAlC,MAAAkC,EAAA1X,KAAA0X,EAAA1X,KAAA,KAAA,GAAA0X,GAAAtX,MAAA,KACA,SAAAsX,GACA,GAAA6M,GAAAvK,EAAAtC,MAEAsC,GAAAtC,IACAtI,KAAAsI,EACAiM,UAAAY,EAAAZ,UACAR,aAAAoB,EAAApB,aACA7L,WAAA,EACAvU,SAAA8a,EAAA9a,EACA4e,WAAAhU,EAAA,WACAmK,QAAAA,EACAuL,WAAAA,EACAD,UAAAA,GAIAe,IAGAjK,GAAA,WACAxC,cAAAA,EAAA0H,gBACArc,SAAAohB,EACAG,QAAAA,EACAtF,SAAA3D,IAIAkJ,EAAAjN,YAGA8M,GACAlK,GAAA,UACAxC,cAAAA,EACAnT,KAAAsU,GAA4DoG,KAAAX,GAAAY,KAAA7D,IAC5DtY,SAAA,SAAAyhB,GACAhP,KAAA,SAAAgP,GAAAA,EAAA,SACA,SAAAC,GAA2CN,GAC3C7E,OAAA,OACAL,KAAAwF,EACAC,UAAA/N,KAAAgO,MAAAzP,OAAA,KACA0P,UAAAJ,EAAA,WAAA,GAC6BA,EAAA9M,WAmO7BiG,EAAA,WACA/B,IACA7a,QAAAuiB,EAAAJ,IAIAtL,UAGA+F,KAHA9F,aAAA/X,KAAA6d,IArVA7X,GAAA,yBADAA,GAAA,oBAHAA,GAAA,oBAkWA+e,SAAA,SAAAlX,EAAA5K,GACA,GAAAA,GAAA4K,EAAA,UAAA5K,EACAsW,EAAA1L,EAAA,OAAA,aACAqR,EAAArR,EAAA,UAAA0N,EACA5W,EAAAkJ,EAAA,QACA+J,EAAA/J,EAAA,cACAwN,EAAAC,KACA0J,EAAA,SAAAnX,GAAAA,EAAA,OAAA,EACArC,EAAAqC,EAAA,MACApJ,GAA4B0a,KAAAX,GAAAY,KAAAF,EAM5B,IAJA8F,IAAAvgB,EAAA,cAAA,GACA+G,IAAA/G,EAAA,MAAA,IAGAxB,EAAA,MAAA+C,IAAA,mBACA,KAAAyV,EAAA,MAAAzV,IAAA,wBAEA,IAAA4M,IACA4I,EAAA,KAAA,WACA,UAAAC,EAGA9W,IAAAiO,EAAA5S,KAAA,YAAA4S,EAAA5S,KAAA4V,OAAAjR,IAEA,KAAA0W,IAA+B5W,EAAA,SAAA4W,GAE/BzD,IACAnT,EAAA,iBAAAmT,GACAjT,GAAAiO,EAAA5S,KAAA,YAAA4S,EAAA5S,KAAA,MAGAye,KAAAha,EAAA,WAAAia,IAEAhE,IACAzX,SAAAoY,EACA5W,KAAAsU,EAAAtU,GACAiX,QAAA,SAAAhH,GACAsG,EAAAtG,EAAAzR,EAAAsW,IAEAoC,KAAA,SAAAjH,GACAwG,EAAAxG,EAAA6E,IAEA3G,IAAAA,KAOAqS,UAAA,SAAApX,EAAA5K,GACA,GAAAA,GAAA4K,EAAA,UAAA5K,EACAsW,EAAA1L,EAAA,OAAA,aACAqR,EAAArR,EAAA,UAAA0N,EACAF,EAAAC,KACA6D,EAAAtR,EAAA,MAAA2Q,GACA/Z,GAA4B2a,KAAAF,EAG5B,OAAAjc,GACAwY,GAEA,KAAAJ,IAA+B5W,EAAA,SAAA4W,GAE/BoD,KAAAha,EAAA,WAAAia,QAEAhE,KACAzX,SAAAoY,EACA5W,KAAAsU,EAAAtU,GACAiX,QAAA,SAAAhH,GACAsG,EAAAtG,EAAAzR,EAAAsW,IAEAoC,KAAA,SAAAjH,GACAwG,EAAAxG,EAAA6E,IAEA3G,KACA4I,EAAA,KAAA,WACA,UAAAC,EACA,OAAA7F,OAAAuJ,OAlBAnZ,GAAA,yBADAA,GAAA,qBAwBAwF,MAAA,SAAAqC,EAAA5K,GACA,GAQA2P,GARA3P,EAAA4K,EAAA,UAAA5K,GAAA,SAAA2T,KACA2C,EAAA1L,EAAA,OAAA,aACAqR,EAAArR,EAAA,UAAA0N,EACAF,EAAAC,KACA9P,EAAAqC,EAAA,MACAsR,EAAAtR,EAAA,MAAA2Q,GACA7Z,EAAAkJ,EAAA,QACA+J,EAAA/J,EAAA,cAEApJ,EAAAsU,GAA4CqG,KAAAF,GAG5C,OAAAzD,GACA0D,EACAxa,GAAAiT,GAEA,KAAAyD,IAA+B5W,EAAA,SAAA4W,GAE/B,mBAAA1W,IACAsV,EAAAtV,IAAAsV,EAAAtV,GAAA6S,YACAhM,IAAA4S,EAAAzZ,GAAA6G,GAGA,mBAAAoM,IACAsC,EAAAtC,IACAsC,EAAAtC,GAAAJ,aAEAhM,IAAA4S,EAAAxG,GAAApM,GACA/G,EAAA,iBAAAmT,EAEAjT,IACAA,EAAA,MAIAF,EAAA,MAAA4N,KAAAgI,UAAA7O,GAEAiT,KAAAha,EAAA,WAAAia,IAGA9L,EADApH,GAEAgQ,EAAA,KAAA,WACA,UAAAC,EACA,UAAA9W,EACA,OAAAwa,EAAA,SAIA3D,EAAA,KAAA,WACA,UAAAC,EACA,UAAA9W,EACA,OAAAiR,OAAAuJ,QAIAzE,KACAzX,SAAAoY,EACA5W,KAAAsU,EAAAtU,GACAiX,QAAA,SAAAhH,GACAsG,EAAAtG,EAAAzR,EAAAsW,IAEAoC,KAAA,SAAAjH,GACAwG,EAAAxG,EAAA6E,IAEA3G,IAAAA,KAlDA5M,GAAA,mBADAA,GAAA,gBADAA,GAAA,0BAqEAkf,MAAA,SAAArX,EAAA5K,GACA,GAAAA,GAAA4K,EAAA,UAAA5K,EACAsW,EAAA1L,EAAA,OAAA,aACAlJ,EAAAkJ,EAAA,SAAAA,EAAA,SACA+J,EAAA/J,EAAA,cACAwN,EAAAC,KACA6J,EAAAtX,EAAA,IACA+I,EAAA/I,EAAA,KAAA,IAAA,IACAuX,EAAAvX,EAAA,MAAA,IAAA,IACAjU,EAAAiU,EAAA,OAAA,IAAA,IACAqR,EAAArR,EAAA,UAAAA,EAAA,SAEA,KAAA5K,EAAA,MAAA+C,IAAA,mBACA,KAAAyV,EAAA,MAAAzV,IAAA,wBACA,KAAAsX,EAAA,MAAAtX,IAAA,sBACA,KAAAuX,EAAA,MAAAvX,IAAA,qBAEA,IAAA4e,GAAA/N,KAAAgO,OAAA,GAAA1P,OAAAkQ,UAAA,KACAC,EAAA7J,EAAA,KAAA6B,EAAA,YAGA7Y,GACA2gB,EAAAA,EACAxO,EAAAA,EACAgO,UAAAA,EAEA/W,GAAA,SACApJ,EAAA,EAAA7K,GAEAkG,QAAA6E,KACAA,EAAAA,EAAA,KAAA,MAEA7E,QAAAof,KACAA,EAAAA,EAAA,KAAA,MAEA,mBAAAva,IAAA,MAAAA,GAAAA,EAAAzJ,OAAA,IAAAuJ,EAAA,QAAAE,GACA,mBAAAiT,IAAA,MAAAA,GAAAA,EAAA1c,OAAA,IACAuJ,EAAA,iBAAAmT,GAEA,KAAAyD,IAA+B5W,EAAA,SAAA4W,IAC/B8J,GAAA,IAAAA,KAAA1gB,EAAA,IAAA0gB,GAEAjG,IAAAza,EAAA,KAAAya,GAEAza,EAAAsU,EAAAtU,GAEAya,SAAAza,GAAA,KAEA6gB,GAAApM,EAAAzU,EAEA,IAAA8gB,GAAA/H,EAAA8H,EAAA/H,EAEAgI,GAAAA,EAAApS,QAAA,MAAA,KACAoS,EAAAA,EAAApS,QAAA,MAAA,KAEA1O,EAAA,UAAA8gB,EAEA7K,IACAzX,SAAAoY,EACA5W,KAAAA,EACAiX,QAAA,SAAAhH,GACAsG,EAAAtG,EAAAzR,EAAAsW,IAEAoC,KAAA,SAAAjH,GACAwG,EAAAxG,EAAA6E,IAEA3G,KACA4I,EAAA,KAAA,OAAA,QACA,UAAAC,MAgBA+J,oBAAA,SAAA3X,GAEA,GAQA4H,GACA7C,EATA3P,EAAA4K,EAAA,UAAA,aACAqR,EAAArR,EAAA,UAAA0N,EACAhC,EAAA1L,EAAA,OAAA,aACAwN,EAAAC,KACA3W,EAAAkJ,EAAA,QACA4X,EAAA5X,EAAA,GACA6X,EAAA7X,EAAA,QACA8X,EAAA9X,EAAA,SAIA,OAAA8X,GACAD,EACAD,EACA9gB,EACA2Y,EACA7B,GAGA7I,GACA4I,EAAA,kBACAC,EAAA,UAAAkK,GAGAlQ,GAAsB0J,KAAAX,GAAAY,KAAAF,EAAAxL,KAAAgS,GAEtB,OAAAD,EACAhQ,EAAA,IAAA9Q,EACa,UAAA8gB,IACbhQ,EAAA,OAAA9Q,GAGA8Z,KAAAha,KAAA,WAAAia,QAEAhE,KACAzX,SAAAoY,EACA5W,KAAAgR,EACAiG,QAAA,SAAAhH,GACAsG,EAAAtG,EAAAzR,EAAAsW,IAEAoC,KAAA,SAAAjH,GACAwG,EAAAxG,EAAA6E,IAEA3G,IAAAA,KA3BA5M,GAAA,yBADAA,GAAA,uBADAA,GAAA,4CADAA,GAAA,4CADAA,GAAA,0CADAA,GAAA,kCA+CA4f,MAAA,SAAA/X,EAAA5K,GACA,GAAAA,GAAA4K,EAAA,UAAA5K,EACAsW,EAAA1L,EAAA,OAAA,aACAlJ,EAAAkJ,EAAA,QACA+J,EAAA/J,EAAA,cACAqR,EAAArR,EAAA,SACAwN,EAAAC,IAGA,KAAArY,EAAA,MAAA+C,IAAA,mBACA,KAAAyV,EAAA,MAAAzV,IAAA,wBACA,KAAAsX,EAAA,MAAAtX,IAAA,sBACA,KAAAuX,EAAA,MAAAvX,IAAA,qBAEA,IAAA4e,GAAA/N,KAAAgO,OAAA,GAAA1P,OAAAkQ,UAAA,KACAC,EAAA7J,EAAA,KACA6B,EAAA,YAGA7Y,GAAwBmgB,UAAAA,EACxB,MAAAvJ,IAA+B5W,EAAA,SAAA4W,GAC/B,mBAAA1W,IAAA,MAAAA,GAAAA,EAAAzJ,OAAA,IAAAuJ,EAAA,QAAAE,GACA,mBAAAiT,IAAA,MAAAA,GAAAA,EAAA1c,OAAA,IACAuJ,EAAA,iBAAAmT,GAEAsH,IAAAza,EAAA,KAAAya,GAEAza,EAAAsU,EAAAtU,GAEAya,SAAAza,GAAA,KAEA6gB,GAAApM,EAAAzU,EAEA,IAAA8gB,GAAA/H,EAAA8H,EAAA/H,EAEAgI,GAAAA,EAAApS,QAAA,MAAA,KACAoS,EAAAA,EAAApS,QAAA,MAAA,KAEA1O,EAAA,UAAA8gB,EACA7K,IACAzX,SAAAoY,EACA5W,KAAAA,EACAiX,QAAA,SAAAhH,GACAsG,EAAAtG,EAAAzR,EAAAsW,IAEAoC,KAAA,SAAAjH,GACAwG,EAAAxG,EAAA6E,IAEA3G,KACA4I,EAAA,KAAA,OAAA,QACA,UAAAC,MAaAoK,OAAA,SAAAhY,EAAA5K,GACA4K,EAAA,MAAA,EACAA,EAAA,OAAA,EACAuM,GAAA,MAAAvM,EAAA5K,IAEA6iB,SAAA,SAAA3G,GACAX,GAAAW,EACAtB,KAEAkI,SAAA,WACA,MAAAvH,KAEA1e,QAAA,SAAAS,GACA,MAAAT,SAAAS,IAEAylB,uBAAA,WACA,MAAA5O,uBAAA6C,GAAA,IAEAgM,mBAAA,SAAApY,GACA,GAAA5K,GAAA4K,EAAA,UAAA,aACA0L,EAAA1L,EAAA,OAAA,aACAwN,EAAAC,KACA7W,GAA4B0a,KAAAX,GAAAY,KAAA7D,GAE5BkI,EAAApR,KAAA,UAAA+L,EACAqF,GAAAvoB,OAAA,IAAAuJ,EAAA,MAAA4N,KAAA,UAAA+L,IAEAC,EAAA,GAAA,IAAAA,IAAA5Z,EAAA,UAAA4Z,GAEA,KAAAhD,IAA+B5W,EAAA,SAAA4W,EAE/B,IAAAhE,GAAAzB,OAAAwB,sBAAA6C,GAAA,GAAA,KAAA,MACAtC,EAAAD,4BAAAwC,GAAA,GAAA,KAAA,IAEA7C,KAAAA,EAAA,KACAM,IAAAlT,EAAA,iBAAAkT,GAEA8G,KAAAha,EAAA,WAAAia,IAEAhE,IACAzX,SAAAoY,EACA5W,KAAAsU,EAAAtU,GACAxD,QAAA,EAAAgX,OACArF,KACA4I,EAAA,KAAA,WACA,UAAAC,EACA,UAAApE,EACA,aAEAqE,QAAA,SAAAhH,GACAsG,EAAAtG,EAAAzR,EAAAsW,IAEAoC,KAAA,SAAAjH,GAA+CwG,EAAAxG,EAAA6E,OAG/C2M,YAAA,WACA5kB,aAAAya,GACAza,aAAA6a,GACA7a,aAAAyY,IAEA4E,SAAA,WACAvE,GAAA,cACAuE,IAAAA,MAIAjE,IAAAA,GACA7C,MAAAA,MACA0G,GAAAA,GACAY,KAAAzI,cACArG,IAAAA,IACAqF,KAAAA,KACAyQ,eAAArL,EACA5E,KAAAA,KACAkQ,QAAA,WAAqCtK,EACrC,GAAgBlD,QAAA,kDAEhBvC,SAAAA,SACAgQ,IAAAjR,KACAH,OAAAA,OACAa,QAAAA,QAgEA,OAhCA0I,MAAAA,GAAApE,GAAA,QACAsE,KAAAA,GAAAtE,GAAA,QACAmE,GAAA,IAAA9C,EAAA,OAAA+C,IAEAzC,EAAA9a,QAAA2a,EAAA3D,QACAkE,EAAAlb,QAAA+a,EAAAI,GACArC,EAAA9Y,QACAqZ,GACAN,GAAA,GAAA/B,QASAiE,IAeA9B,GAEA,QAAAT,cAEA,QAAA2M,GAAAC,GACA,MAAAC,UAAA,OAAAD,GAAA,SAAAC,SAAA,IAAA,KAgBA,QAAAC,GAAAhpB,GAcA,MAXAA,GAAAA,MACAA,EAAA,eAAA,gBAAAA,EAAA,WAAAipB,EAAA,YACAjpB,EAAA,eAAA,iBAAAA,EAAA,YAAAipB,EAAA,aACAjpB,EAAA,eAAA,eAAAA,EAAA,UAAAipB,EAAA,WACAjpB,EAAA,eAAA,UAAAA,EAAA,KAAAipB,EAAA,MAGA,IAAAC,EAAA,QAAAlpB,EAAA,YAAA,iBAAAA,EAAA,YAAAipB,EAAA,aACA,IAAAE,EAAA,QAAAC,SAAAppB,EAAA,UAAA,OAAAA,EAAA,UAAAipB,EAAA,WACA,IAAAI,EAAA,QAAArpB,EAAA,KAAA,iBAAAA,EAAA,KAAAipB,EAAA,MAEAjpB,EAIA,QAAAspB,GAAA1sB,EAAAoD,GACA,MAAA,UAAAA,EAAA,YACA+oB,SAAA,IAAA,OAAA,MAAAnsB,GACS,OAAAoD,EAAA,YACT+oB,SAAA,IAAA,IAAA,MAAAnsB,GAEAA,EAIA,QAAA2sB,GAAA3sB,EAAAoD,GAEA,MADApD,GAAA0sB,EAAA1sB,EAAAoD,GACAA,EAAA,WACA+oB,SAAA,IAAA,KAAA,MAAAF,EAAAjsB,GAAA,MAAA,EAAA,KAEAA,EAIA,QAAA4sB,GAAAxpB,GACA,MAAA,OAAAA,EAAA,KACA+oB,SAAA,KAAA,IAEAA,SAAA,KAAA,IAIA,QAAAU,GAAAzpB,GACA,MAAA,OAAAA,EAAA,KAAA+oB,SAAA,IAAA,KAAA,MAAAW,GAAA,KA3DA,GAAAA,GAAA,mBAEAR,GAAA,MAAA,OAAA,SAAA,UACAC,GAAA,IAAA,KACAE,GAAA,MAAA,OAEAJ,GACAU,YAAA,EACAC,YAAA,OACAC,UAAA,IACAxU,KAAA,MAoDA,QAEA4G,QAAA,SAAAjV,EAAApK,EAAAoD,GACA,IAAApD,EAAA,MAAAoK,EACAhH,GAAAgpB,EAAAhpB,EACA,IAAA0pB,GAAAD,EAAAzpB,GACAqV,EAAAmU,EAAAxpB,GACAokB,EAAAmF,EAAA3sB,EAAAoD,GACA8pB,EAAAlV,KAAA,UAAA5N,GACA+iB,EAAAhB,SAAA,IAAA,QAAAe,EAAA1F,GAAyFsF,GAAAA,EAAArU,KAAAA,IAAuB,WAChH2U,EAAAD,EAAA,SAAAhB,SAAA,IAAA,OACA,OAAAiB,IAAAhjB,GAGAoV,QAAA,SAAApV,EAAApK,EAAAoD,GACA,IAAApD,EAAA,MAAAoK,EACAhH,GAAAgpB,EAAAhpB,EACA,IAAA0pB,GAAAD,EAAAzpB,GACAqV,EAAAmU,EAAAxpB,GACAokB,EAAAmF,EAAA3sB,EAAAoD,EACA,KACA,GAAAiqB,GAAAlB,SAAA,IAAA,OAAA,MAAA/hB,GACAkjB,EAAAnB,SAAA,IAAA,SAA6DoB,WAAAF,GAAyB7F,GAAesF,GAAAA,EAAArU,KAAAA,IAAuB,SAAA0T,SAAA,IAAA,MAC5HqB,EAAAxV,KAAA,MAAAsV,EACA,OAAAE,GAEA,MAAAxiB,GACA,MAAAH,WAxuEAxD,OAAA,MAAAA,OAAA,KAAA,WAAA,WAGA,QAAAomB,QAAAztB,GACA,IAAkB,MAAAjB,MAAA2uB,UAClB,MAAA1iB,GAAkB,MAAA,OAkBlB,QAAA2iB,OAAAC,GAEA,MADAC,WAAAC,UAAA,EACAD,UAAAjY,KAAAgY,GACA,IAAAA,EAAA9U,QAAA+U,UAAA,SAAApJ,GACA,GAAAjlB,GAAAuuB,KAAAtJ,EACA,OAAA,gBAAAjlB,GAAAA,EACA,OAAA,OAAAilB,EAAA5H,WAAA,GAAA1M,SAAA,KAAAoC,MAAA,MACa,IACb,IAAAqb,EAAA,IAGA,QAAA3R,KAAAjc,EAAAguB,GACA,GAAAptB,GACA2E,EACAC,EACA3E,EACAotB,EACAC,EAAAC,IACAlqB,EAAA+pB,EAAAhuB,EAUA,QARAiE,GAAA,gBAAAA,KACAA,EAAAwpB,OAAAnuB,KAAA2E,EAAAjE,IAGA,kBAAAouB,OACAnqB,EAAAmqB,IAAA9uB,KAAA0uB,EAAAhuB,EAAAiE,UAGAA,IACA,IAAA,SACA,MAAA0pB,OAAA1pB,EAEA,KAAA,SACA,MAAAoqB,UAAApqB,GAAA0R,OAAA1R,GAAA,MAEA,KAAA,UACA,IAAA,OACA,MAAA0R,QAAA1R,EAEA,KAAA,SAEA,IAAAA,EACA,MAAA,MAMA,IAHAkqB,KAAAG,OACAL,KAEA,mBAAAhuB,OAAAC,UAAAiQ,SAAAmC,MAAArO,GAAA,CAGA,IADApD,EAAAoD,EAAApD,OACAD,EAAA,EAA2BC,EAAAD,EAAYA,GAAA,EACvCqtB,EAAArtB,GAAAqb,IAAArb,EAAAqD,IAAA,MASA,OANAuB,GAAA,IAAAyoB,EAAAptB,OAAA,KACAstB,IAAA,MAAAA,IACAF,EAAApoB,KAAA,MAAAsoB,KAAA,KACAD,EAAA,IACA,IAAAD,EAAApoB,KAAA,KAAA,IACAsoB,IAAAD,EACA1oB,EAEA,GAAA4oB,KAAA,gBAAAA,KAEA,IADAvtB,EAAAutB,IAAAvtB,OACAD,EAAA,EAA2BC,EAAAD,EAAYA,GAAA,EACvC2E,EAAA6oB,IAAAxtB,GACA,gBAAA2E,KACAC,EAAAyW,IAAA1W,EAAAtB,GACAuB,GACAyoB,EAAAtoB,KAAAgoB,MAAApoB,IAAA4oB,IAAA,KAAA,KAAA3oB,QAKA,KAAAD,IAAAtB,GACAhE,OAAAE,eAAAb,KAAA2E,EAAAsB,KACAC,EAAAyW,IAAA1W,EAAAtB,GACAuB,GACAyoB,EAAAtoB,KAAAgoB,MAAApoB,IAAA4oB,IAAA,KAAA,KAAA3oB,GAUA,OAJAA,GAAA,IAAAyoB,EAAAptB,OAAA,KACAstB,IAAA,MAAwBA,IAAAF,EAAApoB,KAAA,MAAAsoB,KAAA,KACxBD,EAAA,IAAiC,IAAMD,EAAApoB,KAAA,KAAA,IACvCsoB,IAAAD,EACA1oB,GA/GA6B,OAAA,OAAAA,OAAA,QAOA,IAAAknB,IAAA,2GACAV,UAAA,2HACAM,IACAG,OACAP,MACAS,KAAA,MACAC,IAAA,MACAC,KAAA,MACAC,KAAA,MACAC,KAAA,MACAC,IAAA,MACAC,KAAA,QAEAV,GA+FA,mBAAApW,MAAA,YACAA,KAAA,UAAA,SAAA/T,EAAA8qB,EAAAC,GACA,GAAApuB,EAIA,IAHAutB,IAAA,GACAG,OAAA,GAEA,gBAAAU,GACA,IAAApuB,EAAA,EAA2BouB,EAAApuB,EAAWA,GAAA,EACtC0tB,QAAA,QAEa,gBAAAU,KACbV,OAAAU,EAGA,IADAZ,IAAAW,EACAA,GAAA,kBAAAA,KACA,gBAAAA,IACA,gBAAAA,GAAAluB,QACA,KAAA,IAAAoK,OAAA,iBAEA,OAAAgR,KAAA,IAA4B,GAAAhY,MAI5B,kBAAA+T,MAAA,QAEAA,KAAA,MAAA,SAAAH,MAAyC,MAAAoX,MAAA,IAAApX,KAAA,SAGzC,IAAAgD,KAAA,EACA4C,OAAA,EACAC,gBACAuH,gBAAA,UACArC,cAAA,GACAsM,YAAA,IACApM,gBAAA,IACAC,cAAA,GACAnF,OAAA,IACAzC,OAAA,IACAK,UAAA,IACA2D,sBAAA,EACAC,oBAAA,GACA8G,QAAA,SACAhK,KAAA,eAaAoH,WAAA,WACA,GAAA6L,GAAA,GACAC,EAAA5S,KAAAgO,MAAAhO,KAAAC,SAAA0S,EACA,OAAA,UAAAnK,EAAAqK,GACA,MAAArK,GAAA5e,QAAA,WAAA,GACA4e,EAAAlM,QACA,SAAA,MACAuW,EAAAhT,gBAAApW,MAAA,KAAA,KACAmpB,EAAAD,EAAAC,EAAAA,EAAA,KACApK,KA+jEA3d,QAAA,QAAA,WAuEA,QAAAioB,GAAAllB,EAAApK,GACA,GAAAuvB,GAAApD,SAAA,WAAA/hB,EAAApK,EACA,OAAAuvB,GAAApf,SAAAgc,SAAA,IAAA,QAQA,QAAAqD,GAAApwB,GAAgB,MAAA4K,UAAAylB,eAAArwB,GAOhB,QAAAuM,GAAA4S,GAAyBmR,QAAA,MAAAnR,GAOzB,QAAArB,GAAAyS,EAAAlI,GACA,GAAAhO,KAMA,OALA4B,MAAAsU,EAAA1pB,MAAA,OAAA,SAAA2pB,GACAvU,MAAAoM,GAAAzd,UAAA6lB,qBAAAD,GAAA,SAAApmB,GACAiQ,EAAA9T,KAAA6D,OAGAiQ,EAUA,QAAAqW,GAAAzW,EAAAuW,EAAAzb,GACAkH,KAAAhC,EAAApT,MAAA,KAAA,SAAA8pB,GACA,GAAAC,GAAA,SAAAhlB,GACAA,IAAAA,EAAA3D,OAAA4oB,OACA9b,EAAAnJ,KACAA,EAAAklB,cAAA,EACAllB,EAAAmlB,gBAAAnlB,EAAAmlB,iBACAnlB,EAAAolB,iBAAAplB,EAAAolB,mBAIAR,GAAAS,iBAAAT,EAAAS,iBAAAN,EAAAC,GAAA,GACAJ,EAAAU,YAAAV,EAAAU,YAAA,KAAAP,EAAAC,GACAJ,EAAA,KAAAG,GAAAC,IAoBA,QAAAhX,KAAiB,MAAAkE,GAAA,QAAA,GAOjB,QAAAqT,GAAA/mB,EAAAgnB,EAAAvsB,GACA,MAAAA,OAAAuF,GAAAinB,aAAAD,EAAAvsB,GACAuF,GAAAA,EAAAknB,cAAAlnB,EAAAknB,aAAAF,GAQA,QAAAG,GAAAC,EAAAC,GACA,IAAA,GAAAC,KAAAD,GAAA,GAAAA,EAAA1wB,eAAA2wB,GACA,IAAaF,EAAAE,MAAAA,GAAAD,EAAAC,IACb,0BAAA1qB,QAAA0qB,GAAA,GACA,gBAAAD,GAAAC,GACA,KAAA,IACU,MAAA9lB,KAQV,QAAA+lB,GAAAH,GAA0B,MAAA5mB,UAAAgnB,cAAAJ,GAQ1B,QAAA3P,KAAqB,MAAAgQ,IAAAC,IAAA,EAAAtW,SAuCrB,QAAAyF,GAAA5B,GACA,GAAAwS,GAAAC,IAAA,MAAAC,GAAA1S,EAEA,IAAA2S,GAAAL,EAAA,UACAnoB,EAAA6V,EAAA7V,SACAxJ,EAAAwb,SACAyW,EAAA,EACAC,EAAA7S,EAAA7X,SAAAsoB,YACAqC,EAAA3qB,QAAA,WAAwC4qB,EAAA,GAASjT,QAAA,aAAwB+S,GACzEhQ,EAAA7C,EAAA6C,MAAA,aACAlX,EAAAqU,EAAArU,SACAiX,EAAA5C,EAAA4C,SAAA,aACApL,EAAA,WAAgC+C,IAAAyY,YAAAL,IAChCI,EAAA,SAAArjB,EAAAkM,GACAgX,IACAA,EAAA,EAEAD,EAAA3a,QAAA,KACAxP,aAAAsqB,GAEApjB,IAAAkM,GAAAgH,EAAAhH,GAEAzT,QAAA,WACAuH,GAAAmT,GACA,IAAA4K,GAAAsD,EAAApwB,GACAK,EAAAysB,GAAAA,EAAAwF,UACAjyB,IAAAA,EAAAkyB,YAAAzF,IACatO,SAeb,OAZAvW,QAAAuB,GAAA,SAAAyR,GACAmX,EAAA,EAAAnX,IAGAoE,EAAAmG,WAAAwM,EAAAQ,GAAAA,GAEAR,EAAA3a,QAAA,WAAiC+a,EAAA,IACjCJ,EAAAS,IAAA7W,UAAAyD,EAAAlG,IAAAnO,GAEAmmB,EAAAa,EAAA,KAAAhyB,GAEA6W,IACAub,EAYA,QAAAL,GAAA1S,GACA,GAAA1F,GAAAsB,EACAgX,EAAA,WACA,IAAAhyB,EAAA,CACAA,EAAA,EAEA4H,aAAAsqB,EAEA,KAAuBlX,EAAArC,KAAA,MAAAe,EAAAuB,cACvB,MAAAiC,GAAuB,MAAAiV,GAAA,GAEvBM,EAAA,EACAzQ,EAAAhH,KAEAyX,EAAA,EACAzyB,EAAA,EACAiyB,EAAA7S,EAAA7X,SAAAsoB,YACAqC,EAAA3qB,QAAA,WAAuC4qB,EAAA,GAASjT,QAAA,aAAwB+S,GACxEhQ,EAAA7C,EAAA6C,MAAA,aACAlX,EAAAqU,EAAArU,SACAiX,EAAA5C,EAAA4C,SAAA,aACA0Q,GAAAtT,EAAA,SACA+S,EAAA,SAAArjB,EAAAkM,GACAyX,IACAA,EAAA,EAEA7qB,aAAAsqB,GAEAxY,IACAA,EAAAtC,QAAAsC,EAAAvC,OAAA,KACAuC,EAAAiZ,OAAAjZ,EAAAiZ,QACAjZ,EAAA,MAGA5K,GAAAmT,EAAAjH,IAIA,KACAtB,EAAAmY,KACA7pB,OAAA4qB,gBACA,GAAAA,iBACA,GAAA7X,gBAEArB,EAAAtC,QAAAsC,EAAAmZ,QAAA,SAAAlnB,GAAkDwmB,EAClD,EAAAxmB,GAAA+N,GAAAA,EAAAuB,eAAkD3O,MAAA,8BAElDoN,EAAAvC,OAAAuC,EAAAoZ,UAAAd,EACAtY,EAAAqZ,mBAAA,WACA,GAAArZ,GAAA,GAAAA,EAAAsZ,WACA,OAAAtZ,EAAAO,QACA,IAAA,KACA,KACA,SACA,IACAe,EAAArC,KAAA,MAAAe,EAAAuB,cACAkX,EAAA,EAAAnX,GAEA,MAAAkC,GAAmC,MAAAiV,GAAA,GAAiBlY,OAAAP,EAAAO,OAAAuO,QAAA,KAAAtJ,QAAAxF,EAAAuB,eACpD,QAKA,IAAA/B,GAAAyC,UAAAyD,EAAAlG,IAAAnO,EAEA2O,GAAAwB,KAAA,MAAAhC,EAAAwZ,GACAA,IAAAhZ,EAAAnS,QAAA0qB,GACAvY,EAAA4B,OAEA,MAAA2X,GAGA,MAFAd,GAAA,GACAP,EAAA,EACA5Q,EAAA5B,GAIA,MAAA+S,GAIA,QAAAhQ,KACA,KAAA,UAAA+Q,YAAA,MAAA,EACA,KAAe,MAAAA,WAAA,OACf,MAAAvnB,GAAe,OAAA,GAIf,QAAAwZ,GAAAjM,GACA,MAAA,cAAAga,WAEAA,UAAA,WAAAha,IAFA,EA4HA,QAAA2Y,KACA,IAAAsB,IAAAA,EAAA,IAAA,MAAA,EAEA,IAAAC,IACArzB,GAAA8xB,EAAA,KACAvW,KAAA,aACAqX,MAAA,WAA8BS,EAAA,OAC9BlY,KAAA,SAAApC,EAAAI,GACA2Y,EAAAuB,EAAA,IAAAA,EACAD,EAAA,IAAAC,EAAA,GAAAla,IAIA,OAAAka,GAjfA,GAAAC,GAAA,6CACAd,EAAA,QACAe,EAAAJ,UAAAK,UACAC,EAAA,uBACA5B,EAAA,IAAA0B,EAAAvsB,QAAA,SAKAiB,QAAAqoB,UAAAroB,OAAAqoB,QAAAroB,OAAAqoB,aACAA,QAAAoD,MACApD,QAAAoD,IACApD,QAAA/jB,OACAtE,OAAA0rB,WAAsBC,WAAA,aAMtB,IAAA9O,GAAA,WACA,GAAAqE,MACA0K,GAAA,CACA,KACAA,EAAA5rB,OAAA,aACK,MAAA2D,IACL,GAAAkoB,GAAA,SAAAlzB,GACA,MAAA,IAAAgK,SAAAmpB,OAAA/sB,QAAApG,GAAA,OACAgK,SAAAmpB,QAAA,IAAA1pB,MACA2pB,OAAApzB,EAAA,kBACA,IAAA,MAEAqzB,EAAA,SAAArzB,EAAAiE,GACA+F,SAAAmpB,OAAAnzB,EAAA,IAAAiE,EACA,kDAEAqvB,EAAA,WACA,IAEA,MADAD,GAAA,UAAA,KACA,MAAAH,EAAA,WACS,MAAAloB,GACT,OAAA,KAGA,QACA0O,IAAA,SAAA1Z,GACA,IACA,MAAAizB,GAAAA,EAAAM,QAAAvzB,GACAszB,EAAAJ,EAAAlzB,GACAuoB,EAAAvoB,GACa,MAAAgL,GACb,MAAAud,GAAAvoB,KAGA8Z,IAAA,SAAA9Z,EAAAiE,GACA,IACA,GAAAgvB,EAAA,MAAAA,GAAAO,QAAAxzB,EAAAiE,IAAA,CACAqvB,IAAAD,EAAArzB,EAAAiE,GACAskB,EAAAvoB,GAAAiE,EACa,MAAA+G,GACbud,EAAAvoB,GAAAiE,QAuIAwvB,GACAha,QACAia,OAAA,SAAAze,GAAiCwe,EAAAha,KAAAxE,OACjC6a,KAAA,SAAA7a,EAAAd,IACAsf,EAAAha,KAAAxE,GAAAwe,EAAAha,KAAAxE,QAAAtP,KAAAwO,IAEAwf,KAAA,SAAA1e,EAAA7K,GACAiR,KACAoY,EAAAha,KAAAxE,OACA,SAAAd,GAA2BA,EAAA/J,OAwK3BwpB,EAAApE,EAAA,WAAA,EACAqE,EAAA,SAAApV,GAGAwS,EAAAxS,EAAA,MAAA,EACA,IAAAkU,EAAAvsB,QAAA,SAEA,IAAAgb,GAAA3C,EAAA,eAAA,GAIAqV,KAHArV,EAAA,WAAAsE,eAAAnF,OACAa,EAAA,MAAAyF,EAAA,IAAA9C,EAAA,SAAA,GAEA3C,EAAA,iBAAA,EAEAA,GAAA,IAAA4B,EACA5B,EAAA,GAAAyF,EACAzF,EAAA,MAAAA,EAAA,OAAA9S,EACA8S,EAAA,WAAA+C,EACA/C,EAAA,SAAAwC,EACAxC,EAAA,YAAA6Q,EACA7Q,EAAA,WAAAa,aACAb,EAAA,WAAA+F,EACA/F,EAAA,QAA2BsV,MAAAlB,EAE3B,IAAA9S,GAAA,SAAAtB,GACA,MAAAoV,GAAApV,IAGAuV,EAAAxV,OAAAC,EAEA,KAAA,GAAAwV,KAAAD,GACAA,EAAA7zB,eAAA8zB,KACAlU,EAAAkU,GAAAD,EAAAC,GAuBA,OApBAlU,GAAA,IAAA4Q,EACA5Q,EAAA,EAAAyP,EACAzP,EAAA,OAAAgR,EACAhR,EAAA,KAAA+P,EACA/P,EAAA,KAAA/G,EACA+G,EAAA,OAAA7C,EACA6C,EAAA,KAAAwQ,EACAxQ,EAAA,OAAA0T,EACA1T,EAAA,KAAAA,EACAA,EAAA,OAAAA,EACAA,EAAA,WAAAT,aAIAwQ,EAAA,eAAAzoB,OAAA,WAEA,MADAysB,IAAA/T,EAAA,gBAAA,SAAA2I,GAA+D3I,EAAA,MAAA2I,EAAAzT,KAAA,MAC/D,IAIAwJ,EAAA,OAAAsB,GAEA+P,EAAA,UAAAzoB,OAAA0Y,EAAA,SACA+P,EAAA,UAAA9lB,SAAA+V,EAAA,SAGAA,GAEA8T,GAAA,KAAAA,EACAA,EAAA,OAAAA,EACAA,EAAA,WAAAvU,aAGA,aAAAtV,SAAAqoB,WACAzrB,QAAA4W,MAAA,GAGAsS,EAAA,OAAAzoB,OAAA,WAAqCT,QAAA4W,MAAA,IAGrC,IAAA0W,GAAAN,KAGA5vB,QAAA6vB,GACAM,OAAA,EACAC,YAAA7D,EAAA2D,EAAA,WACAG,cAAA9D,EAAA2D,EAAA,WACAI,KAAAtqB,SAAAuqB,SAAAC,KAAApuB,QAAA,UACA,MAAAmqB,EAAA2D,EAAA,OACAlP,OAAAuL,EAAA2D,EAAA,UACApP,KAAAyL,EAAA2D,EAAA,UAIA7sB,OAAA,SAAAA,OAAA,OAAA,OAAAwsB,GAGA,mBAAA,UAAAj1B,OAAA,QAAAoF,SAAAwZ,OAEA,IAAAgV,GAAAhD,EAAA,YAAA,CAGAoE,KAGAjD,EAAAiD,GAAYa,SAAA,WAAAC,KAAA9W,UAEZ,SAAAvW,SAAAkpB,EAAAqD,EAAA,YAAAA,EAAA,UACA,2BAAAlB,EACA,4BAAAA,EACA,yDAGA1uB,OAAA,IAAA,SAAA5E,EAAAgL,GACA,MAAAA,IACA8mB,EAAA9xB,GAAA,aAAAu1B,SAAAvqB,OACA8mB,GAAA9xB,GAAA,UAFA8xB,EAAA9xB,GAAA,WAoBA8xB,EAAA,GAAAtT,WAGA,WAKA,GAAAgX,GAAA5wB,OAAA,GAAA,SAAAuU,EAAAsc,GACA,KAAA91B,eAAA61B,IAAA,MAAA,IAAAA,GAAArc,EAAAsc,EAEA,IAAA7kB,GAAAjR,KACAwZ,EAAAvI,EAAAuI,IAAAA,GAAA,GAEAuc,GADA9kB,EAAA+kB,SAAAF,GAAA,yBACAtc,EAAAtS,MAAA,MACAwY,GACA6V,IAAA,SAAAQ,EAAA,GACA9P,OAAA8P,EAAA,GACAV,YAAAU,EAAA,GACAT,cAAAS,EAAA,GACAxqB,QAAAwqB,EAAA,GAgCA,OA5BA9kB,GAAA,WAAA,EACAA,EAAA,KAAA,EACAA,EAAA,QAAA,EACAA,EAAA,OAAA,EAGAA,EAAA,aAAA,IACAA,EAAA,iBAAA,KACAA,EAAA,qBAAA,KACAA,EAAA,kBAAA,KACAA,EAAA,gBAAA,KACAA,EAAA,gBAAA,KACAA,EAAA,eAAA,KAGAA,EAAA,QAAAA,EAAA,QACAA,EAAA,UAAAA,EAAA,OACAA,EAAA,OAAA,aAGAA,EAAA,WAAA,GACAA,EAAA,WAAA,GACAA,EAAA,eAAA,EACAA,EAAA,cAAA,EACAA,EAAA,UACAA,EAAA,WAAAA,EAAA,WAGAuI,GAWAvI,EAAAglB,OAAAhxB,OAAA,KAAAya,GACAzO,EAAAglB,OAAAvW,MAAAA,EACAzO,EAAAyO,MAAAA,MAEAzO,GAAAglB,OAAA,WACA7K,SAAA,EACA7f,QAAAmU,EAAA,QACAyK,WAAAlZ,EAAA,QACAiZ,UAAAjZ,EAAA,OACArE,MAAA,WACAqE,EAAA,SACA9E,KAAA8E,EAAA,eACA1D,OAAA,cACA2oB,UAAA,KAGArsB,SAAA,SAAA2V,GACAvO,EAAA,WAA+B5F,KAAAmU,KAE/BZ,QAAA,WACA3N,EAAA,WAAAA,EAAA,KACAA,EAAA,cA/BAA,EAAA,WAAAA,EAAA,OACAA,EAAA,SACA9E,KAAA8E,EAAA,eACA1D,OAAA,cACA2oB,UAAA,IAEAjlB,GAiCA4kB,GAAA10B,UAAAya,KAAA,SAAAvQ,GACA,GAAA4F,GAAAjR,IACAiR,GAAAglB,OAAA,SACA1qB,QAAA0F,EAAAglB,OAAAvW,MAAA,QACAF,QAAAnU,EACAxB,SAAA,SAAAyR,GACArK,EAAA,QAA4B5F,KAAAiQ,QAQ5Bua,EAAA10B,UAAA0S,MAAA,WACA,GAAA5C,GAAAjR,IACAiR,GAAAglB,OAAA,aAAgC1qB,QAAA0F,EAAAglB,OAAAvW,MAAA,UAChCzO,EAAA,WAAAA,EAAA,OACAA,EAAA,eAUA,IAAAmc,UAAAA,UAAA,SAAA+I,EAAAhJ,GAAqC,GAAAvP,MAAQwY,EAAAxY,EAAAyY,OAAWC,EAAA,aAAe91B,EAAA41B,EAAAG,MAAWC,OAAA,SAAA9Q,GAAmB4Q,EAAAn1B,UAAAnB,IAAiB,IAAAS,GAAA,GAAA61B,EAA8I,OAAlI5Q,IAAAjlB,EAAAg2B,MAAA/Q,GAAcjlB,EAAAW,eAAA,UAAAX,EAAAwa,KAAA,WAA6Cxa,EAAAi2B,OAAAzb,KAAA1H,MAAAvT,KAAA8S,aAAsCrS,EAAAwa,KAAA9Z,UAAAV,EAAmBA,EAAAi2B,OAAA12B,KAAcS,GAASuxB,OAAA,WAAmB,GAAAtM,GAAA1lB,KAAAw2B,QAA8C,OAA1B9Q,GAAAzK,KAAA1H,MAAAmS,EAAA5S,WAA0B4S,GAASzK,KAAA,aAAkBwb,MAAA,SAAA/Q,GAAmB,IAAA,GAAAjlB,KAAAilB,GAAAA,EAAAtkB,eAAAX,KAAAT,KAAAS,GAAAilB,EAAAjlB,GAAmDilB,GAAAtkB,eAAA,cAAApB,KAAAoR,SAAAsU,EAAAtU,WAAyDulB,MAAA,WAAkB,MAAA32B,MAAAib,KAAA9Z,UAAAq1B,OAAAx2B,QAC1fwd,EAAA4Y,EAAAQ,UAAAp2B,EAAAg2B,QAAwBvb,KAAA,SAAAyK,EAAAjlB,GAAmBilB,EAAA1lB,KAAA62B,MAAAnR,MAAmB1lB,KAAA82B,SAAAr2B,GAAA0sB,EAAA1sB,EAAA,EAAAilB,EAAA5jB,QAAgCsP,SAAA,SAAAsU,GAAsB,OAAAA,GAAAlf,GAAAya,UAAAjhB,OAA6B8U,OAAA,SAAA4Q,GAAoB,GAAAjlB,GAAAT,KAAA62B,MAAAE,EAAArR,EAAAmR,MAAAlR,EAAA3lB,KAAA82B,QAAqE,IAA1BpR,EAAAA,EAAAoR,SAAa92B,KAAAg3B,QAAarR,EAAA,EAAA,IAAA,GAAA1Z,GAAA,EAAmByZ,EAAAzZ,EAAIA,IAAAxL,EAAAklB,EAAA1Z,IAAA,KAAA8qB,EAAA9qB,IAAA,KAAA,GAAA,GAAAA,EAAA,GAAA,MAAA,GAAA,IAAA0Z,EAAA1Z,GAAA,OAA4D,IAAA,MAAA8qB,EAAAj1B,OAAA,IAAAmK,EAAA,EAA+ByZ,EAAAzZ,EAAIA,GAAA,EAAAxL,EAAAklB,EAAA1Z,IAAA,GAAA8qB,EAAA9qB,IAAA,OAAyBxL,GAAAmG,KAAA2M,MAAA9S,EAAAs2B,EAAwC,OAAjB/2B,MAAA82B,UAAApR,EAAiB1lB,MAAYg3B,MAAA,WAAkB,GAAAtR,GAAA1lB,KAAA62B,MAAAp2B,EAAAT,KAAA82B,QAAiCpR,GAAAjlB,IAAA,IAAA,YAChe,GAAA,GAAAA,EAAA,GAAWilB,EAAA5jB,OAAAq0B,EAAAc,KAAAx2B,EAAA,IAAqBk2B,MAAA,WAAkB,GAAAjR,GAAAllB,EAAAm2B,MAAAp2B,KAAAP,KAAqD,OAA5B0lB,GAAAmR,MAAA72B,KAAA62B,MAAArjB,MAAA,GAA4BkS,GAAShI,OAAA,SAAAgI,GAAoB,IAAA,GAAAjlB,MAAAs2B,EAAA,EAAiBrR,EAAAqR,EAAIA,GAAA,EAAAt2B,EAAAmG,KAAA,WAAAuvB,EAAAzY,SAAA,EAAqC,OAAA,IAAAF,GAAAvC,KAAAxa,EAAAilB,MAAwB1I,EAAAY,EAAAsZ,OAAY1wB,EAAAwW,EAAAma,KAAUlW,UAAA,SAAAyE,GAAsB,GAAAjlB,GAAAilB,EAAAmR,KAAcnR,GAAAA,EAAAoR,QAAa,KAAA,GAAAC,MAAApR,EAAA,EAAiBD,EAAAC,EAAIA,IAAA,CAAK,GAAA1Z,GAAAxL,EAAAklB,IAAA,KAAA,GAAA,GAAAA,EAAA,GAAA,GAAgCoR,GAAAnwB,MAAAqF,IAAA,GAAAmF,SAAA,KAA6B2lB,EAAAnwB,MAAA,GAAAqF,GAAAmF,SAAA,KAA4B,MAAA2lB,GAAAjwB,KAAA,KAAkBoS,MAAA,SAAAwM,GAAmB,IAAA,GAAAjlB,GAAAilB,EAAA5jB,OAAAi1B,KAAApR,EAAA,EAA4BllB,EAAAklB,EAAIA,GAAA,EAAAoR,EAAApR,IAAA,IAAA8H,SAAA/H,EAAA0R,OAAAzR,EACrd,GAAA,KAAA,GAAA,GAAAA,EAAA,EAAmB,OAAA,IAAAnI,GAAAvC,KAAA8b,EAAAt2B,EAAA,KAA0B+mB,EAAAxK,EAAAqa,QAAapW,UAAA,SAAAyE,GAAsB,GAAAjlB,GAAAilB,EAAAmR,KAAcnR,GAAAA,EAAAoR,QAAa,KAAA,GAAAC,MAAApR,EAAA,EAAiBD,EAAAC,EAAIA,IAAAoR,EAAAnwB,KAAAgQ,OAAA0gB,aAAA72B,EAAAklB,IAAA,KAAA,GAAA,GAAAA,EAAA,GAAA,KAA2D,OAAAoR,GAAAjwB,KAAA,KAAkBoS,MAAA,SAAAwM,GAAmB,IAAA,GAAAjlB,GAAAilB,EAAA5jB,OAAAi1B,KAAApR,EAAA,EAA4BllB,EAAAklB,EAAIA,IAAAoR,EAAApR,IAAA,KAAA,IAAAD,EAAA5H,WAAA6H,KAAA,GAAA,GAAAA,EAAA,EAAgD,OAAA,IAAAnI,GAAAvC,KAAA8b,EAAAt2B,KAAwB82B,EAAAva,EAAAwa,MAAWvW,UAAA,SAAAyE,GAAsB,IAAI,MAAAte,oBAAAqwB,OAAAjQ,EAAAvG,UAAAyE,KAAkD,MAAAjlB,GAAS,KAAAyL,OAAA,0BAAsCgN,MAAA,SAAAwM,GAAmB,MAAA8B,GAAAtO,MAAA0c,SAAA/uB,mBAAA6e,OACjenI,EAAA6Y,EAAAsB,uBAAAl3B,EAAAg2B,QAAqCmB,MAAA,WAAiB33B,KAAA43B,MAAA,GAAApa,GAAAvC,KAAsBjb,KAAA63B,YAAA,GAAmBC,QAAA,SAAApS,GAAqB,gBAAAA,KAAAA,EAAA6R,EAAAre,MAAAwM,IAAmC1lB,KAAA43B,MAAA9iB,OAAA4Q,GAAqB1lB,KAAA63B,aAAAnS,EAAAoR,UAA6BiB,SAAA,SAAArS,GAAsB,GAAAjlB,GAAAT,KAAA43B,MAAAb,EAAAt2B,EAAAo2B,MAAAlR,EAAAllB,EAAAq2B,SAAA7qB,EAAAjM,KAAAg4B,UAAApa,EAAA+H,GAAA,EAAA1Z,GAAA2R,EAAA8H,EAAAyQ,EAAAc,KAAArZ,GAAAuY,EAAA/F,KAAA,EAAAxS,GAAA5d,KAAAi4B,eAAA,EAAyI,IAArBvS,EAAA9H,EAAA3R,EAAM0Z,EAAAwQ,EAAA+B,IAAA,EAAAxS,EAAAC,GAAeD,EAAA,CAAM,IAAA,GAAA0Q,GAAA,EAAY1Q,EAAA0Q,EAAIA,GAAAnqB,EAAAjM,KAAAm4B,gBAAApB,EAAAX,EAA+BA,GAAAW,EAAAqB,OAAA,EAAA1S,GAAgBjlB,EAAAq2B,UAAAnR,EAAc,MAAA,IAAAnI,GAAAvC,KAAAmb,EAAAzQ,IAAuBgR,MAAA,WAAkB,GAAAjR,GAAAllB,EAAAm2B,MAAAp2B,KAAAP,KACzc,OAA3B0lB,GAAAkS,MAAA53B,KAAA43B,MAAAjB,QAA2BjR,GAASuS,eAAA,GAAoB7B,GAAAiC,OAAA9a,EAAAiZ,QAAmB8B,IAAA93B,EAAAg2B,SAAAvb,KAAA,SAAAyK,GAAgC1lB,KAAAs4B,IAAAt4B,KAAAs4B,IAAA9B,OAAA9Q,GAA4B1lB,KAAA23B,SAAaA,MAAA,WAAkBpa,EAAAoa,MAAAp3B,KAAAP,MAAmBA,KAAAu4B,YAAgBC,OAAA,SAAA9S,GAAoD,MAAhC1lB,MAAA83B,QAAApS,GAAgB1lB,KAAA+3B,WAAgB/3B,MAAYy4B,SAAA,SAAA/S,GAAyC,MAAnBA,IAAA1lB,KAAA83B,QAAApS,GAAmB1lB,KAAA04B,eAA0BV,UAAA,GAAAW,cAAA,SAAAjT,GAAwC,MAAA,UAAAjlB,EAAAs2B,GAAqB,MAAA,IAAArR,GAAAzK,KAAA8b,GAAA0B,SAAAh4B,KAAmCm4B,kBAAA,SAAAlT,GAA+B,MAAA,UAAAjlB,EAAAs2B,GAAqB,MAAA,IAAA8B,GAAAC,KAAA7d,KAAAyK,EACheqR,GAAA0B,SAAAh4B,MAAoB,IAAAo4B,GAAAjb,EAAAmb,OAAgB,OAAAnb,IAASH,OAG7C,SAAA0Y,GAAa,IAAA,GAAAhJ,GAAAC,SAAAxP,EAAAuP,EAAAkJ,IAAAD,EAAAxY,EAAAgZ,UAAAN,EAAA1Y,EAAAya,OAAAza,EAAAuP,EAAA4L,KAAAv4B,KAAAgd,KAAAR,EAAA,SAAA0I,GAAqF,MAAA,aAAAA,GAAA,EAAAA,IAAA,GAA8Blf,EAAA,EAAAghB,EAAA,EAAS,GAAAA,GAAK,CAAE,GAAA+P,EAAM7R,GAAA,CAAG6R,EAAA/wB,CAAI,KAAA,GAAA+W,GAAA4Y,EAAA6C,KAAAzB,GAAAsB,EAAA,EAAwBtb,GAAAsb,EAAKA,IAAA,KAAAtB,EAAAsB,GAAA,CAAetB,GAAA,CAAK,MAAA7R,GAAQ6R,GAAA,EAAKA,IAAA,EAAA/P,IAAAhnB,EAAAgnB,GAAAxK,EAAAmZ,EAAA8C,IAAAzyB,EAAA,MAAAgX,EAAAgK,GAAAxK,EAAAmZ,EAAA8C,IAAAzyB,EAAA,EAAA,IAAAghB,KAA0DhhB,IAAI,GAAAkf,MAAA9H,EAAAA,EAAAsP,OAAAoJ,EAAAE,QAA8B+B,SAAA,WAAoBv4B,KAAAk5B,MAAA,GAAA9C,GAAAnb,KAAAza,EAAAgT,MAAA,KAAkC2kB,gBAAA,SAAA13B,EAAAs2B,GAA+B,IAAA,GAAApR,GAAA3lB,KAAAk5B,MAAArC,MAAA5qB,EAAA0Z,EAAA,GAAA/H,EAAA+H,EAAA,GAAAyQ,EAAAzQ,EAAA,GAAA4R,EAAA5R,EAAA,GAAAwQ,EAAAxQ,EAAA,GAAAnlB,EAAAmlB,EAAA,GAAA6B,EAAA7B,EAAA,GAAA2Q,EAAA3Q,EAAA,GAAAjlB,EAAA,EAAuF,GAAAA,EAAKA,IAAA,CAAK,GAAA,GAAAA,EAAAglB,EAAAhlB,GAC7e,EAAAD,EAAAs2B,EAAAr2B,OAAS,CAAK,GAAA8F,GAAAkf,EAAAhlB,EAAA,IAAAsc,EAAA0I,EAAAhlB,EAAA,EAAuBglB,GAAAhlB,KAAA8F,GAAA,GAAAA,IAAA,IAAAA,GAAA,GAAAA,IAAA,IAAAA,IAAA,GAAAkf,EAAAhlB,EAAA,KAAAsc,GAAA,GAAAA,IAAA,KAAAA,GAAA,GAAAA,IAAA,IAAAA,IAAA,IAAA0I,EAAAhlB,EAAA,IAAgG8F,EAAA8vB,IAAAH,GAAA,GAAAA,IAAA,IAAAA,GAAA,GAAAA,IAAA,KAAAA,GAAA,EAAAA,IAAA,MAAAA,EAAA31B,GAAA21B,EAAA3O,GAAAhK,EAAA9c,GAAAglB,EAAAhlB,GAAsEsc,IAAA/Q,GAAA,GAAAA,IAAA,IAAAA,GAAA,GAAAA,IAAA,KAAAA,GAAA,GAAAA,IAAA,MAAAA,EAAA2R,EAAA3R,EAAAmqB,EAAAxY,EAAAwY,GAA8DE,EAAA9O,EAAIA,EAAAhnB,EAAIA,EAAA21B,EAAIA,EAAAoB,EAAA/wB,EAAA,EAAQ+wB,EAAAnB,EAAIA,EAAAxY,EAAIA,EAAA3R,EAAIA,EAAAzF,EAAAwW,EAAA,EAAQ2I,EAAA,GAAAA,EAAA,GAAA1Z,EAAA,EAAc0Z,EAAA,GAAAA,EAAA,GAAA/H,EAAA,EAAc+H,EAAA,GAAAA,EAAA,GAAAyQ,EAAA,EAAczQ,EAAA,GAAAA,EAAA,GAAA4R,EAAA,EAAc5R,EAAA,GAAAA,EAAA,GAAAwQ,EAAA,EAAcxQ,EAAA,GAAAA,EAAA,GAAAnlB,EAAA,EAAcmlB,EAAA,GAAAA,EAAA,GAAA6B,EAAA,EAAc7B,EAAA,GAAAA,EAAA,GAAA2Q,EAAA,GAAcoC,YAAA,WAAwB,GAAAhT,GAAA1lB,KAAA43B,MAAAb,EAAArR,EAAAmR,MAAAlR,EAAA,EAAA3lB,KAAA63B,YAAA5rB,EAAA,EAAAyZ,EAAAoR,QAC5T,OAA7HC,GAAA9qB,IAAA,IAAA,KAAA,GAAAA,EAAA,GAAuB8qB,GAAA9qB,EAAA,KAAA,GAAA,GAAA,IAAAkqB,EAAA1K,MAAA9F,EAAA,YAA0CoR,GAAA9qB,EAAA,KAAA,GAAA,GAAA,IAAA0Z,EAAsBD,EAAAoR,SAAA,EAAAC,EAAAj1B,OAAsB9B,KAAA+3B,WAAgB/3B,KAAAk5B,OAAkBvC,MAAA,WAAkB,GAAAjR,GAAA4Q,EAAAK,MAAAp2B,KAAAP,KAAoD,OAA3B0lB,GAAAwT,MAAAl5B,KAAAk5B,MAAAvC,QAA2BjR,IAAYyH,GAAAD,OAAAoJ,EAAAqC,cAAA/a,GAA4BuP,EAAAgM,WAAA7C,EAAAsC,kBAAAhb,IAAoCH,MAGjS,WAAY,GAAA0Y,GAAA/I,SAAAD,EAAAgJ,EAAAe,IAAAM,IAA4BrB,GAAA4C,KAAAD,KAAA3C,EAAAE,IAAAE,KAAAC,QAA+Bvb,KAAA,SAAA2C,EAAAwY,GAAmBxY,EAAA5d,KAAAo5B,QAAA,GAAAxb,GAAA3C,KAA0B,gBAAAmb,KAAAA,EAAAjJ,EAAAjU,MAAAkd,GAAmC,IAAAD,GAAAvY,EAAAoa,UAAAx3B,EAAA,EAAA21B,CAAwBC,GAAAU,SAAAt2B,IAAA41B,EAAAxY,EAAA6a,SAAArC,IAAgCA,EAAAY,OAAU,KAAA,GAAAxZ,GAAAxd,KAAAq5B,MAAAjD,EAAAO,QAAA3Z,EAAAhd,KAAAs5B,MAAAlD,EAAAO,QAAAnwB,EAAAgX,EAAAqZ,MAAArP,EAAAxK,EAAA6Z,MAAAU,EAAA,EAA8EpB,EAAAoB,EAAIA,IAAA/wB,EAAA+wB,IAAA,WAAA/P,EAAA+P,IAAA,SAAqC/Z,GAAAsZ,SAAA9Z,EAAA8Z,SAAAt2B,EAAwBR,KAAA23B,SAAaA,MAAA,WAAkB,GAAA/Z,GAAA5d,KAAAo5B,OAAmBxb,GAAA+Z,QAAU/Z,EAAA4a,OAAAx4B,KAAAs5B,QAAqBd,OAAA,SAAA5a,GAA2C,MAAvB5d,MAAAo5B,QAAAZ,OAAA5a,GAAuB5d,MAAYy4B,SAAA,SAAA7a,GAAsB,GAAAwY,GACtgBp2B,KAAAo5B,OAAuC,OAA1Bxb,GAAAwY,EAAAqC,SAAA7a,GAAgBwY,EAAAuB,QAAUvB,EAAAqC,SAAAz4B,KAAAq5B,MAAA1C,QAAA7hB,OAAA8I,UAGvC,WAAY,GAAAL,GAAA6P,SAAA1sB,EAAA6c,EAAA8Y,IAAAO,SAAiCrZ,GAAA2Z,IAAAqC,QAActY,UAAA,SAAA8V,GAAsB,GAAA/Z,GAAA+Z,EAAAF,MAAAn2B,EAAAq2B,EAAAD,SAAA+B,EAAA74B,KAAAw5B,IAAuCzC,GAAAC,QAAUD,IAAK,KAAA,GAAAvZ,GAAA,EAAY9c,EAAA8c,EAAIA,GAAA,EAAA,IAAA,GAAAwO,IAAAhP,EAAAQ,IAAA,KAAA,GAAA,GAAAA,EAAA,GAAA,MAAA,IAAAR,EAAAQ,EAAA,IAAA,KAAA,GAAA,IAAAA,EAAA,GAAA,GAAA,MAAA,EAAAR,EAAAQ,EAAA,IAAA,KAAA,GAAA,IAAAA,EAAA,GAAA,GAAA,IAAA/W,EAAA,EAAwH,EAAAA,GAAA/F,EAAA8c,EAAA,IAAA/W,EAAgBA,IAAAswB,EAAAnwB,KAAAiyB,EAAAY,OAAAzN,IAAA,GAAA,EAAAvlB,GAAA,IAAqC,IAAAuW,EAAA6b,EAAAY,OAAA,IAAA,KAAuB1C,EAAAj1B,OAAA,GAAWi1B,EAAAnwB,KAAAoW,EAAW,OAAA+Z,GAAAjwB,KAAA,KAAkBoS,MAAA,SAAA6d,GAAmB,GAAA/Z,GAAA+Z,EAAAj1B,OAAAqrB,EAAAntB,KAAAw5B,KAAAX,EAAA1L,EAAAsM,OAAA,GAA0CZ,KAAAA,EAAA9B,EAAA1vB,QAAAwxB,GAAA,IAAAA,IAAA7b,EAAA6b,GAAiC,KAAA,GAAAA,MAAArb,EAAA,EAAAwO,EAAA,EACjehP,EADsfgP,EACpfA,IAAA,GAAAA,EAAA,EAAA,CAAY,GAAAvlB,GAAA0mB,EAAA9lB,QAAA0vB,EAAA0C,OAAAzN,EAAA,KAAA,GAAAA,EAAA,GAAArG,EAAAwH,EAAA9lB,QAAA0vB,EAAA0C,OAAAzN,MAAA,EAAA,GAAAA,EAAA,EAA6E6M,GAAArb,IAAA,KAAA/W,EAAAkf,IAAA,GAAA,GAAAnI,EAAA,GAA4BA,IAAI,MAAA9c,GAAAsxB,OAAA6G,EAAArb,IAAqBgc,KAAA,wEAGhJ,SAAAjc,GAAa,QAAA7c,GAAAilB,EAAA6B,EAAA9B,EAAAjlB,EAAAwL,EAAAsrB,EAAA/wB,GAA6C,MAAnBmf,GAAAA,GAAA6B,EAAA9B,GAAA8B,EAAA/mB,GAAAwL,EAAAzF,GAAmBmf,GAAA4R,EAAA5R,IAAA,GAAA4R,GAAA/P,EAAwB,QAAAuP,GAAApR,EAAA6B,EAAA9B,EAAAjlB,EAAAwL,EAAAsrB,EAAA/wB,GAA6C,MAAnBmf,GAAAA,GAAA6B,EAAA/mB,EAAAilB,GAAAjlB,GAAAwL,EAAAzF,GAAmBmf,GAAA4R,EAAA5R,IAAA,GAAA4R,GAAA/P,EAAwB,QAAAxK,GAAA2I,EAAA6B,EAAA9B,EAAAjlB,EAAAwL,EAAAsrB,EAAA/wB,GAA0C,MAAhBmf,GAAAA,GAAA6B,EAAA9B,EAAAjlB,GAAAwL,EAAAzF,GAAgBmf,GAAA4R,EAAA5R,IAAA,GAAA4R,GAAA/P,EAAwB,QAAA2F,GAAAxH,EAAA6B,EAAA9B,EAAAjlB,EAAAwL,EAAAsrB,EAAA/wB,GAA6C,MAAnBmf,GAAAA,GAAAD,GAAA8B,GAAA/mB,IAAAwL,EAAAzF,GAAmBmf,GAAA4R,EAAA5R,IAAA,GAAA4R,GAAA/P,EAAwB,IAAA,GAAAqR,GAAAzL,SAAA5P,EAAAqb,EAAAxC,IAAArK,EAAAxO,EAAAoZ,UAAAnwB,EAAA+W,EAAA6a,OAAA7a,EAAAqb,EAAAE,KAAApT,KAAAlc,EAAA,EAAsE,GAAAA,EAAKA,IAAAkc,EAAAlc,GAAA,WAAA8T,EAAAmc,IAAAnc,EAAAoc,IAAAlwB,EAAA,IAAA,CAAwC+T,GAAAA,EAAAoc,IAAAnzB,EAAA+vB,QAAkB+B,SAAA,WAAoBv4B,KAAAk5B,MAAA,GAAAlN,GAAA/Q,MAAA,WAAA,WAAA,WAAA,aACvbkd,gBAAA,SAAA7B,EAAA9O,GAA8B,IAAA,GAAA9B,GAAA,EAAY,GAAAA,EAAKA,IAAA,CAAK,GAAAjlB,GAAA+mB,EAAA9B,EAAAzZ,EAAAqqB,EAAA71B,EAAiB61B,GAAA71B,GAAA,UAAAwL,GAAA,EAAAA,IAAA,IAAA,YAAAA,GAAA,GAAAA,IAAA,GAAqD,GAAAyZ,GAAA1lB,KAAAk5B,MAAArC,MAAAp2B,EAAA61B,EAAA9O,EAAA,GAAAvb,EAAAqqB,EAAA9O,EAAA,GAAA+P,EAAAjB,EAAA9O,EAAA,GAAAhhB,EAAA8vB,EAAA9O,EAAA,GAAAqS,EAAAvD,EAAA9O,EAAA,GAAAhK,EAAA8Y,EAAA9O,EAAA,GAAAqR,EAAAvC,EAAA9O,EAAA,GAAAwE,EAAAsK,EAAA9O,EAAA,GAAA/gB,EAAA6vB,EAAA9O,EAAA,GAAAsS,EAAAxD,EAAA9O,EAAA,GAAAuS,EAAAzD,EAAA9O,EAAA,IAAAwS,EAAA1D,EAAA9O,EAAA,IAAAjK,EAAA+Y,EAAA9O,EAAA,IAAAyS,EAAA3D,EAAA9O,EAAA,IAAA0S,EAAA5D,EAAA9O,EAAA,IAAA/d,EAAA6sB,EAAA9O,EAAA,IAAA5J,EAAA8H,EAAA,GAAAllB,EAAAklB,EAAA,GAAA0Q,EAAA1Q,EAAA,GAAAyQ,EAAAzQ,EAAA,GAAA9H,EAAAld,EAAAkd,EAAApd,EAAA41B,EAAAD,EAAA11B,EAAA,EAAAklB,EAAA,IAAAwQ,EAAAz1B,EAAAy1B,EAAAvY,EAAApd,EAAA41B,EAAAnqB,EAAA,GAAA0Z,EAAA,IAAAyQ,EAAA11B,EAAA01B,EAAAD,EAAAvY,EAAApd,EAAA+2B,EAAA,GAAA5R,EAAA,IAAAnlB,EAAAE,EAAAF,EAAA41B,EAAAD,EAAAvY,EAAApX,EAAA,GAAAmf,EAAA,IAAA/H,EAAAld,EAAAkd,EAAApd,EAAA41B,EAAAD,EAAA0D,EAAA,EAAAlU,EAAA,IAAAwQ,EAAAz1B,EAAAy1B,EAAAvY,EAAApd,EAAA41B,EAAA5Y,EAAA,GAAAmI,EAAA,IAAAyQ,EAAA11B,EAAA01B,EAAAD,EAAAvY,EAAApd,EAAAq4B,EAAA,GAAAlT,EAAA,IAAAnlB,EAAAE,EAAAF,EAAA41B,EAAAD,EAAAvY,EAAAoO,EAAA,GAAArG,EAAA,IAC1H/H,EAAAld,EAAAkd,EAAApd,EAAA41B,EAAAD,EAAA1vB,EAAA,EAAAkf,EAAA,IAAAwQ,EAAAz1B,EAAAy1B,EAAAvY,EAAApd,EAAA41B,EAAA0D,EAAA,GAAAnU,EAAA,IAAAyQ,EAAA11B,EAAA01B,EAAAD,EAAAvY,EAAApd,EAAAu5B,EAAA,GAAApU,EAAA,KAAAnlB,EAAAE,EAAAF,EAAA41B,EAAAD,EAAAvY,EAAAoc,EAAA,GAAArU,EAAA,KAAA/H,EAAAld,EAAAkd,EAAApd,EAAA41B,EAAAD,EAAA5Y,EAAA,EAAAoI,EAAA,KAAAwQ,EAAAz1B,EAAAy1B,EAAAvY,EAAApd,EAAA41B,EAAA6D,EAAA,GAAAtU,EAAA,KAAAyQ,EAAA11B,EAAA01B,EAAAD,EAAAvY,EAAApd,EAAA05B,EAAA,GAAAvU,EAAA,KAAAnlB,EAAAE,EAAAF,EAAA41B,EAAAD,EAAAvY,EAAAnU,EAAA,GAAAkc,EAAA,KAAA/H,EAAAmZ,EAAAnZ,EAAApd,EAAA41B,EAAAD,EAAAlqB,EAAA,EAAA0Z,EAAA,KAAAwQ,EAAAY,EAAAZ,EAAAvY,EAAApd,EAAA41B,EAAAyC,EAAA,EAAAlT,EAAA,KAAAyQ,EAAAW,EAAAX,EAAAD,EAAAvY,EAAApd,EAAAw5B,EAAA,GAAArU,EAAA,KAAAnlB,EAAAu2B,EAAAv2B,EAAA41B,EAAAD,EAAAvY,EAAAnd,EAAA,GAAAklB,EAAA,KAAA/H,EAAAmZ,EAAAnZ,EAAApd,EAAA41B,EAAAD,EAAA3Y,EAAA,EAAAmI,EAAA,KAAAwQ,EAAAY,EAAAZ,EAAAvY,EAAApd,EAAA41B,EAAA2D,EAAA,EAAApU,EAAA,KAAAyQ,EAAAW,EAAAX,EAAAD,EAAAvY,EAAApd,EAAAiJ,EAAA,GAAAkc,EAAA,KAAAnlB,EAAAu2B,EAAAv2B,EAAA41B,EAAAD,EAAAvY,EAAAic,EAAA,GAAAlU,EAAA,KAAA/H,EAAAmZ,EAAAnZ,EAAApd,EAAA41B,EAAAD,EAAA2D,EAAA,EAAAnU,EAAA,KAAAwQ,EAAAY,EAAAZ,EAAAvY,EAAApd,EAAA41B,EAAA8D,EAAA,EAAAvU,EAAA,KAAAyQ,EAAAW,EAAAX,EAAAD,EAAAvY,EAAApd,EAAAgG,EAAA,GAAAmf,EAAA,KAAAnlB,EAAAu2B,EAAAv2B,EAAA41B,EAAAD,EAAAvY,EAAAnX,EAAA,GAAAkf,EAAA,KAAA/H,EAAAmZ,EAAAnZ,EAAApd,EAAA41B,EAAAD,EAAA8D,EAAA,EAAAtU,EAAA,KAAAwQ,EAAAY,EAAAZ,EAAAvY,EACApd,EAAA41B,EAAAmB,EAAA,EAAA5R,EAAA,KAAAyQ,EAAAW,EAAAX,EAAAD,EAAAvY,EAAApd,EAAAwrB,EAAA,GAAArG,EAAA,KAAAnlB,EAAAu2B,EAAAv2B,EAAA41B,EAAAD,EAAAvY,EAAAL,EAAA,GAAAoI,EAAA,KAAA/H,EAAAZ,EAAAY,EAAApd,EAAA41B,EAAAD,EAAA3Y,EAAA,EAAAmI,EAAA,KAAAwQ,EAAAnZ,EAAAmZ,EAAAvY,EAAApd,EAAA41B,EAAA3vB,EAAA,GAAAkf,EAAA,KAAAyQ,EAAApZ,EAAAoZ,EAAAD,EAAAvY,EAAApd,EAAAw5B,EAAA,GAAArU,EAAA,KAAAnlB,EAAAwc,EAAAxc,EAAA41B,EAAAD,EAAAvY,EAAAsc,EAAA,GAAAvU,EAAA,KAAA/H,EAAAZ,EAAAY,EAAApd,EAAA41B,EAAAD,EAAAlqB,EAAA,EAAA0Z,EAAA,KAAAwQ,EAAAnZ,EAAAmZ,EAAAvY,EAAApd,EAAA41B,EAAAyD,EAAA,GAAAlU,EAAA,KAAAyQ,EAAApZ,EAAAoZ,EAAAD,EAAAvY,EAAApd,EAAAwrB,EAAA,GAAArG,EAAA,KAAAnlB,EAAAwc,EAAAxc,EAAA41B,EAAAD,EAAAvY,EAAAmc,EAAA,GAAApU,EAAA,KAAA/H,EAAAZ,EAAAY,EAAApd,EAAA41B,EAAAD,EAAA8D,EAAA,EAAAtU,EAAA,KAAAwQ,EAAAnZ,EAAAmZ,EAAAvY,EAAApd,EAAA41B,EAAA31B,EAAA,GAAAklB,EAAA,KAAAyQ,EAAApZ,EAAAoZ,EAAAD,EAAAvY,EAAApd,EAAAgG,EAAA,GAAAmf,EAAA,KAAAnlB,EAAAwc,EAAAxc,EAAA41B,EAAAD,EAAAvY,EAAAib,EAAA,GAAAlT,EAAA,KAAA/H,EAAAZ,EAAAY,EAAApd,EAAA41B,EAAAD,EAAA2D,EAAA,EAAAnU,EAAA,KAAAwQ,EAAAnZ,EAAAmZ,EAAAvY,EAAApd,EAAA41B,EAAA7Y,EAAA,GAAAoI,EAAA,KAAAyQ,EAAApZ,EAAAoZ,EAAAD,EAAAvY,EAAApd,EAAAiJ,EAAA,GAAAkc,EAAA,KAAAnlB,EAAAwc,EAAAxc,EAAA41B,EAAAD,EAAAvY,EAAA2Z,EAAA,GAAA5R,EAAA,KAAA/H,EAAAuP,EAAAvP,EAAApd,EAAA41B,EAAAD,EAAA11B,EAAA,EAAAklB,EAAA,KAAAwQ,EAAAhJ,EAAAgJ,EAAAvY,EAAApd,EAAA41B,EAAApK,EAAA,GAAArG,EAAA,KAAAyQ,EAAAjJ,EAAAiJ,EAAAD,EAAAvY,EAAApd,EACA05B,EAAA,GAAAvU,EAAA,KAAAnlB,EAAA2sB,EAAA3sB,EAAA41B,EAAAD,EAAAvY,EAAAJ,EAAA,GAAAmI,EAAA,KAAA/H,EAAAuP,EAAAvP,EAAApd,EAAA41B,EAAAD,EAAA5Y,EAAA,EAAAoI,EAAA,KAAAwQ,EAAAhJ,EAAAgJ,EAAAvY,EAAApd,EAAA41B,EAAA5vB,EAAA,GAAAmf,EAAA,KAAAyQ,EAAAjJ,EAAAiJ,EAAAD,EAAAvY,EAAApd,EAAAu5B,EAAA,GAAApU,EAAA,KAAAnlB,EAAA2sB,EAAA3sB,EAAA41B,EAAAD,EAAAvY,EAAA3R,EAAA,GAAA0Z,EAAA,KAAA/H,EAAAuP,EAAAvP,EAAApd,EAAA41B,EAAAD,EAAA1vB,EAAA,EAAAkf,EAAA,KAAAwQ,EAAAhJ,EAAAgJ,EAAAvY,EAAApd,EAAA41B,EAAA3sB,EAAA,GAAAkc,EAAA,KAAAyQ,EAAAjJ,EAAAiJ,EAAAD,EAAAvY,EAAApd,EAAAq4B,EAAA,GAAAlT,EAAA,KAAAnlB,EAAA2sB,EAAA3sB,EAAA41B,EAAAD,EAAAvY,EAAAqc,EAAA,GAAAtU,EAAA,KAAA/H,EAAAuP,EAAAvP,EAAApd,EAAA41B,EAAAD,EAAA0D,EAAA,EAAAlU,EAAA,KAAAwQ,EAAAhJ,EAAAgJ,EAAAvY,EAAApd,EAAA41B,EAAA4D,EAAA,GAAArU,EAAA,KAAAyQ,EAAAjJ,EAAAiJ,EAAAD,EAAAvY,EAAApd,EAAA+2B,EAAA,GAAA5R,EAAA,KAAAnlB,EAAA2sB,EAAA3sB,EAAA41B,EAAAD,EAAAvY,EAAAkc,EAAA,GAAAnU,EAAA,IAAiUD,GAAA,GAAAA,EAAA,GAAA9H,EAAA,EAAc8H,EAAA,GAAAA,EAAA,GAAAllB,EAAA,EAAcklB,EAAA,GAAAA,EAAA,GAAA0Q,EAAA,EAAc1Q,EAAA,GAAAA,EAAA,GAAAyQ,EAAA,GAAcuC,YAAA,WAAwB,GAAA/S,GAAA3lB,KAAA43B,MAAApQ,EAAA7B,EAAAkR,MAAAnR,EAAA,EAAA1lB,KAAA63B,YAAAp3B,EAAA,EAAAklB,EAAAmR,QAA+DtP,GAAA/mB,IAAA,IAAA,KAAA,GAAAA,EAAA,EAAuB,IAAAwL,GAAAsR,EAAAkO,MAAA/F,EACve,WAAqN,KAAzM8B,GAAA/mB,EAAA,KAAA,GAAA,GAAA,IAAA,UAAAwL,GAAA,EAAAA,IAAA,IAAA,YAAAA,GAAA,GAAAA,IAAA,GAAoEub,GAAA/mB,EAAA,KAAA,GAAA,GAAA,IAAA,UAAAilB,GAAA,EAAAA,IAAA,IAAA,YAAAA,GAAA,GAAAA,IAAA,GAAoEC,EAAAmR,SAAA,GAAAtP,EAAA1lB,OAAA,GAA0B9B,KAAA+3B,WAAgBpS,EAAA3lB,KAAAk5B,MAAa1R,EAAA7B,EAAAkR,MAAUnR,EAAA,EAAQ,EAAAA,EAAIA,IAAAjlB,EAAA+mB,EAAA9B,GAAA8B,EAAA9B,GAAA,UAAAjlB,GAAA,EAAAA,IAAA,IAAA,YAAAA,GAAA,GAAAA,IAAA,EAAgE,OAAAklB,IAASgR,MAAA,WAAkB,GAAAhR,GAAAlf,EAAAkwB,MAAAp2B,KAAAP,KAAoD,OAA3B2lB,GAAAuT,MAAAl5B,KAAAk5B,MAAAvC,QAA2BhR,KAAYkT,EAAAe,IAAAnzB,EAAAkyB,cAAAnb,GAAyBqb,EAAAsB,QAAA1zB,EAAAmyB,kBAAApb,IAAiCC,MACtb,WAAY,GAAAF,GAAA6P,SAAA1sB,EAAA6c,EAAA8Y,IAAAU,EAAAr2B,EAAA61B,KAAAvZ,EAAAtc,EAAAk2B,UAAAl2B,EAAA6c,EAAAwb,KAAA5L,EAAAzsB,EAAA05B,OAAArD,EAAAP,QAA4E8B,IAAAvB,EAAAP,QAAc6D,QAAA,EAAAC,OAAA55B,EAAAk5B,IAAA9uB,WAAA,IAAoCmQ,KAAA,SAAA8b,GAAmB/2B,KAAAs4B,IAAAt4B,KAAAs4B,IAAA9B,OAAAO,IAA4BwD,QAAA,SAAAxD,EAAAvZ,GAAuB,IAAA,GAAA9c,GAAAV,KAAAs4B,IAAAnL,EAAAzsB,EAAA45B,OAAAtI,SAAArM,EAAA3I,EAAAgV,SAAAzU,EAAAoI,EAAAkR,MAAAP,EAAA51B,EAAA25B,QAAA35B,EAAAA,EAAAoK,WAAyFyS,EAAAzb,OAAAw0B,GAAW,CAAE9O,GAAA2F,EAAAqL,OAAAhR,EAAe,IAAAA,GAAA2F,EAAAqL,OAAAzB,GAAA0B,SAAAjb,EAA8B2P,GAAAwK,OAAU,KAAA,GAAAjS,GAAA,EAAYhlB,EAAAglB,EAAIA,IAAA8B,EAAA2F,EAAAsL,SAAAjR,GAAA2F,EAAAwK,OAA8BhS,GAAA7Q,OAAA0S,GAA2B,MAAf7B,GAAAmR,SAAA,EAAAR,EAAe3Q,IAAYpI,GAAA6c,OAAA,SAAArD,EAAA/Z,EAAAtc,GAAyB,MAAAysB,GAAA6E,OAAAtxB,GAAA65B,QAAAxD,EAC3d/Z,OAGAoQ,SAAAiJ,IAAAmE,QAAA,SAAAjd,GAAiC,GAAA7c,GAAA0sB,SAAA2J,EAAAr2B,EAAA21B,IAAArZ,EAAA+Z,EAAAR,KAAApJ,EAAA4J,EAAAH,UAAAiC,EAAA9B,EAAAW,uBAAAla,EAAA9c,EAAAw2B,IAAAqC,OAAAvN,EAAAtrB,EAAAq4B,KAAAqB,OAAA3zB,EAAAswB,EAAAyD,OAAA3B,EAAArC,QAA6H8B,IAAAtb,EAAAwZ,SAAAiE,gBAAA,SAAAxuB,EAAAyZ,GAA6C,MAAA1lB,MAAAgyB,OAAAhyB,KAAA06B,gBAAAzuB,EAAAyZ,IAA6CiV,gBAAA,SAAA1uB,EAAAyZ,GAA+B,MAAA1lB,MAAAgyB,OAAAhyB,KAAA46B,gBAAA3uB,EAAAyZ,IAA6CzK,KAAA,SAAAhP,EAAAyZ,EAAAC,GAAsB3lB,KAAAs4B,IAAAt4B,KAAAs4B,IAAA9B,OAAA7Q,GAA4B3lB,KAAA66B,WAAA5uB,EAAkBjM,KAAA86B,KAAApV,EAAY1lB,KAAA23B,SAAaA,MAAA,WAAkBkB,EAAAlB,MAAAp3B,KAAAP,MAAmBA,KAAAu4B,YAAgBnwB,QAAA,SAAA6D,GAAqC,MAAhBjM,MAAA83B,QAAA7rB,GAAgBjM,KAAA+3B,YAC3fU,SAAA,SAAAxsB,GAAwC,MAAnBA,IAAAjM,KAAA83B,QAAA7rB,GAAmBjM,KAAA04B,eAA0B2B,QAAA,EAAAU,OAAA,EAAAL,gBAAA,EAAAE,gBAAA,EAAAjC,cAAA,SAAA1sB,GAAkF,OAAOqU,QAAA,SAAAqF,EAAAnf,EAAAuwB,GAAwB,OAAA,gBAAAvwB,GAAA/F,EAAAilB,GAAApF,QAAArU,EAAA0Z,EAAAnf,EAAAuwB,IAAgDtW,QAAA,SAAAkF,EAAAnf,EAAAuwB,GAAyB,OAAA,gBAAAvwB,GAAA/F,EAAAilB,GAAAjF,QAAAxU,EAAA0Z,EAAAnf,EAAAuwB,OAAqDA,GAAAiE,aAAAv0B,EAAA+vB,QAAyBkC,YAAA,WAAuB,MAAA14B,MAAA+3B,UAAA,IAAyBC,UAAA,GAAe,IAAArS,GAAAjlB,EAAAgZ,QAAejQ,EAAA,SAAAwC,EAAAyZ,EAAAC,GAAmB,GAAAllB,GAAAT,KAAAi7B,GAAex6B,GAAAT,KAAAi7B,IAAA1d,EAAA9c,EAAAT,KAAAk7B,UAA+B,KAAA,GAAAnE,GAAA,EAAYpR,EAAAoR,EAAIA,IAAA9qB,EAAAyZ,EAAAqR,IACzet2B,EAAAs2B,IAAKT,GAAAS,EAAAoE,gBAAAne,EAAAwZ,QAAgCiE,gBAAA,SAAAxuB,EAAAyZ,GAA8B,MAAA1lB,MAAAo7B,UAAApJ,OAAA/lB,EAAAyZ,IAAkCiV,gBAAA,SAAA1uB,EAAAyZ,GAA+B,MAAA1lB,MAAAq7B,UAAArJ,OAAA/lB,EAAAyZ,IAAkCzK,KAAA,SAAAhP,EAAAyZ,GAAoB1lB,KAAAs7B,QAAArvB,EAAejM,KAAAi7B,IAAAvV,MAAY8Q,QAAYF,GAAA8E,UAAA9E,EAAAE,QAAsB+E,aAAA,SAAAtvB,EAAAyZ,GAA2B,GAAAC,GAAA3lB,KAAAs7B,QAAA76B,EAAAklB,EAAAqS,SAAiCvuB,GAAAlJ,KAAAP,KAAAiM,EAAAyZ,EAAAjlB,GAAmBklB,EAAA6V,aAAAvvB,EAAAyZ,GAAoB1lB,KAAAk7B,WAAAjvB,EAAAuH,MAAAkS,EAAAA,EAAAjlB,MAAkC61B,EAAA+E,UAAA/E,EAAAE,QAAsB+E,aAAA,SAAAtvB,EAAAyZ,GAA2B,GAAAC,GAAA3lB,KAAAs7B,QAAA76B,EAAAklB,EAAAqS,UAAAjB,EAAA9qB,EAAAuH,MAAAkS,EAAAA,EAAAjlB,EAAkDklB,GAAA8V,aAAAxvB,EAAAyZ,GAAoBjc,EAAAlJ,KAAAP,KACnfiM,EAAAyZ,EAAAjlB,GAAOT,KAAAk7B,WAAAnE,KAAqBpR,EAAAA,EAAA+V,IAAApF,EAAUA,GAAA51B,EAAAi7B,QAAWC,OAASD,IAAA,SAAAjW,EAAAC,GAAkB,IAAA,GAAAllB,GAAA,EAAAklB,EAAAllB,EAAAA,EAAAilB,EAAAoR,SAAAr2B,EAAAs2B,EAAAt2B,GAAA,GAAAA,GAAA,GAAAA,GAAA,EAAAA,EAAAuc,KAAAwK,EAAA,EAA6D/mB,EAAA+mB,EAAIA,GAAA,EAAAxK,EAAApW,KAAAmwB,EAAet2B,GAAA0sB,EAAA6E,OAAAhV,EAAAvc,GAAgBilB,EAAA5Q,OAAArU,IAAYo7B,MAAA,SAAAnW,GAAmBA,EAAAoR,UAAA,IAAApR,EAAAmR,MAAAnR,EAAAoR,SAAA,IAAA,KAA4CC,EAAA+E,YAAAr1B,EAAA+vB,QAAwB8B,IAAA7xB,EAAA6xB,IAAA9B,QAAkB9c,KAAAiM,EAAAoW,QAAAzF,IAAiBqB,MAAA,WAAmBlxB,EAAAkxB,MAAAp3B,KAAAP,KAAmB,IAAA0lB,GAAA1lB,KAAAs4B,IAAA3S,EAAAD,EAAAqI,GAAArI,EAAAA,EAAAhM,IAA+B,IAAA1Z,KAAA66B,YAAA76B,KAAA06B,gBAAA,GAAAj6B,GAAAilB,EAAA+U,oBAAiEh6B,GAAAilB,EAAAiV,gBAAA36B,KAAAi4B,eAAA,CAA+Cj4B,MAAAg8B,MAAAv7B,EAAAF,KAAAmlB,EACve1lB,KAAA2lB,GAAAA,EAAAkR,QAAiBsB,gBAAA,SAAAzS,EAAAC,GAA+B3lB,KAAAg8B,MAAAT,aAAA7V,EAAAC,IAA6B+S,YAAA,WAAwB,GAAAhT,GAAA1lB,KAAAs4B,IAAAyD,OAAuB,IAAA/7B,KAAA66B,YAAA76B,KAAA06B,gBAAA,CAA0ChV,EAAAiW,IAAA37B,KAAA43B,MAAA53B,KAAAg4B,UAAiC,IAAArS,GAAA3lB,KAAA+3B,UAAA,OAAwBpS,GAAA3lB,KAAA+3B,UAAA,GAAArS,EAAAmW,MAAAlW,EAAoC,OAAAA,IAASqS,UAAA,GAAe,IAAAxQ,GAAAuP,EAAAkF,aAAAjf,EAAAwZ,QAA+Bvb,KAAA,SAAAyK,GAAiB1lB,KAAAy2B,MAAA/Q,IAActU,SAAA,SAAAsU,GAAsB,OAAAA,GAAA1lB,KAAAk8B,WAAAjb,UAAAjhB,SAA2C2lB,GAAAjlB,EAAAy7B,WAAgBC,SAAWnb,UAAA,SAAAyE,GAAsB,GAAAC,GAAAD,EAAA8I,UAA4B,OAAT9I,GAAAA,EAAA2W,MAAS3W,EAAAyH,EAAA6E,QAAA,WACve,aAAAld,OAAA4Q,GAAA5Q,OAAA6Q,GAAAA,GAAAvU,SAAAoM,IAAgDtE,MAAA,SAAAwM,GAAmBA,EAAAlI,EAAAtE,MAAAwM,EAAa,IAAAC,GAAAD,EAAAmR,KAAc,IAAA,YAAAlR,EAAA,IAAA,YAAAA,EAAA,GAAA,CAAuC,GAAAllB,GAAA0sB,EAAA6E,OAAArM,EAAAnS,MAAA,EAAA,GAA6BmS,GAAAyS,OAAA,EAAA,GAAc1S,EAAAoR,UAAA,GAAe,MAAAtP,GAAAwK,QAAiBxD,WAAA9I,EAAA2W,KAAA57B,MAAuBilB,EAAAqR,EAAAuF,mBAAAtf,EAAAwZ,QAAkC8B,IAAAtb,EAAAwZ,QAAc2F,OAAAxW,IAASrF,QAAA,SAAAoF,EAAAC,EAAAllB,EAAAs2B,GAA4BA,EAAA/2B,KAAAs4B,IAAA9B,OAAAO,EAAqB,IAAA/Z,GAAA0I,EAAA+U,gBAAAh6B,EAAAs2B,EAAqD,OAAxBpR,GAAA3I,EAAAyb,SAAA9S,GAAgB3I,EAAAA,EAAAsb,IAAQ9Q,EAAAwK,QAAiBxD,WAAA7I,EAAA1kB,IAAAR,EAAAstB,GAAA/Q,EAAA+Q,GAAAwO,UAAA7W,EAAAhM,KAAAsD,EAAAtD,KAAAqiB,QAAA/e,EAAA+e,QAAA/D,UAAAtS,EAAAsS,UAAAkE,UAAAnF,EAAAoF,UACvZ1b,QAAA,SAAAiF,EAAAC,EAAAllB,EAAAs2B,GAAyE,MAA/CA,GAAA/2B,KAAAs4B,IAAA9B,OAAAO,GAAqBpR,EAAA3lB,KAAAw8B,OAAA7W,EAAAoR,EAAAoF,QAA0BzW,EAAAiV,gBAAAl6B,EAAAs2B,GAAA0B,SAAA9S,EAAA6I,aAAqDgO,OAAA,SAAA9W,EAAAC,GAAsB,MAAA,gBAAAD,GAAAC,EAAAzM,MAAAwM,EAAA1lB,MAAA0lB,KAA4ChlB,GAAAA,EAAA+7B,QAAaL,SAAWM,QAAA,SAAAhX,EAAAC,EAAAllB,EAAAs2B,GAAoI,MAA1GA,KAAAA,EAAA5J,EAAAzP,OAAA,IAAmBgI,EAAAsG,EAAAgG,QAAYqI,QAAA1U,EAAAllB,IAAY85B,QAAA7U,EAAAqR,GAAet2B,EAAA0sB,EAAA6E,OAAAtM,EAAAmR,MAAArjB,MAAAmS,GAAA,EAAAllB,GAAiCilB,EAAAoR,SAAA,EAAAnR,EAAe6B,EAAAwK,QAAiB/wB,IAAAykB,EAAAqI,GAAAttB,EAAA47B,KAAAtF,MAAqBt2B,EAAAs2B,EAAA4F,oBAAAjX,EAAA8Q,QAAmC8B,IAAA5S,EAAA4S,IAAA9B,QAAkBiG,IAAA/7B,IAAM4f,QAAA,SAAAqF,EAAAllB,EAAAs2B,EAAA/Z,GACjX,MAD6YA,GAAAhd,KAAAs4B,IAAA9B,OAAAxZ,GAAqB+Z,EAAA/Z,EAAAyf,IAAAC,QAAA3F,EAC9epR,EAAA0U,QAAA1U,EAAAoV,QAAoB/d,EAAA+Q,GAAAgJ,EAAAhJ,GAAUpI,EAAAD,EAAApF,QAAA/f,KAAAP,KAAA2lB,EAAAllB,EAAAs2B,EAAA91B,IAAA+b,GAAmC2I,EAAA8Q,MAAAM,GAAWpR,GAASlF,QAAA,SAAAkF,EAAAllB,EAAAs2B,EAAA/Z,GAAiI,MAAtGA,GAAAhd,KAAAs4B,IAAA9B,OAAAxZ,GAAqBvc,EAAAT,KAAAw8B,OAAA/7B,EAAAuc,EAAAmf,QAA0BpF,EAAA/Z,EAAAyf,IAAAC,QAAA3F,EAAApR,EAAA0U,QAAA1U,EAAAoV,OAAAt6B,EAAA47B,MAA6Crf,EAAA+Q,GAAAgJ,EAAAhJ,GAAUrI,EAAAjF,QAAAlgB,KAAAP,KAAA2lB,EAAAllB,EAAAs2B,EAAA91B,IAAA+b,SAGtN,WAAY,IAAA,GAAAO,GAAA6P,SAAA1sB,EAAA6c,EAAA8Y,IAAAyF,YAAA/E,EAAAxZ,EAAAwb,KAAA/b,KAAAmQ,KAAA0L,KAAArb,KAAAwO,KAAAvlB,KAAAkf,KAAAlc,KAAA6sB,KAAA9O,KAAA9B,KAAAjlB,EAAA,EAA2G,IAAAA,EAAMA,IAAAilB,EAAAjlB,GAAA,IAAAA,EAAAA,GAAA,EAAAA,GAAA,EAAA,GAA6B,KAAA,GAAAwL,GAAA,EAAAsrB,EAAA,EAAA92B,EAAA,EAAoB,IAAAA,EAAMA,IAAA,CAAK,GAAA+F,GAAA+wB,EAAAA,GAAA,EAAAA,GAAA,EAAAA,GAAA,EAAAA,GAAA,EAAA/wB,EAAAA,IAAA,EAAA,IAAAA,EAAA,EAA6CwW,GAAA/Q,GAAAzF,EAAO2mB,EAAA3mB,GAAAyF,CAAO,IAAA4tB,GAAAnU,EAAAzZ,GAAA2wB,EAAAlX,EAAAmU,GAAAgD,EAAAnX,EAAAkX,GAAAE,EAAA,IAAApX,EAAAlf,GAAA,SAAAA,CAA+CqyB,GAAA5sB,GAAA6wB,GAAA,GAAAA,IAAA,EAAiBtf,EAAAvR,GAAA6wB,GAAA,GAAAA,IAAA,GAAkB9Q,EAAA/f,GAAA6wB,GAAA,EAAAA,IAAA,GAAiBr2B,EAAAwF,GAAA6wB,EAAOA,EAAA,SAAAD,EAAA,MAAAD,EAAA,IAAA/C,EAAA,SAAA5tB,EAAsC0Z,EAAAnf,GAAAs2B,GAAA,GAAAA,IAAA,EAAiBrzB,EAAAjD,GAAAs2B,GAAA,GAAAA,IAAA,GAAkBxG,EAAA9vB,GAAAs2B,GAAA,EAAAA,IAAA,GAAiBtV,EAAAhhB,GAAAs2B,EAAO7wB,GAAAA,EAAA4tB,EAAAnU,EAAAA,EAAAA,EAAAmX,EAAAhD,KAAAtC,GAAA7R,EAAAA,EAAA6R,KAAAtrB,EAAAsrB,EAAA,EAAsC,GAAAwF,IAAA,EAAA,EAAA,EAAA,EAAA,EACre,GAAA,GAAA,GAAA,IAAA,GAAA,IAAAhG,EAAAA,EAAAiG,IAAAt8B,EAAA81B,QAAsC+B,SAAA,WAAoB,IAAA,GAAA7S,GAAA1lB,KAAA86B,KAAAr6B,EAAAilB,EAAAmR,MAAAE,EAAArR,EAAAoR,SAAA,EAAApR,EAAA,IAAA1lB,KAAAi9B,SAAAlG,EAAA,GAAA,GAAA9qB,EAAAjM,KAAAk9B,gBAAA3F,EAAA,EAAoG7R,EAAA6R,EAAIA,IAAA,GAAAR,EAAAQ,EAAAtrB,EAAAsrB,GAAA92B,EAAA82B,OAAqB,CAAK,GAAA/wB,GAAAyF,EAAAsrB,EAAA,EAAaA,GAAAR,EAAAA,EAAA,GAAA,GAAAQ,EAAAR,IAAAvwB,EAAAwW,EAAAxW,IAAA,KAAA,GAAAwW,EAAAxW,IAAA,GAAA,MAAA,GAAAwW,EAAAxW,IAAA,EAAA,MAAA,EAAAwW,EAAA,IAAAxW,KAAAA,EAAAA,GAAA,EAAAA,IAAA,GAAAA,EAAAwW,EAAAxW,IAAA,KAAA,GAAAwW,EAAAxW,IAAA,GAAA,MAAA,GAAAwW,EAAAxW,IAAA,EAAA,MAAA,EAAAwW,EAAA,IAAAxW,GAAAA,GAAAu2B,EAAAxF,EAAAR,EAAA,IAAA,IAAyK9qB,EAAAsrB,GAAAtrB,EAAAsrB,EAAAR,GAAAvwB,EAAwC,IAA1B/F,EAAAT,KAAAm9B,mBAA0BpG,EAAA,EAAQrR,EAAAqR,EAAIA,IAAAQ,EAAA7R,EAAAqR,EAAAvwB,EAAAuwB,EAAA,EAAA9qB,EAAAsrB,GAAAtrB,EAAAsrB,EAAA,GAAA92B,EAAAs2B,GAAA,EAAAA,GAAA,GAAAQ,EAAA/wB,EAAAmf,EAAA3I,EAAAxW,IAAA,KAAAiD,EAAAuT,EAAAxW,IAAA,GAAA,MAAA8vB,EAAAtZ,EAAAxW,IACta,EAAA,MAAAghB,EAAAxK,EAAA,IAAAxW,KAAoBg1B,aAAA,SAAA9V,EAAAC,GAA4B3lB,KAAAo9B,cAAA1X,EAAAC,EAAA3lB,KAAAk9B,aAAArE,EAAArb,EAAAwO,EAAAvlB,EAAAuW,IAAoDye,aAAA,SAAA/V,EAAAjlB,GAA4B,GAAAs2B,GAAArR,EAAAjlB,EAAA,EAAailB,GAAAjlB,EAAA,GAAAilB,EAAAjlB,EAAA,GAAcilB,EAAAjlB,EAAA,GAAAs2B,EAAS/2B,KAAAo9B,cAAA1X,EAAAjlB,EAAAT,KAAAm9B,gBAAAxX,EAAAlc,EAAA6sB,EAAA9O,EAAA2F,GAAuD4J,EAAArR,EAAAjlB,EAAA,GAASilB,EAAAjlB,EAAA,GAAAilB,EAAAjlB,EAAA,GAAcilB,EAAAjlB,EAAA,GAAAs2B,GAASqG,cAAA,SAAA1X,EAAAC,EAAAllB,EAAAs2B,EAAA9qB,EAAAsrB,EAAAva,EAAAY,GAAyC,IAAA,GAAApd,GAAAR,KAAAi9B,SAAA7G,EAAA1Q,EAAAC,GAAAllB,EAAA,GAAA01B,EAAAzQ,EAAAC,EAAA,GAAAllB,EAAA,GAAA+F,EAAAkf,EAAAC,EAAA,GAAAllB,EAAA,GAAA+mB,EAAA9B,EAAAC,EAAA,GAAAllB,EAAA,GAAAC,EAAA,EAAA8c,EAAA,EAAsFhd,EAAAgd,EAAIA,IAAA,GAAA8Y,GAAAS,EAAAX,IAAA,IAAAnqB,EAAAkqB,IAAA,GAAA,KAAAoB,EAAA/wB,IAAA,EAAA,KAAAwW,EAAA,IAAAwK,GAAA/mB,EAAAC,KAAAysB,EAAA4J,EAAAZ,IAAA,IAAAlqB,EAAAzF,IAAA,GAAA,KAAA+wB,EAAA/P,IAAA,EAAA,KAAAxK,EAAA,IAAAoZ,GAAA31B,EAAAC,KAAAm4B,EAC9X9B,EAAAvwB,IAAA,IAAAyF,EAAAub,IAAA,GAAA,KAAA+P,EAAAnB,IAAA,EAAA,KAAApZ,EAAA,IAAAmZ,GAAA11B,EAAAC,KAAA8mB,EAAAuP,EAAAvP,IAAA,IAAAvb,EAAAmqB,IAAA,GAAA,KAAAmB,EAAApB,IAAA,EAAA,KAAAnZ,EAAA,IAAAxW,GAAA/F,EAAAC,KAAA01B,EAAAE,EAAAH,EAAAhJ,EAAA3mB,EAAAqyB;AAAwHvC,GAAA1Y,EAAAwY,IAAA,KAAA,GAAAxY,EAAAuY,IAAA,GAAA,MAAA,GAAAvY,EAAApX,IAAA,EAAA,MAAA,EAAAoX,EAAA,IAAA4J,IAAA/mB,EAAAC,KAAoEysB,GAAAvP,EAAAuY,IAAA,KAAA,GAAAvY,EAAApX,IAAA,GAAA,MAAA,GAAAoX,EAAA4J,IAAA,EAAA,MAAA,EAAA5J,EAAA,IAAAwY,IAAA31B,EAAAC,KAAoEm4B,GAAAjb,EAAApX,IAAA,KAAA,GAAAoX,EAAA4J,IAAA,GAAA,MAAA,GAAA5J,EAAAwY,IAAA,EAAA,MAAA,EAAAxY,EAAA,IAAAuY,IAAA11B,EAAAC,KAAoE8mB,GAAA5J,EAAA4J,IAAA,KAAA,GAAA5J,EAAAwY,IAAA,GAAA,MAAA,GAAAxY,EAAAuY,IAAA,EAAA,MAAA,EAAAvY,EAAA,IAAApX,IAAA/F,EAAAC,KAAoEglB,EAAAC,GAAA2Q,EAAO5Q,EAAAC,EAAA,GAAAwH,EAASzH,EAAAC,EAAA,GAAAkT,EAASnT,EAAAC,EAAA,GAAA6B,GAAS6S,QAAA,GAAa9c,GAAAyf,IAAAt8B,EAAAi4B,cAAA5B,MAGvb3J,SAAA1T,KAAA2jB,IAAA,WACA,GAAAA,GAAAjQ,SAAAiJ,IAAA8E,gBAAA3E,QAcA,OAZA6G,GAAAjC,UAAAiC,EAAA7G,QACA+E,aAAA,SAAA1E,EAAAyG,GACAt9B,KAAAs7B,QAAAE,aAAA3E,EAAAyG,MAIAD,EAAAhC,UAAAgC,EAAA7G,QACA+E,aAAA,SAAA1E,EAAAyG,GACAt9B,KAAAs7B,QAAAG,aAAA5E,EAAAyG,MAIAD,OX+7D6B98B,KAAKX,QAASM,oBAAoB,GAAGL,UAI5D,SAASA,EAAQD,GAEvB,YAMA,SAASyB,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAJhH5B,EAAQiB,YAAa,CAErB,IAAIY,GAAe,WAAe,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAIC,GAAI,EAAGA,EAAID,EAAME,OAAQD,IAAK,CAAE,GAAIE,GAAaH,EAAMC,EAAIE,GAAWC,WAAaD,EAAWC,aAAc,EAAOD,EAAWE,cAAe,EAAU,SAAWF,KAAYA,EAAWG,UAAW,GAAMhB,OAAOiB,eAAeR,EAAQI,EAAWd,IAAKc,IAAiB,MAAO,UAAUR,EAAaa,EAAYC,GAAiJ,MAA9HD,IAAYV,EAAiBH,EAAYJ,UAAWiB,GAAiBC,GAAaX,EAAiBH,EAAac,GAAqBd,MYn3J5gBiE,EAAK,WAIX,QAJMA,GAIL+3B,EAASC,GZ23JjBn8B,EAAgBrB,KY/3JHwF,GAKbxF,KAAKy9B,UAAUD,GACfx9B,KAAK09B,SAAWH,EZs6JpB,MApDA97B,GYx3JiB+D,EAAK,OZy3JlBvE,IAAK,gBACLiE,MYx3JmB,MZy3JnBlD,YAAY,KY33JCwD,EAAKrE,UAStBs8B,UAAS,SAACD,GAEN,MADAx9B,MAAK29B,QAAUH,GAAUh4B,EAAMo4B,cACxB59B,MAXMwF,EAAKrE,UActBszB,QAAO,SAACxzB,EAAKoK,GAET,MADArL,MAAK09B,SAAS19B,KAAK69B,WAAW58B,IAAQgY,KAAKgI,UAAU5V,GAC9CrL,MAhBMwF,EAAKrE,UAmBtB28B,WAAU,SAAC78B,GAEP,aADOjB,MAAK09B,SAAS19B,KAAK69B,WAAW58B,IAC9BjB,MArBMwF,EAAKrE,UAwBtBqzB,QAAO,SAACvzB,GACJ,GAAIgT,GAAOjU,KAAK09B,SAAS19B,KAAK69B,WAAW58B,GACzC,OAAKgT,GACEgF,KAAKC,MAAMjF,GADA,MA1BLzO,EAAKrE,UA8BtB48B,MAAK,WAED,IAAK,GAAI98B,KAAOjB,MAAK09B,SAEZ19B,KAAK09B,SAASt8B,eAAeH,IAEA,IAA9BA,EAAIoG,QAAQrH,KAAK29B,gBACV39B,MAAK09B,SAASz8B,EAK7B,OAAOjB,OA1CMwF,EAAKrE,UA8CtB08B,WAAU,SAAC58B,GACP,MAAOjB,MAAK29B,QAAU18B,GA/CTuE,IZ+6JrB5F,GAAQ,WY/6Ja4F,EZg7JrB3F,EAAOD,QAAUA,EAAQ,YAInB,SAASC,EAAQD,GAEvB,YAIA,SAASyB,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAFhH5B,EAAQiB,YAAa,CAIrB,Ia57JqB4E,GAAU,WAEhB,QAFMA,Kb87JbpE,EAAgBrB,Ka97JHyF,GAGbzF,KAAK6V,MbkgKT,MargKiBpQ,GAAUtE,UAM3B68B,aAAY,SAAC9M,GACT,MAAQA,KAASlxB,MAAKi+B,YAPTx4B,EAAUtE,UAU3BuU,GAAE,SAACgf,EAAQ7qB,Gb87JP,GAAIq0B,GAAQl+B,Ia37JZ,IADqB,gBAAV00B,KAAoBA,GAAUA,KACpCA,EAAQ,KAAM,IAAIxoB,OAAM,4BAC7B,IAAwB,kBAAbrC,GAAyB,KAAM,IAAIqC,OAAM,8BAUpD,OARAwoB,GAAOnuB,QAAQ,SAAC2qB,GAEPgN,EAAKF,aAAa9M,KAAQgN,EAAKD,WAAW/M,OAE/CgN,EAAKD,WAAW/M,GAAOtqB,KAAKiD,KAIzB7J,MAxBMyF,EAAUtE,UA4B3B6U,KAAI,SAACkb,Gb+7JD,IAAK,GAFDiN,GAASn+B,KAEJo+B,EAAOtrB,UAAUhR,Oa/7Jf2S,EAAIhN,MAAA22B,EAAA,EAAAA,EAAA,EAAA,GAAAtD,EAAA,EAAAsD,EAAAtD,EAAAA,IAAJrmB,EAAIqmB,EAAA,GAAAhoB,UAAAgoB,EAEf,IAAIjoB,GAAS,IAEb,OAAK7S,MAAKg+B,aAAa9M,IAEvBlxB,KAAKi+B,WAAW/M,GAAOmN,KAAK,SAACx0B,GAGzB,MADAgJ,GAAShJ,EAAS0J,MAAK4qB,EAAO1pB,GACtB5B,KAAW,IAIhBA,GAT+B,MAhCzBpN,EAAUtE,UA6C3B0U,IAAG,SAACqb,EAAOrnB,Gbg8JP,GAAIy0B,GAASt+B,Ia97Jb,IAAKkxB,EAMD,GAAKrnB,EAIE,CAEH,IAAK7J,KAAKg+B,aAAa9M,GAAQ,MAAOlxB,KAEtCA,MAAKi+B,WAAW/M,GAAO3qB,QAAQ,SAAC+c,EAAIzhB,GAE5ByhB,IAAOzZ,SAAiBy0B,GAAKL,WAAW/M,GAAOrvB,gBARhD7B,MAAKi+B,WAAW/M,OAN3BlxB,MAAKi+B,aAsBT,OAAOj+B,OAvEMyF,IbwgKrB7F,GAAQ,WaxgKa6F,EbygKrB5F,EAAOD,QAAUA,EAAQ,YAInB,SAASC,EAAQD,EAASM,GAEhC,YAMA,SAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAEzF,QAASS,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAEhH,QAAS+8B,GAAUC,EAAUC,GAAc,GAA0B,kBAAfA,IAA4C,OAAfA,EAAuB,KAAM,IAAIj9B,WAAU,iEAAoEi9B,GAAeD,GAASr9B,UAAYD,OAAO8wB,OAAOyM,GAAcA,EAAWt9B,WAAa+M,aAAehJ,MAAOs5B,EAAUx8B,YAAY,EAAOE,UAAU,EAAMD,cAAc,KAAew8B,IAAYv9B,OAAOw9B,eAAiBx9B,OAAOw9B,eAAeF,EAAUC,GAAcD,EAASG,UAAYF,GARje7+B,EAAQiB,YAAa,CAErB,IAAIY,GAAe,WAAe,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAIC,GAAI,EAAGA,EAAID,EAAME,OAAQD,IAAK,CAAE,GAAIE,GAAaH,EAAMC,EAAIE,GAAWC,WAAaD,EAAWC,aAAc,EAAOD,EAAWE,cAAe,EAAU,SAAWF,KAAYA,EAAWG,UAAW,GAAMhB,OAAOiB,eAAeR,EAAQI,EAAWd,IAAKc,IAAiB,MAAO,UAAUR,EAAaa,EAAYC,GAAiJ,MAA9HD,IAAYV,EAAiBH,EAAYJ,UAAWiB,GAAiBC,GAAaX,EAAiBH,EAAac,GAAqBd,MAQ7hBmB,EAAiBxC,Ec3hKoC,Gd6hKrDoC,EAAapC,Ec5hKY,Gd8hKzB0+B,EAAS1+B,Ec7hKgB,Id+hKzB0C,EAAkB1C,Ec9hKC,IdgiKnB2C,EAAmBlC,EAAuBiC,GAE1Ci8B,EAAe3+B,EcjiKK,IdmiKpB4+B,EAAgBn+B,EAAuBk+B,GcjiKtBn5B,EAAM,SAAAq5B,GdsiKvB,QctiKiBr5B,KduiKbrE,EAAgBrB,KcviKH0F,GdyiKbq5B,EAAYxrB,MAAMvT,KAAM8S,WAExB9S,KcviKJ00B,QACIsK,cAAe,gBACfC,eAAgB,iBAChBC,aAAc,gBdmuKlB,MAtMAX,GcpiKiB74B,EAAMq5B,GAANr5B,EAAMvE,UAcjBg+B,YAAW,SAACjkB,GdijKd,Gc/iKIkkB,EdgjKJ,OAAOC,oBAAmBrM,MAAM,SAAsBsM,GAClD,OAAU,OAAQA,EAAYC,KAAOD,EAAYv3B,MAC7C,IAAK,GAQD,Mc1jKRq3B,GAAc,GAAAN,GAAA,WAAgB5jB,GdojKtBokB,EAAYC,KAAO,Ec/iK3Bv/B,KAAKgW,KAAKhW,KAAK00B,OAAOsK,cAAeI,GdojK7BE,EAAYv3B,KAAO,EACZs3B,mBAAmBG,McnjKJx/B,KAAKy/B,cAAcvkB,GdqjK7C,KAAK,GAGD,GcxjKRkkB,EAAYM,UAASJ,EAAAK,MAEjBP,EAAYQ,iBAAkBR,EAAYS,UAAS,CdujK3CP,EAAYv3B,KAAO,EACnB,OAIJ,MADAu3B,GAAYv3B,KAAO,EACZs3B,mBAAmBG,Mc3jKJJ,EAAY9jB,WAAWxC,Od6jKjD,KAAK,Gc7jKLsmB,EAAYU,MAAKR,EAAAK,IdgkKjB,KAAK,IACD,Gc9jKHP,EAAY5kB,KAAI,Cd+jKT8kB,EAAYv3B,KAAO,EACnB,OAGJ,KcnkKqB,IAAImE,OAAM,mCdqkKnC,KAAK,IAID,McvkKRlM,MAAKgW,KAAKhW,KAAK00B,OAAOuK,eAAgBG,GdukKvBE,EAAYS,OAAO,ScrkK3BX,EdukKH,KAAK,IAQD,KAPAE,GAAYC,KAAO,GACnBD,EAAYU,GAAKV,EAAY,SAAS,GcrkKzCA,EAAAU,GAAEZ,cAAaE,EAAAU,GAAIhgC,KAAKigC,UAASX,EAAAU,GAAIZ,IAE1Cp/B,KAAKgW,KAAKhW,KAAK00B,OAAOwK,aAAYI,EAAAU,IdykKpBV,EAAYU,EAEtB,KAAK,IACL,IAAK,MACD,MAAOV,GAAYjW,SAE5B,KAAMrpB,OAAQ,EAAG,OctnKP0F,EAAMvE,UAoDjBs+B,cAAa,SAACvkB,Gd4kKhB,MAAOmkB,oBAAmBrM,MAAM,SAAwBsM,GACpD,OAAU,OAAQA,EAAYC,KAAOD,EAAYv3B,MAC7C,IAAK,GAED,MADAu3B,GAAYv3B,KAAO,EACZs3B,mBAAmBG,Mc/kKzB98B,EAAAuG,MAAM1I,KAAK,KAAM2a,GdilKtB,KAAK,GACD,MAAOokB,GAAYS,OAAO,SAAUT,EAAYK,KAEpD,KAAK,GACL,IAAK,MACD,MAAOL,GAAYjW,SAE5B,KAAMrpB,Oc7oKI0F,EAAMvE,UA8DvB8+B,UAAS,SAACh0B,EAAGmzB,GAWT,MARKnzB,GAAE7K,eAAe,gBAAmB6K,EAAE7K,eAAe,qBAEtD6K,EAAEmzB,YAAcA,EAChBnzB,EAAEi0B,gBAAkBj0B,EAAEuT,QACtBvT,EAAEuT,QAAW4f,GAAeA,EAAYxyB,OAAM,IAAUX,EAAEi0B,iBAIvDj0B,GAzEMvG,EAAMvE,UAuFvBg/B,cAAa,SAACllB,GAMV,GAJAA,EAAOA,MACPA,EAAKjE,QAAUiE,EAAKjE,aAGfiE,EAAKzB,IAAK,KAAM,IAAItN,OAAM,qBAE/B,IADK+O,EAAK7B,SAAQ6B,EAAK7B,OAAS,OAC5B6B,EAAK7B,QAAU1T,EAAO06B,gBAAgB/4B,QAAQ4T,EAAK7B,QAAU,EAAG,KAAM,IAAIlN,OAAM,2BAA6B+O,EAAK7B,OAiBtH,IAdA6B,EAAKxB,YAAcwB,EAAKxB,aAAe,UACvCwB,EAAKvB,KAAOuB,EAAKvB,MAAQ,OAGrBuB,EAAKolB,QACLplB,EAAKzB,IAAMyB,EAAKzB,KAAOyB,EAAKzB,IAAInS,QAAQ,KAAO,GAAK,IAAM,KAAO/E,EAAA6D,eAAe8U,EAAKolB,QAGnFzB,EAAA0B,eAAe,SAAUrlB,EAAKjE,WAChCiE,EAAKjE,QAAgB,OAAI8nB,EAAA,WAAYyB,kBAKhB,gBAAdtlB,GAAK5D,OAAsB4D,EAAK5D,KAAM,CAE7C,GAAImpB,GAAwB5B,EAAA0B,eAAexB,EAAA,WAAY2B,aAAcxlB,EAAKjE,QAErEwpB,KACDA,EAAwB1B,EAAA,WAAY2B,aACpCxlB,EAAKjE,QAAQwpB,GAAyB1B,EAAA,WAAYyB,iBAGtD,IAAIG,GAAczlB,EAAKjE,QAAQwpB,EAG3BE,GAAYr5B,QAAQy3B,EAAA,WAAYyB,kBAAoB,GACpDtlB,EAAK5D,KAAO4B,KAAKgI,UAAUhG,EAAK5D,MACzBqpB,EAAYr5B,QAAQy3B,EAAA,WAAY6B,wBAA0B,KACjE1lB,EAAK5D,KAAO/U,EAAA6D,eAAe8U,EAAK5D,OAMxC,GAAIupB,GAAM,GAAAl+B,GAAAwG,QAAY+R,EAAKzB,IAAKyB,EAKhC,OAFA2lB,GAAIC,aAAe5lB,EAAK5D,KAEjBupB,Gd0lKXn/B,EcpuKiBiE,EAAM,OdquKnBzE,IAAK,kBACLiE,OcpuKsB,MAAO,OAAQ,MAAO,SAAU,QAAS,UAAW,QdquK1ElD,YAAY,KcvuKC0D,Gd2uKlB7C,EAAiB,WAEpBjD,GAAQ,Wc7uKa8F,Ed8uKrB7F,EAAOD,QAAUA,EAAQ,YAInB,SAASC,EAAQD,EAASM,GAEhC,YAMA,SAASa,GAAwBH,GAAO,GAAIA,GAAOA,EAAIC,WAAc,MAAOD,EAAc,IAAII,KAAa,IAAW,MAAPJ,EAAe,IAAK,GAAIK,KAAOL,GAAWM,OAAOC,UAAUC,eAAeb,KAAKK,EAAKK,KAAMD,EAAOC,GAAOL,EAAIK,GAAmC,OAAzBD,GAAO,WAAaJ,EAAYI,EevvK9P,QAAS8/B,GAAeC,EAAY9lB,GAEvCA,EAAOA,KAEP,IAAIK,GAAW,GAAA5Y,GAAAyG,SAAa43B,EAAY9lB,EAYxC,OATI+lB,GAAM74B,aAENmT,EAASwkB,MAAQiB,EACjBzlB,EAAS2lB,QAAU,WACf,MAAOjhC,MAAK8/B,QAKbxkB,EAIJ,QAASglB,GAAepqB,EAAMc,GAEjC,MADAd,GAAOA,EAAKY,cACL5V,OAAOoF,KAAK0Q,GAASkqB,OAAO,SAASC,EAAKlgC,GAC7C,MAAIkgC,GAAYA,EACZjrB,GAAQjV,EAAI6V,cAAsB7V,EAC/BkgC,GACR,MfytKPvhC,EAAQiB,YAAa,EACrBjB,EAAQkhC,eAAiBA,EACzBlhC,EAAQ0gC,eAAiBA,CAIzB,IAAI59B,GAAiBxC,EelwKoC,GfowKrDoC,EAAapC,EenwKM,GAAX8gC,EAAKjgC,EAAAuB,If2yKX,SAASzC,EAAQD,EAASM,GAEhC,YAMA,SAASa,GAAwBH,GAAO,GAAIA,GAAOA,EAAIC,WAAc,MAAOD,EAAc,IAAII,KAAa,IAAW,MAAPJ,EAAe,IAAK,GAAIK,KAAOL,GAAWM,OAAOC,UAAUC,eAAeb,KAAKK,EAAKK,KAAMD,EAAOC,GAAOL,EAAIK,GAAmC,OAAzBD,GAAO,WAAaJ,EAAYI,EAErQ,QAASK,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCANhH5B,EAAQiB,YAAa,CAErB,IAAIY,GAAe,WAAe,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAIC,GAAI,EAAGA,EAAID,EAAME,OAAQD,IAAK,CAAE,GAAIE,GAAaH,EAAMC,EAAIE,GAAWC,WAAaD,EAAWC,aAAc,EAAOD,EAAWE,cAAe,EAAU,SAAWF,KAAYA,EAAWG,UAAW,GAAMhB,OAAOiB,eAAeR,EAAQI,EAAWd,IAAKc,IAAiB,MAAO,UAAUR,EAAaa,EAAYC,GAAiJ,MAA9HD,IAAYV,EAAiBH,EAAYJ,UAAWiB,GAAiBC,GAAaX,EAAiBH,EAAac,GAAqBd,MAM7hBmB,EAAiBxC,EgBxzKoC,GhB0zKrD0+B,EAAS1+B,EgBzzKU,IAAX8gC,EAAKjgC,EAAA69B,GAEIj5B,EAAW,WAejB,QAfMA,GAeLuV,EAASI,EAAUC,GhBk1K3Bla,EAAgBrB,KgBj2KH2F,GAkBb3F,KAAKohC,SAAWlmB,EAGhBlb,KAAK0/B,UAAYpkB,EAEjBtb,KAAK8/B,MAAQvkB,EACbvb,KAAKqhC,MAAQ,KACbrhC,KAAKshC,chB6/KT,MA1NA7/B,GgB5zKiBkE,EAAW,OhB6zKxB1E,IAAK,eACLiE,MgB5zKkB,ehB6zKlBlD,YAAY,IAEZf,IAAK,mBACLiE,MgB/zKsB,mBhBg0KtBlD,YAAY,IAEZf,IAAK,wBACLiE,MgBl0K2B,kBhBm0K3BlD,YAAY,IAEZf,IAAK,yBACLiE,MgBr0K4B,oChBs0K5BlD,YAAY,IAEZf,IAAK,mBACLiE,MgBx0KsB,IhBy0KtBlD,YAAY,IAEZf,IAAK,iBACLiE,MgB30KoB,OhB40KpBlD,YAAY,IAEZf,IAAK,qBACLiE,MgB90KwB,KhBq1KxBlD,YAAY,KgB71KC2D,EAAWxE,UAgC5Bma,SAAQ,WACJ,MAAOtb,MAAK0/B,WAjCC/5B,EAAWxE,UAuC5B+Z,QAAO,WACH,MAAOlb,MAAKohC,UAxCCz7B,EAAWxE,UA8C5BqZ,GAAE,WACE,MAAOxa,MAAK0/B,WAAa1/B,KAAK0/B,UAAUllB,IA/C3B7U,EAAWxE,UAqD5B2X,KAAI,WACA,IAAK9Y,KAAK6/B,YAAc7/B,KAAK4/B,eAAgB,KAAM,IAAI1zB,OAAM,uBAC7D,OAAOlM,MAAK8/B,OAvDCn6B,EAAWxE,UA6D5B6X,KAAI,WACA,IAAKhZ,KAAK6/B,UAAW,KAAM,IAAI3zB,OAAM,uBAIrC,OAHKlM,MAAKqhC,QACNrhC,KAAKqhC,MAAQrhC,KAAK8/B,MAAQ7mB,KAAKC,MAAMlZ,KAAK8/B,OAAS,MAEhD9/B,KAAKqhC,OAlEC17B,EAAWxE,UAyE5ByL,MAAK,SAAC20B,GAEF,GAAIvhC,KAAKwa,OAAS+mB,EAAa,MAAO,KAEtC,IAAI/hB,IAAWxf,KAAK0/B,WAAa1/B,KAAK0/B,UAAUnlB,OAASva,KAAK0/B,UAAUnlB,OAAS,IAAM,KACxEva,KAAK0/B,WAAa1/B,KAAK0/B,UAAUjlB,WAAaza,KAAK0/B,UAAUjlB,WAAa,GAEzF,KAEQza,KAAKgZ,OAAOwG,UAASA,EAAUxf,KAAKgZ,OAAOwG,SAC3Cxf,KAAKgZ,OAAOwoB,oBAAmBhiB,EAAUxf,KAAKgZ,OAAOwoB,mBACrDxhC,KAAKgZ,OAAOyoB,cAAajiB,EAAUxf,KAAKgZ,OAAOyoB,aAErD,MAAOx1B,IAET,MAAOuT,IAxFM7Z,EAAWxE,UA+F5BugC,UAAS,WAEL,IAAK1hC,KAAK4/B,eAAgB,KAAM,IAAI1zB,OAAM,4BAE1C,KAAKlM,KAAKshC,WAAWx/B,OAAQ,CAIzB,GAAIgX,GAAO9Y,KAAK8Y,MAEhB,KAAKA,EAAM,KAAM,IAAI5M,OAAM,mBAE3B,IAAIy1B,GAAW3hC,KAAK4hC,kBAAkBl3B,MAAM,qBAAqB,EAEjE,KAAKi3B,EAAU,KAAM,IAAIz1B,OAAM,uBAE/B,IAAI21B,GAAQ/oB,EAAK1H,WAAWlK,MAAMvB,EAAYm8B,mBAAqBH,EAKnE,IAHwB,KAApBE,EAAM,GAAGv6B,QAAeu6B,EAAM/nB,QAC9B+nB,EAAMA,EAAM//B,OAAS,GAAGwF,QAAU3B,EAAYm8B,oBAAoBD,EAAME,MAExEF,EAAM//B,OAAS,EAAG,KAAM,IAAIoK,OAAM,mBAItC,IAAI81B,GAAar8B,EAAYqsB,OAAO6P,EAAM/nB,QAAS9Z,KAAK0/B,UAAUnlB,OAAQva,KAAK0/B,UAAUjlB,YAAYzB,MAIrGhZ,MAAKshC,WAAaO,EAAM5qB,IAAI,SAACgrB,EAAapgC,GAEtC,GAAI0Y,GAASynB,EAAW1mB,SAASzZ,GAAG0Y,MAEpC,OAAO5U,GAAYqsB,OAAOiQ,EAAM1nB,KAMxC,MAAOva,MAAKshC,YAtIC37B,EAAWxE,UA0I5B+gC,eAAc,SAACxB,GACX,MAAO1gC,MAAK4hC,kBAAkBv6B,QAAQq5B,GAAe,IA3IxC/6B,EAAWxE,UA8I5BygC,gBAAe,WACX,MAAO5hC,MAAK0/B,UAAU1oB,QAAQ2D,IAAIhV,EAAY86B,eAAiB,IA/IlD96B,EAAWxE,UAkJ5By+B,aAAY,WACR,MAAO5/B,MAAKkiC,eAAev8B,EAAYw8B,wBAnJ1Bx8B,EAAWxE,UAsJ5BihC,cAAa,WACT,MAAOpiC,MAAKkiC,eAAev8B,EAAYg7B,yBAvJ1Bh7B,EAAWxE,UA0J5B0+B,QAAO,WACH,MAAO7/B,MAAKkiC,eAAev8B,EAAY46B,mBA3J1B56B,EAqKVqsB,OAAM,SAAClZ,EAAMyB,EAAQE,GAExB3B,EAAOA,GAAQ,GACfyB,EAASA,GAAU,IACnBE,EAAaA,GAAc,KAE3B3B,EAAOA,EAAKiB,QAAQ,MAAO,GAE3B,IAAI/C,GAAU,GAAAtU,GAAA0G,QACVi5B,EAAiBvpB,EAAK5R,MAAMvB,EAAY28B,gBACxCC,EAAeF,EAAevgC,OAAS,EAAKugC,EAAevoB,QAAU,EAgBzE,OAdAhB,GAAOupB,EAAev7B,KAAKnB,EAAY28B,iBAEtCC,GAAe,IACXr7B,MAAM,MACNX,QAAQ,SAAC6T,GAEN,GAAIlT,GAAQkT,EAAO9S,OAAOJ,MAAMvB,EAAY68B,kBACxCvhC,EAAMiG,EAAM4S,QAAQxS,OACpBpC,EAAQgC,EAAMJ,KAAKnB,EAAY68B,kBAAkBl7B,MAEjDrG,IAAK+V,EAAQE,OAAOjW,EAAKiE,KAI9B,GAAIS,GAAY,KAAMq7B,EAAMF,eAAehoB,GAC9C9B,QAASA,EACTuD,OAAQA,EACRE,WAAYA,IACZ3B,IAnMSnT,IhByhLrB/F,GAAQ,WgBzhLa+F,EhB0hLrB9F,EAAOD,QAAUA,EAAQ,YAInB,SAASC,EAAQD,EAASM,GAEhC,YAIA,SAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAEzF,QAASS,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAEhH,QAAS+8B,GAAUC,EAAUC,GAAc,GAA0B,kBAAfA,IAA4C,OAAfA,EAAuB,KAAM,IAAIj9B,WAAU,iEAAoEi9B,GAAeD,GAASr9B,UAAYD,OAAO8wB,OAAOyM,GAAcA,EAAWt9B,WAAa+M,aAAehJ,MAAOs5B,EAAUx8B,YAAY,EAAOE,UAAU,EAAMD,cAAc,KAAew8B,IAAYv9B,OAAOw9B,eAAiBx9B,OAAOw9B,eAAeF,EAAUC,GAAcD,EAASG,UAAYF,GANje7+B,EAAQiB,YAAa,CAQrB,IAAI4hC,GAAYviC,EiB7iLK,IjB+iLjBwiC,EAAa/hC,EAAuB8hC,GAEpC3/B,EAAc5C,EiBhjLkB,IjBkjLhC6C,EAAepC,EAAuBmC,GiBhjLrB4C,EAAM,SAAAi9B,GAEZ,QAFMj9B,KjBsjLbrE,EAAgBrB,KiBtjLH0F,GAGbi9B,EAAApiC,KAAAP,MACAA,KAAK4iC,UAAY,GAAAF,GAAA,WjB+kLrB,MAhCAnE,GiBnjLiB74B,EAAMi9B,GAANj9B,EAAMvE,UAOvB0hC,SAAQ,WACJ,MAAO7iC,MAAK4iC,WARCl9B,EAAMvE,UAWjBs+B,cAAa,SAACvkB,GjBsjLhB,GiBpjLI4nB,EjBqjLJ,OAAOzD,oBAAmBrM,MAAM,SAAwBsM,GACpD,OAAU,OAAQA,EAAYC,KAAOD,EAAYv3B,MAC7C,IAAK,GAGD,MiB1jLR+6B,GAAO9iC,KAAK4iC,UAAUG,KAAK7nB,GjByjLnBokB,EAAYv3B,KAAO,EACZs3B,mBAAmBG,MiBxjLzBsD,EAAKE,YAAY9nB,GjB0jLtB,KAAK,GACD,MAAOokB,GAAYS,OAAO,SAAUT,EAAYK,KAEpD,KAAK,GACL,IAAK,MACD,MAAOL,GAAYjW,SAE5B,KAAMrpB,OiBhlLI0F,GjBolLlB3C,EAAa,WAEhBnD,GAAQ,WiBtlLa8F,EjBulLrB7F,EAAOD,QAAUA,EAAQ,YAInB,SAASC,EAAQD,EAASM,GAEhC,YAIA,SAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAEzF,QAASS,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAJhH5B,EAAQiB,YAAa,CAMrB,IAAIoiC,GAAQ/iC,EkBxmLK,IlB0mLbgjC,EAASviC,EAAuBsiC,GkBxmLfj9B,EAAQ,WAEd,QAFMA,KlB4mLb3E,EAAgBrB,KkB5mLHgG,GAGbhG,KAAKmjC,UlBmwLT,MkBtwLiBn9B,GAAQ7E,UAMzBiiC,IAAG,SAACN,GAEA,MADA9iC,MAAKmjC,OAAOv8B,KAAKk8B,GACV9iC,MARMgG,EAAQ7E,UAWzBkiC,MAAK,WAED,MADArjC,MAAKmjC,UACEnjC,MAbMgG,EAAQ7E,UAgBzB4hC,KAAI,SAAC7nB,GAID,GAAI4nB,GAAO9iC,KAAKmjC,OAAOrpB,OAEvB,KAAKgpB,EAAM,KAAM,IAAI52B,OAAM,mCAAqCgP,EAAQ9B,OAAS,IAAM8B,EAAQ1B,IAE/F,KAAKspB,EAAKjsB,KAAKqE,GAAU,KAAM,IAAIhP,OAAM,iBAAmBgP,EAAQ9B,OAAS,IAAM8B,EAAQ1B,IAClD,sBAAwBspB,EAAK1pB,SAAW,IAAM0pB,EAAK/kB,OAE5F,OAAO+kB,IA3BM98B,EAAQ7E,UA+BzBmiC,QAAO,SAAClqB,EAAe2E,EAAazC,EAAcf,EAAQE,GAItD,MAFAza,MAAKojC,IAAI,GAAAF,GAAA,WAAS9pB,EAAQ2E,EAAMzC,EAAUf,EAAQE,IAE3Cza,MAnCMgG,EAAQ7E,UAuCzBoiC,eAAc,WAYV,MAVAvjC,MAAKsjC,QAAQ,OAAQ,wBACjBE,aAAgB,eAChBC,WAAc,SACdC,WAAc,KACdC,cAAiB,gBACjBC,yBAA4B,MAC5BC,MAAS,kBACTC,YAAc,GAAI/nB,OAAOkQ,UAAY,OAGlCjsB,MAnDMgG,EAAQ7E,UAuDzB4iC,OAAM,WAIF,MAFA/jC,MAAKsjC,QAAQ,OAAQ,4BAEdtjC,MA3DMgG,EAAQ7E,UA+DzB6iC,aAAY,SAAC3jC,GAiBT,MAfAL,MAAKsjC,QAAQ,MAAO,qCAAuCjjC,EAAK,aAC5D4jC,IAAO,uEAAyE5jC,EAAK,YACrF6jC,WACID,IAAO,uEAAyE5jC,EAChFA,GAAMA,EACN8jC,gBAAmB,OAEvBC,eACAC,eAAkB,YAClBC,gBAAmB,UACnBC,WAAc,YACdC,UAAa,eACbC,YAAepkC,IAGZL,MAhFMgG,EAAQ7E,UAoFzBujC,iBAAgB,SAACC,GAEbA,EAAYA,GAAa,IAEzB,IAAIC,GAAO,GAAI7oB,KAqBf,OAnBA/b,MAAKsjC,QAAQ,OAAQ,8BACjBuB,cACI,gDAEJC,eAAkB,GAAI/oB,MAAK6oB,EAAK3Y,UAAyB,IAAZ0Y,GAAmBI,cAChEJ,UAAaA,EACbK,cACIC,cAAiB,SACjBC,YAAc,EACdC,QAAW,UACXC,cAAiB,YACjBC,UAAa,aAEjBhlC,GAAM,cACNilC,aAAgBV,EAAKG,cACrBxqB,OAAU,SACV0pB,IAAO,2EAGJjkC,MA7GMgG,EAAQ7E,UAiHzBokC,oBAAmB,SAACllC,EAAImlC,GAEpBnlC,EAAKA,GAAM,GAEX,IAAIukC,GAAO,GAAI7oB,KAoBf,OAlBA/b,MAAKsjC,QAAQ,OAAQ,8BACjBuB,cAAiB,qCAAuCxkC,EAAK,aAAemlC,EAAW,+BAAiC,KACxHV,eAAkB,GAAI/oB,MAAK6oB,EAAK3Y,UAAa,MAAsB8Y,cACnEC,cACIC,cAAiB,SACjBC,YAAc,EACdC,QAAW,UACXC,cAAiB,YACjBC,UAAa,YACbI,oBAAuB,MACvBC,cAAiB,4BAErBJ,aAAgBV,EAAKG,cACrB1kC,GAAM,cACNka,OAAU,SACV0pB,IAAO,2EAGJjkC,MAzIMgG,EAAQ7E,UA6IzBwkC,aAAY,SAACC,GAuBT,MArBKA,GAaD5lC,KAAKsjC,QAAQ,OAAQ,wBACjB9jB,QAAW,cACXgiB,kBAAqB,cACrBC,YAAe,eAChB,KAfHzhC,KAAKsjC,QAAQ,OAAQ,wBACjBE,aAAgB,4BAChBC,WAAc,SACdC,WAAc,KACdC,cAAiB,6BACjBC,yBAA4B,MAC5BC,MAAS,oBAaV7jC,MApKMgG,IlBywLrBpG,GAAQ,WkBzwLaoG,ElB0wLrBnG,EAAOD,QAAUA,EAAQ,YAInB,SAASC,EAAQD,EAASM,GAEhC,YAIA,SAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAEzF,QAASS,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAJhH5B,EAAQiB,YAAa,CAMrB,IAAImC,GAAmB9C,EmB1xLC,InB4xLpB+C,EAAoBtC,EAAuBqC,GAE3CV,EAAapC,EmB7xLG,GnB+xLhBgD,EAAahD,EmB9xLY,IAER+F,EAAI,WAEV,QAFMA,GAELmT,EAAQ2E,EAAM/E,EAAMuB,EAAQE,EAAYzS,GnB8xLhD3G,EAAgBrB,KmBhyLHiG,GAGbjG,KAAK6lC,QAAUzsB,EAAOE,cACtBtZ,KAAK8lC,MAAQ/nB,EACb/d,KAAKqhC,MAAQroB,MACbhZ,KAAK+lC,OAAS/9B,GAAS,GACvBhI,KAAKgmC,QAAUzrB,GAAU,IACzBva,KAAKimC,YAAcxrB,GAAc,KnB+0LrC,MmBv1LiBxU,GAAI9E,UAWrB4c,KAAI,WACA,MAAO/d,MAAK8lC,OAZC7/B,EAAI9E,UAerBiY,OAAM,WACF,MAAOpZ,MAAK6lC,SAhBC5/B,EAAI9E,UAmBrB0V,KAAI,SAACqE,GAED,MAAOA,GAAQ1B,IAAInS,QAAQrH,KAAK8lC,OAAS,IAClC5qB,EAAQ9B,OAAOE,eAAiBtZ,KAAK6lC,SAtB/B5/B,EAAI9E,UA0Bf6hC,YAAW,SAAC9nB,GnB8xLd,MAAOmkB,oBAAmBrM,MAAM,SAAsBsM,GAClD,OAAU,OAAQA,EAAYC,KAAOD,EAAYv3B,MAC7C,IAAK,GAED,MADAu3B,GAAYv3B,KAAO,EACZs3B,mBAAmBG,MmBhyLhCl9B,EAAA0F,MAAMhI,KAAK+lC,QnBkyLT,KAAK,GACD,MAAOzG,GAAYS,OAAO,SmBjyL/B//B,KAAK8gC,eAAe9gC,KAAKqhC,OnBmyLxB,KAAK,GACL,IAAK,MACD,MAAO/B,GAAYjW,SAE5B,KAAMrpB,OmBr0LIiG,EAAI9E,UAkCrB2/B,eAAc,SAAC9nB,EAAMiC,GAEjBA,EAAOA,MAEPA,EAAKV,OAASU,EAAKV,QAAUva,KAAKgmC,QAClC/qB,EAAKR,WAAaQ,EAAKR,YAAcza,KAAKimC,WAE1C,IAAI/oB,GAAMjE,KAAKgI,UAAUjI,GACrBmoB,EAAMj+B,EAAA49B,eAAe5jB,EAAKjC,EAI9B,OAFAkmB,GAAInqB,QAAQ+D,IAAI9X,EAAA,WAAYw9B,aAAcx9B,EAAA,WAAYs9B,kBAE/CY,GA9CMl7B,InB01LrBrG,GAAQ,WmB11LaqG,EnB21LrBpG,EAAOD,QAAUA,EAAQ,YAInB,SAASC,EAAQD,EAASM,GAEhC,YAMA,SAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAEzF,QAASS,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAEhH,QAAS+8B,GAAUC,EAAUC,GAAc,GAA0B,kBAAfA,IAA4C,OAAfA,EAAuB,KAAM,IAAIj9B,WAAU,iEAAoEi9B,GAAeD,GAASr9B,UAAYD,OAAO8wB,OAAOyM,GAAcA,EAAWt9B,WAAa+M,aAAehJ,MAAOs5B,EAAUx8B,YAAY,EAAOE,UAAU,EAAMD,cAAc,KAAew8B,IAAYv9B,OAAOw9B,eAAiBx9B,OAAOw9B,eAAeF,EAAUC,GAAcD,EAASG,UAAYF,GARje7+B,EAAQiB,YAAa,CAErB,IAAIY,GAAe,WAAe,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAIC,GAAI,EAAGA,EAAID,EAAME,OAAQD,IAAK,CAAE,GAAIE,GAAaH,EAAMC,EAAIE,GAAWC,WAAaD,EAAWC,aAAc,EAAOD,EAAWE,cAAe,EAAU,SAAWF,KAAYA,EAAWG,UAAW,GAAMhB,OAAOiB,eAAeR,EAAQI,EAAWd,IAAKc,IAAiB,MAAO,UAAUR,EAAaa,EAAYC,GAAiJ,MAA9HD,IAAYV,EAAiBH,EAAYJ,UAAWiB,GAAiBC,GAAaX,EAAiBH,EAAac,GAAqBd,MAQ7hBqB,EAAkB1C,EoBj3LC,IpBm3LnB2C,EAAmBlC,EAAuBiC,GAE1CsjC,EAAShmC,EoBp3LK,IpBs3LdimC,EAAUxlC,EAAuBulC,GAEjCE,EAAQlmC,EoBv3LK,IpBy3LbmmC,EAAS1lC,EAAuBylC,GAIhC9jC,GAFiBpC,EoB13LC,GpB43LLA,EoB33LqC,IAEjC2F,EAAQ,SAAAk5B,GA0Bd,QA1BMl5B,GA0BLnB,EAAQa,EAAOX,EAAQC,EAAQC,GpBs5LvCzD,EAAgBrB,KoBh7LH6F,GA4Bbk5B,EAAAx+B,KAAAP,MpBw5LAA,KoBt6LJ00B,QACI4R,YAAa,cACbC,aAAc,eACdC,WAAY,aACZC,cAAe,gBACfC,eAAgB,iBAChBC,aAAc,eACdC,aAAc,eACdC,cAAe,gBACfC,YAAa,eAOb9mC,KAAK+mC,QAAUniC,EACf5E,KAAKgnC,QAAUniC,EACf7E,KAAKinC,WAAaniC,EAGlB9E,KAAKsE,OAASiB,EAGdvF,KAAKyE,QAAUC,EAEf1E,KAAKknC,OAAS,GAAAf,GAAA,WAAUnmC,KAAKsE,OAAQuB,EAASshC,SAAW,YAEzDnnC,KAAKonC,MAAQ,GAAAf,GAAA,WAASrmC,KAAKsE,OAAQuB,EAASshC,UpBkkNhD,MAhvBA5I,GoB53LiB14B,EAAQk5B,GpB83LzBt9B,EoB93LiBoE,EAAQ,OpB+3LrB5E,IAAK,aACLiE,MoB93LgB,WpB+3LhBlD,YAAY,IAEZf,IAAK,cACLiE,MoBj4LiB,OpBk4LjBlD,YAAY,IAEZf,IAAK,kBACLiE,MoBp4LqB,KpBs4LrBlD,YAAY,IAEZf,IAAK,mBACLiE,MoBx4LsB,KpB04LtBlD,YAAY,IAEZf,IAAK,2BACLiE,MoB54L8B,OpB84L9BlD,YAAY,IAEZf,IAAK,iBACLiE,MoBh5LoB,uBpBi5LpBlD,YAAY,IAEZf,IAAK,kBACLiE,MoBn5LqB,wBpBo5LrBlD,YAAY,IAEZf,IAAK,qBACLiE,MoBt5LwB,2BpBu5LxBlD,YAAY,IAEZf,IAAK,kBACLiE,MoBz5LqB,IpB05LrBlD,YAAY,IAEZf,IAAK,WACLiE,MoB55Lc,WpB65LdlD,YAAY,IAEZf,IAAK,4BACLiE,OoB/5L+B,EpBg6L/BlD,YAAY,KoB56LC6D,EAAQ1E,UAiDzB6kB,KAAI,WACA,MAAOhmB,MAAKonC,OAlDCvhC,EAAQ1E,UAwDzBuD,OAAM,WACF,MAAO1E,MAAKyE,SAzDCoB,EAAQ1E,UAoEzBkmC,UAAS,SAACtpB,EAAM1Z,GAEZ0Z,EAAOA,GAAQ,GACf1Z,EAAUA,KAEV,IAAIijC,GAAW,GACXC,EAAqC,IAA3BxpB,EAAK1W,QAAQ,YAAgD,IAA5B0W,EAAK1W,QAAQ,WAa5D,OAXIhD,GAAQmjC,YAAcD,IAASD,GAAYtnC,KAAK+mC,SAEX,IAArChpB,EAAK1W,QAAQxB,EAAS4hC,aAAsBF,IAASD,GAAYzhC,EAAS4hC,WAAa,IAAM5hC,EAAS6hC,aAE1GJ,GAAYvpB,GAER1Z,EAAQsjC,WAAatjC,EAAQujC,YAAUN,GAAavpB,EAAK1W,QAAQ,KAAO,GAAK,IAAM,KAEnFhD,EAAQsjC,YAAWL,GAAY,WAAajjC,EAAQsjC,WACpDtjC,EAAQujC,WAAUN,IAAajjC,EAAQsjC,UAAY,IAAM,IAAM,gBAAkB3nC,KAAKonC,MAAMS,eAEzFP,GAvFMzhC,EAAQ1E,UAmGzB2mC,QAAO,SAACzjC,GAIJ,MAFAA,GAAUA,MAEHrE,KAAKqnC,UAAUxhC,EAASkiC,mBAAqB,IAAMzlC,EAAA6D,gBAClD6hC,cAAiB,OACjBC,aAAgB5jC,EAAQ6jC,aAAe,GACvCC,UAAanoC,KAAKgnC,QAClB50B,MAAS/N,EAAQ+N,OAAS,GAC1Bg2B,SAAY/jC,EAAQgkC,SAAW,GAC/BC,QAAWjkC,EAAQikC,SAAW,GAC9BC,OAAUlkC,EAAQkkC,QAAU,MAC3Bf,WAAW,KA/GP3hC,EAAQ1E,UAuHzBqnC,qBAAoB,SAAChvB,GAEjB,GAAIivB,GAAKnmC,EAAAyE,iBAAiByS,EAAItS,MAAM,KAAKshB,UAAU,IAC/C5b,EAAQ67B,EAAGjH,mBAAqBiH,EAAG77B,KAEvC,IAAIA,EAAO,CACP,GAAIX,GAAI,GAAIC,OAAMU,EAElB,MADAX,GAAEW,MAAQ67B,EAAG77B,MACPX,EAGV,MAAOw8B,IAlIM5iC,EAAQ1E,UAyInBunC,SAAQ,WpBo6LV,MAAOrJ,oBAAmBrM,MAAM,SAAmBsM,GAC/C,OAAU,OAAQA,EAAYC,KAAOD,EAAYv3B,MAC7C,IAAK,GAGD,MAFAu3B,GAAYC,KAAO,EACnBD,EAAYv3B,KAAO,EACZs3B,mBAAmBG,MoBt6L5Bx/B,KAAK2oC,wBpBw6LP,KAAK,GACD,MAAOrJ,GAAYS,OAAO,UoBx6L3B,EpB06LH,KAAK,GAGD,MAFAT,GAAYC,KAAO,EACnBD,EAAYU,GAAKV,EAAY,SAAS,GAC/BA,EAAYS,OAAO,UoB36L3B,EpB66LH,KAAK,GACL,IAAK,MACD,MAAOT,GAAYjW,SAE5B,KAAMrpB,OAAQ,EAAG,MoBhkMP6F,EAAQ1E,UA6JnBynC,MAAK,SAACvkC,GpBi7LR,GoBv6LQgT,GAuBA+nB,EACApmB,CpBg5LR,OAAOqmB,oBAAmBrM,MAAM,SAAgBsM,GAC5C,OAAU,OAAQA,EAAYC,KAAOD,EAAYv3B,MAC7C,IAAK,GA+BD,MA9BAu3B,GAAYC,KAAO,EoBj7L3Bl7B,EAAUA,MAEVA,EAAQwkC,SAAWxkC,EAAQwkC,WAAY,EAEvC7oC,KAAKgW,KAAKhW,KAAK00B,OAAO4R,aAElBjvB,GACAyxB,iBAAoBjjC,EAASkjC,gBAC7BC,kBAAqB3kC,EAAQwkC,SAAWhjC,EAASojC,yBAA2BpjC,EAASqjC,kBAGpF7kC,EAAQ8H,KAOF9H,EAAQ8H,OAEfkL,EAAK8xB,WAAa,qBAClB9xB,EAAKlL,KAAO9H,EAAQ8H,KACpBkL,EAAK4wB,aAAe5jC,EAAQ6jC,cAT5B7wB,EAAK8xB,WAAa,WAClB9xB,EAAK+xB,SAAW/kC,EAAQ+kC,SACxB/xB,EAAKgyB,SAAWhlC,EAAQglC,SACxBhyB,EAAK6sB,UAAY7/B,EAAQ6/B,WAAa,IAWtC7/B,EAAQilC,aAAYjyB,EAAKkyB,YAAcllC,EAAQilC,YpBm7L3ChK,EAAYv3B,KAAO,EACZs3B,mBAAmBG,MoBl7LVx/B,KAAKwpC,cAAc3jC,EAAS4jC,eAAgBpyB,GpBo7LhE,KAAK,GAQD,MoB57LJ+nB,GAAWE,EAAAK,KACX3mB,EAAOomB,EAAYpmB,OAEvBhZ,KAAKonC,MACAsC,QAAQ1wB,GACR2wB,YAAYtlC,EAAQwkC,UAEzB7oC,KAAKgW,KAAKhW,KAAK00B,OAAO6R,aAAcnH,GpBq7LrBE,EAAYS,OAAO,SoBn7L3BX,EpBq7LH,KAAK,IAQD,KAPAE,GAAYC,KAAO,GACnBD,EAAYU,GAAKV,EAAY,SAAS,GoBn7L9Ct/B,KAAKsE,OAAOy5B,QAEZ/9B,KAAKgW,KAAKhW,KAAK00B,OAAO8R,WAAUlH,EAAAU,IpBu7LlBV,EAAYU,EAEtB,KAAK,IACL,IAAK,MACD,MAAOV,GAAYjW,SAE5B,KAAMrpB,OAAQ,EAAG,OoB1oMP6F,EAAQ1E,UAwNnByoC,QAAO,WpB07LT,GoB35LQzI,GAMAnoB,CpBs5LR,OAAOqmB,oBAAmBrM,MAAM,SAAkBsM,GAC9C,OAAU,OAAQA,EAAYC,KAAOD,EAAYv3B,MAC7C,IAAK,GAKD,GAJAu3B,EAAYC,KAAO,EoB17L3Bv/B,KAAKgW,KAAKhW,KAAK00B,OAAO+R,gBAElBzmC,KAAKknC,OAAO2C,WAAU,CpB67LdvK,EAAYv3B,KAAO,CACnB,OAIJ,MADAu3B,GAAYv3B,KAAO,EACZs3B,mBAAmBG,MoBh8LxBx/B,KAAKknC,OAAOx/B,OpBk8LlB,KAAK,GACD,GoBj8LC1H,KAAK8pC,sBAAqB,CpBk8LvBxK,EAAYv3B,KAAO,CACnB,OAGJ,KoBr8LM,IAAImE,OAAM,qCpBu8LpB,KAAK,GAID,MoBx8LJlM,MAAKgW,KAAKhW,KAAK00B,OAAOgS,eAAgB,MpBw8L3BpH,EAAYS,OAAO,SoBt8LvB,KpBw8LP,KAAK,GAMD,MoB18LR//B,MAAKknC,OAAO6C,QpBy8LJzK,EAAYv3B,KAAO,GACZs3B,mBAAmBG,MoBv8L5Bl9B,EAAA0F,MAAMnC,EAASmkC,iBpBy8LjB,KAAK,IACD,GoBv8LHhqC,KAAKonC,MAAM6C,eAAc,CpBw8LlB3K,EAAYv3B,KAAO,EACnB,OAGJ,KoB58L8B,IAAImE,OAAM,2BpB88L5C,KAAK,IACD,GoB98LHlM,KAAKonC,MAAM8C,oBAAmB,CpB+8LvB5K,EAAYv3B,KAAO,EACnB,OAGJ,KoBn9LmC,IAAImE,OAAM,4BpBq9LjD,KAAK,IACD,GoBr9LHlM,KAAKknC,OAAO2C,WAAU,CpBs9LfvK,EAAYv3B,KAAO,EACnB,OAGJ,KoB19L2B,IAAImE,OAAM,wCpB49LzC,KAAK,IAED,MADAozB,GAAYv3B,KAAO,GACZs3B,mBAAmBG,MoB39LlBx/B,KAAKwpC,cAAc3jC,EAAS4jC,gBACpCN,WAAc,gBACdxF,cAAiB3jC,KAAKonC,MAAM6C,eAC5BnB,iBAAoBjjC,EAASkjC,gBAC7BC,kBAAqBhpC,KAAKonC,MAAMyB,WAAahjC,EAASojC,yBAA2BpjC,EAASqjC,mBpB89L9F,KAAK,IAID,GoBt+LJ/H,EAAG7B,EAAAK,KAMH3mB,EAAOmoB,EAAInoB,OAEVA,EAAKwqB,aAAY,CpB+9LVlE,EAAYv3B,KAAO,EACnB,OAGJ,KoBl+LE/H,MAAKyE,QAAQw7B,UAAU,GAAI/zB,OAAM,4BAA6Bi1B,EpBo+LpE,KAAK,IAOD,MoBx+LRnhC,MAAKonC,MAAMsC,QAAQ1wB,GACnBhZ,KAAKknC,OAAOiD,SAEZnqC,KAAKgW,KAAKhW,KAAK00B,OAAOgS,eAAgBvF,GpBq+LvB7B,EAAYS,OAAO,SoBn+L3BoB,EpBq+LH,KAAK,IAYD,KAXA7B,GAAYC,KAAO,GACnBD,EAAYU,GAAKV,EAAY,SAAS,GoBn+L9CA,EAAAU,GAAIhgC,KAAKyE,QAAQw7B,UAASX,EAAAU,IAEtBn6B,EAASukC,2BACTpqC,KAAKsE,OAAOy5B,QAGhB/9B,KAAKgW,KAAKhW,KAAK00B,OAAOiS,aAAYrH,EAAAU,IpBu+LpBV,EAAYU,EAEtB,KAAK,IACL,IAAK,MACD,MAAOV,GAAYjW,SAE5B,KAAMrpB,OAAQ,EAAG,OoB/vMP6F,EAAQ1E,UA6RnB4iC,OAAM,WpB0+LR,GoBl+LQ5C,EpBm+LR,OAAO9B,oBAAmBrM,MAAM,SAAiBsM,GAC7C,OAAU,OAAQA,EAAYC,KAAOD,EAAYv3B,MAC7C,IAAK,GAQD,MAPAu3B,GAAYC,KAAO,EoB1+L3Bv/B,KAAKgW,KAAKhW,KAAK00B,OAAOkS,cAEtB5mC,KAAKknC,OAAO6C,QpB8+LJzK,EAAYv3B,KAAO,EACZs3B,mBAAmBG,MoB7+LlBx/B,KAAKwpC,cAAc3jC,EAASwkC,iBACxCC,MAAOtqC,KAAKonC,MAAMS,gBpBg/LlB,KAAK,GAQD,MoBz/LJ1G,GAAG7B,EAAAK,KAIP3/B,KAAKknC,OAAOiD,SACZnqC,KAAKsE,OAAOy5B,QAEZ/9B,KAAKgW,KAAKhW,KAAK00B,OAAOmS,cAAe1F,GpBk/LtB7B,EAAYS,OAAO,SoBh/L3BoB,EpBk/LH,KAAK,IAQD,KAPA7B,GAAYC,KAAO,GACnBD,EAAYU,GAAKV,EAAY,SAAS,GoBh/L9Ct/B,KAAKknC,OAAOiD,SAEZnqC,KAAKgW,KAAKhW,KAAK00B,OAAOoS,YAAWxH,EAAAU,IpBo/LnBV,EAAYU,EAEtB,KAAK,IACL,IAAK,MACD,MAAOV,GAAYjW,SAE5B,KAAMrpB,OAAQ,EAAG,OoB9yMP6F,EAAQ1E,UAkUnBopC,eAAc,SAACrvB,EAAS7W,GpBu/L1B,MAAOg7B,oBAAmBrM,MAAM,SAAyBsM,GACrD,OAAU,OAAQA,EAAYC,KAAOD,EAAYv3B,MAC7C,IAAK,GAID,GoB3/LZ1D,EAAUA,OAENA,EAAQmmC,cAAa,CpB0/LTlL,EAAYv3B,KAAO,CACnB,OAGJ,MAAOu3B,GAAYS,OAAO,SoB9/LJ7kB,EpBggM1B,KAAK,GAED,MADAokB,GAAYv3B,KAAO,EACZs3B,mBAAmBG,MoBhgMhCx/B,KAAK2oC,wBpBkgMH,KAAK,GAOD,MoBvgMZztB,GAAQlE,QAAQ+D,IAAI,gBAAiB/a,KAAKyqC,epBugMvBnL,EAAYS,OAAO,SoBlgM/B7kB,EpBogMC,KAAK,GACL,IAAK,MACD,MAAOokB,GAAYjW,SAE5B,KAAMrpB,OoBv1MI6F,EAAQ1E,UAyVnBg+B,YAAW,SAACjkB,EAAS7W,GpBygMvB,MAAOg7B,oBAAmBrM,MAAM,SAAsBsM,GAClD,OAAU,OAAQA,EAAYC,KAAOD,EAAYv3B,MAC7C,IAAK,GAGD,MAFAu3B,GAAYC,KAAO,EACnBD,EAAYv3B,KAAO,EACZs3B,mBAAmBG,MoB1gMlBx/B,KAAKuqC,eAAervB,EAAS7W,GpB4gMzC,KAAK,GAGD,MoB/gMR6W,GAAOokB,EAAAK,KpB8gMCL,EAAYv3B,KAAO,EACZs3B,mBAAmBG,MoB7gMpBx/B,KAAKyE,QAAQ06B,YAAYjkB,GpB+gMnC,KAAK,GACD,MAAOokB,GAAYS,OAAO,SAAUT,EAAYK,KAEpD,KAAK,GAID,GAHAL,EAAYC,KAAO,EACnBD,EAAYU,GAAKV,EAAY,SAAS,GoB/gMzCA,EAAAU,GAAEZ,aAAgBE,EAAAU,GAAEZ,YAAY9jB,YAAkD,KAAnCgkB,EAAAU,GAAEZ,YAAY9jB,WAAWf,OAAc,CpBkhM/E+kB,EAAYv3B,KAAO,EACnB,OAGJ,KAAMu3B,GAAYU,EAEtB,KAAK,IAKD,MoB3hMRhgC,MAAKonC,MAAMsD,oBpB0hMHpL,EAAYv3B,KAAO,GACZs3B,mBAAmBG,MoBzhMpBx/B,KAAKm/B,YAAYjkB,EAAS7W,GpB2hMpC,KAAK,IACD,MAAOi7B,GAAYS,OAAO,SAAUT,EAAYK,KAEpD,KAAK,IACL,IAAK,MACD,MAAOL,GAAYjW,SAE5B,KAAMrpB,OAAQ,EAAG,MoB14MP6F,EAAQ1E,UAwXnBya,KAAI,WpBiiMN,GoBjiMOvX,GAAOyO,UAAAhR,QAAA,GAAAgK,SAAAgH,UAAA,MAAKA,UAAA,EpBkiMnB,OAAOusB,oBAAmBrM,MAAM,SAAesM,GAC3C,OAAU,OAAQA,EAAYC,KAAOD,EAAYv3B,MAC7C,IAAK,GAMD,MoBviMZ1D,GAAQmV,IAAMxZ,KAAKqnC,UAAUhjC,EAAQmV,KAAMguB,WAAW,IpBsiM1ClI,EAAYv3B,KAAO,EACZs3B,mBAAmBG,MoBriMzBx/B,KAAKm/B,YAAYn/B,KAAKyE,QAAQ07B,cAAc97B,GAAUA,GpBuiM3D,KAAK,GACD,MAAOi7B,GAAYS,OAAO,SAAUT,EAAYK,KAEpD,KAAK,GACL,IAAK,MACD,MAAOL,GAAYjW,SAE5B,KAAMrpB,OoB36MI6F,EAAQ1E,UAyYnBwZ,IAAG,SAACnB,EAAK6mB,EAAOh8B,GpB+iMlB,MAAOg7B,oBAAmBrM,MAAM,SAAcsM,GAC1C,OAAU,OAAQA,EAAYC,KAAOD,EAAYv3B,MAC7C,IAAK,GAMD,MoBtjMZ1D,GAAUA,MACVA,EAAQ+U,OAAS,MACjB/U,EAAQmV,IAAMA,EACdnV,EAAQg8B,MAAQA,EpBkjMJf,EAAYv3B,KAAO,EACZs3B,mBAAmBG,MoBljMzBx/B,KAAK4b,KAAKvX,GpBojMf,KAAK,GACD,MAAOi7B,GAAYS,OAAO,SAAUT,EAAYK,KAEpD,KAAK,GACL,IAAK,MACD,MAAOL,GAAYjW,SAE5B,KAAMrpB,OoBz8MI6F,EAAQ1E,UA0ZnBooB,KAAI,SAAC/P,EAAKnC,EAAMgpB,EAAOh8B,GpB6jMzB,MAAOg7B,oBAAmBrM,MAAM,SAAesM,GAC3C,OAAU,OAAQA,EAAYC,KAAOD,EAAYv3B,MAC7C,IAAK,GAOD,MoBrkMZ1D,GAAUA,MACVA,EAAQ+U,OAAS,OACjB/U,EAAQmV,IAAMA,EACdnV,EAAQg8B,MAAQA,EAChBh8B,EAAQgT,KAAOA,EpBgkMHioB,EAAYv3B,KAAO,EACZs3B,mBAAmBG,MoBhkMzBx/B,KAAK4b,KAAKvX,GpBkkMf,KAAK,GACD,MAAOi7B,GAAYS,OAAO,SAAUT,EAAYK,KAEpD,KAAK,GACL,IAAK,MACD,MAAOL,GAAYjW,SAE5B,KAAMrpB,OoBz+MI6F,EAAQ1E,UA4anBwpC,IAAG,SAACnxB,EAAKnC,EAAMgpB,EAAOh8B,GpB2kMxB,MAAOg7B,oBAAmBrM,MAAM,SAAcsM,GAC1C,OAAU,OAAQA,EAAYC,KAAOD,EAAYv3B,MAC7C,IAAK,GAOD,MoBnlMZ1D,GAAUA,MACVA,EAAQ+U,OAAS,MACjB/U,EAAQmV,IAAMA,EACdnV,EAAQg8B,MAAQA,EAChBh8B,EAAQgT,KAAOA,EpB8kMHioB,EAAYv3B,KAAO,EACZs3B,mBAAmBG,MoB9kMzBx/B,KAAK4b,KAAKvX,GpBglMf,KAAK,GACD,MAAOi7B,GAAYS,OAAO,SAAUT,EAAYK,KAEpD,KAAK,GACL,IAAK,MACD,MAAOL,GAAYjW,SAE5B,KAAMrpB,OoBzgNI6F,EAAQ1E,UA6bnB,UAAQ,SAACqY,EAAK6mB,EAAOh8B,GpBylMvB,MAAOg7B,oBAAmBrM,MAAM,SAAkBsM,GAC9C,OAAU,OAAQA,EAAYC,KAAOD,EAAYv3B,MAC7C,IAAK,GAMD,MoBhmMZ1D,GAAUA,MACVA,EAAQ+U,OAAS,SACjB/U,EAAQmV,IAAMA,EACdnV,EAAQg8B,MAAQA,EpB4lMJf,EAAYv3B,KAAO,EACZs3B,mBAAmBG,MoB5lMzBx/B,KAAK4b,KAAKvX,GpB8lMf,KAAK,GACD,MAAOi7B,GAAYS,OAAO,SAAUT,EAAYK,KAEpD,KAAK,GACL,IAAK,MACD,MAAOL,GAAYjW,SAE5B,KAAMrpB,OoBviNI6F,EAAQ1E,UAqcnBqoC,cAAa,SAACzrB,EAAM1G,GpBsmMtB,MAAOgoB,oBAAmBrM,MAAM,SAAwBsM,GACpD,OAAU,OAAQA,EAAYC,KAAOD,EAAYv3B,MAC7C,IAAK,GAED,MADAu3B,GAAYv3B,KAAO,EACZs3B,mBAAmBG,MoBxmMzBx/B,KAAK4b,MACdpC,IAAKuE,EACLysB,eAAe,EACfnzB,KAAMA,EACN+B,OAAQ,OACRpC,SACI4zB,cAAiB,SAAW5qC,KAAK6qC,UACjCC,eAAgB,uCpB4mMhB,KAAK,GACD,MAAOxL,GAAYS,OAAO,SAAUT,EAAYK,KAEpD,KAAK,GACL,IAAK,MACD,MAAOL,GAAYjW,SAE5B,KAAMrpB,OoBjkNI6F,EAAQ1E,UAodnBwnC,sBAAqB,WpBinMvB,MAAOtJ,oBAAmBrM,MAAM,SAAgCsM,GAC5D,OAAU,OAAQA,EAAYC,KAAOD,EAAYv3B,MAC7C,IAAK,GACD,IoBlnMR/H,KAAK8pC,sBAAqB,CpBmnMdxK,EAAYv3B,KAAO,CACnB,OAGJ,MAAOu3B,GAAYS,OAAO,SoBvnMC,KpBynM/B,KAAK,GAED,MADAT,GAAYv3B,KAAO,EACZs3B,mBAAmBG,MoB1nMzBx/B,KAAK4pC,UpB4nMV,KAAK,GACD,MAAOtK,GAAYS,OAAO,SAAUT,EAAYK,KAEpD,KAAK,GACL,IAAK,MACD,MAAOL,GAAYjW,SAE5B,KAAMrpB,OoB1lNI6F,EAAQ1E,UA2dzB2oC,oBAAmB,WAEf,MAAQ9pC,MAAKonC,MAAM2D,qBAAuB/qC,KAAKknC,OAAO2C,YA7dzChkC,EAAQ1E,UAiezB0pC,QAAO,WACH,GAAIG,GAAShrC,KAAKgnC,QAAU,IAAMhnC,KAAKinC,UACvC,OAAuB,kBAARgE,MAAsBA,KAAKD,GAAU,GAAIE,QAAOF,GAAQ55B,SAAS,WAnenEvL,EAAQ1E,UAsezBspC,YAAW,WACP,GAAIH,GAAQtqC,KAAKonC,MAAMS,aACvB,OAAO7nC,MAAKonC,MAAM+D,aAAeb,EAAQ,IAAMA,EAAQ,KAxe1CzkC,GpB6mNlBhD,EAAiB,WAEpBjD,GAAQ,WoB/mNaiG,EpBgnNrBhG,EAAOD,QAAUA,EAAQ,YAUnB,SAASC,EAAQD,EAASM,GAEhC,YAMA,SAASmB,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAJhH5B,EAAQiB,YAAa,CAErB,IAAIY,GAAe,WAAe,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAIC,GAAI,EAAGA,EAAID,EAAME,OAAQD,IAAK,CAAE,GAAIE,GAAaH,EAAMC,EAAIE,GAAWC,WAAaD,EAAWC,aAAc,EAAOD,EAAWE,cAAe,EAAU,SAAWF,KAAYA,EAAWG,UAAW,GAAMhB,OAAOiB,eAAeR,EAAQI,EAAWd,IAAKc,IAAiB,MAAO,UAAUR,EAAaa,EAAYC,GAAiJ,MAA9HD,IAAYV,EAAiBH,EAAYJ,UAAWiB,GAAiBC,GAAaX,EAAiBH,EAAac,GAAqBd,MAI7hBmB,EAAiBxC,EqB1oNC,GrB4oNlBoC,EAAapC,EqB3oNe,GAEX4F,EAAK,WAKX,QALMA,GAKLP,EAAO6lC,GrBkpNf/pC,EAAgBrB,KqBvpNH8F,GAOb9F,KAAKsE,OAASiB,EACdvF,KAAKmnC,SAAWiE,EAChBprC,KAAKqrC,SAAW,KrB8rNpB,MA3DA5pC,GqB5oNiBqE,EAAK,OrB6oNlB7E,IAAK,gBACLiE,MqB5oNmB,IrB6oNnBlD,YAAY,IAEZf,IAAK,kBACLiE,MqB/oNqB,IrBgpNrBlD,YAAY,KqBnpNC8D,EAAK3E,UAatB0oC,SAAQ,WAEJ,GAAItM,GAAUv9B,KAAKsE,OACf8mC,EAAUprC,KAAKmnC,SACf5jB,EAAOga,EAAQ/I,QAAQ4W,EAE3B,SAAS7nB,GAAQxH,KAAKkR,MAAQQ,SAASlK,GAAQzd,EAAMwlC,iBAnBxCxlC,EAAK3E,UAsBtB4oC,MAAK,WAED,MADA/pC,MAAKsE,OAAOmwB,QAAQz0B,KAAKmnC,SAAUprB,KAAKkR,OACjCjtB,MAxBM8F,EAAK3E,UA2BtBgpC,OAAM,WAEF,MADAnqC,MAAKsE,OAAOw5B,WAAW99B,KAAKmnC,UACrBnnC,MA7BM8F,EAAK3E,UAgCtBuG,KAAI,WrBkpNA,GAAIw2B,GAAQl+B,IqBhpNZ,OAAIA,MAAKqrC,SAAiBrrC,KAAKqrC,UAE/BrrC,KAAKqrC,SAAW,GAAA3oC,GAAA8F,QAAY,SAACC,EAASC,GAElCpG,EAAAoF,KAAK,SAACK,GAEF,MAAIm2B,GAAK2L,WAAmB9hC,KAE5Bm2B,EAAKmN,SAAW,KAEhBnN,EAAKiM,aAEL1hC,GAAQ,QAET3C,EAAMylC,iBAINvrC,KAAKqrC,WApDCvlC,IrB0sNrBlG,GAAQ,WqB1sNakG,ErB2sNrBjG,EAAOD,QAAUA,EAAQ,YAInB,SAASC,EAAQD,GAEvB,YAMA,SAASyB,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAJhH5B,EAAQiB,YAAa,CAErB,IAAIY,GAAe,WAAe,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAIC,GAAI,EAAGA,EAAID,EAAME,OAAQD,IAAK,CAAE,GAAIE,GAAaH,EAAMC,EAAIE,GAAWC,WAAaD,EAAWC,aAAc,EAAOD,EAAWE,cAAe,EAAU,SAAWF,KAAYA,EAAWG,UAAW,GAAMhB,OAAOiB,eAAeR,EAAQI,EAAWd,IAAKc,IAAiB,MAAO,UAAUR,EAAaa,EAAYC,GAAiJ,MAA9HD,IAAYV,EAAiBH,EAAYJ,UAAWiB,GAAiBC,GAAaX,EAAiBH,EAAac,GAAqBd,MsBxtN5gBqE,EAAI,WAKV,QALMA,GAKLL,EAAO6lC,GtBouNf/pC,EAAgBrB,KsBzuNH4F,GAQb5F,KAAKsE,OAASiB,EACdvF,KAAKmnC,SAAWiE,EtB22NpB,MAvJA3pC,GsB7tNiBmE,EAAI,OtB8tNjB3E,IAAK,oBACLiE,MsB7tN8B,ItB+tN9BlD,YAAY,IAEZf,IAAK,kBACLiE,MsBjuNqB,StBkuNrBlD,YAAY,KsBruNC4D,EAAIzE,UAarB0mC,YAAW,WACP,MAAO7nC,MAAKqL,OAAOm4B,cAdN59B,EAAIzE,UAiBrB8oC,aAAY,WACR,MAAOjqC,MAAKqL,OAAOs4B,eAlBN/9B,EAAIzE,UAqBrBgqC,UAAS,WACL,MAAOnrC,MAAKqL,OAAOo4B,YAtBN79B,EAAIzE,UA4BrBkK,KAAI,WAEA,MAAOrL,MAAKsE,OAAOkwB,QAAQx0B,KAAKmnC,YACxB1D,WAAY,GACZD,aAAc,GACdE,WAAY,EACZC,cAAe,GACfC,yBAA0B,IAnCrBh+B,EAAIzE,UA4CrBuoC,QAAO,SAAC8B,GAEJA,EAAUA,KAEV,IAAIngC,GAAOrL,KAAKqL,MAWhB,OATAnK,QAAOoF,KAAKklC,GAASjlC,QAAQ,SAACtF,GAC1BoK,EAAKpK,GAAOuqC,EAAQvqC,KAGxBoK,EAAKogC,YAAc1vB,KAAKkR,MAA2B,IAAlB5hB,EAAKq4B,WACtCr4B,EAAKqgC,0BAA4B3vB,KAAKkR,MAAyC,IAAhC5hB,EAAKu4B,yBAEpD5jC,KAAKsE,OAAOmwB,QAAQz0B,KAAKmnC,SAAU97B,GAE5BrL,MA3DM4F,EAAIzE,UAmErB4pC,iBAAgB,WAEZ,GAAIY,GAAW3rC,KAAKqL,MACpB,OAAQsgC,GAASlI,aAAe79B,EAAKgmC,iBAAoBD,EAASF,YAAc7lC,EAAKimC,kBAAoB9vB,KAAKkR,OAtEjGrnB,EAAIzE,UA8ErB+oC,kBAAiB,WAEb,MAAQlqC,MAAKqL,OAAOqgC,0BAA4B3vB,KAAKkR,OAhFxCrnB,EAAIzE,UAuFrBupC,kBAAiB,WAEb,MAAO1qC,MAAK0pC,SACRlG,aAAc,GACdE,WAAY,KA3FH99B,EAAIzE,UAoGrB2qC,oBAAmB,WAUf,MARA9rC,MAAK0pC,SACDjG,WAAY79B,EAAKgmC,gBACjBpI,aAAc,GACdE,WAAY,EACZC,cAAe,GACfC,yBAA0B,IAGvB5jC,MA9GM4F,EAAIzE,UAsHrBwoC,YAAW,SAACd,GAER,MAAO7oC,MAAK0pC,SAASb,SAAUA,KAxHlBjjC,EAAIzE,UA+HrB0nC,SAAQ,WAEJ,QAAS7oC,KAAKqL,OAAOw9B,UAjIRjjC,ItBu3NrBhG,GAAQ,WsBv3NagG,EtBw3NrB/F,EAAOD,QAAUA,EAAQ,YAInB,SAASC,EAAQD,EAASM,GAEhC,YAIA,SAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAEzF,QAASS,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAJhH5B,EAAQiB,YAAa,CAMrB,IAAIkrC,GAAgB7rC,EuBt4NG,IvBw4NnB8rC,EAAiBrrC,EAAuBorC,GAExCrpC,EAAiBxC,EuBz4NA,GAEAgG,EAAiB,WAEvB,QAFMA,KvB24Nb7E,EAAgBrB,KuB34NHkG,GAGblG,KAAKugB,WAAa7d,EAAAuC,OAAOsb,WvBi5N7B,MuBp5NiBra,GAAiB/E,UAMlC8Z,KAAI,SAAC5W,GACD,MAAO,IAAA2nC,GAAA,WAAe3nC,IAPT6B,IvBu5NrBtG,GAAQ,WuBv5NasG,EvBw5NrBrG,EAAOD,QAAUA,EAAQ,YAInB,SAASC,EAAQD,EAASM,GAEhC,YAIA,SAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAEzF,QAASS,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAEhH,QAAS+8B,GAAUC,EAAUC,GAAc,GAA0B,kBAAfA,IAA4C,OAAfA,EAAuB,KAAM,IAAIj9B,WAAU,iEAAoEi9B,GAAeD,GAASr9B,UAAYD,OAAO8wB,OAAOyM,GAAcA,EAAWt9B,WAAa+M,aAAehJ,MAAOs5B,EAAUx8B,YAAY,EAAOE,UAAU,EAAMD,cAAc,KAAew8B,IAAYv9B,OAAOw9B,eAAiBx9B,OAAOw9B,eAAeF,EAAUC,GAAcD,EAASG,UAAYF,GANje7+B,EAAQiB,YAAa,CAQrB,IAAI+B,GAAkB1C,EwB36NC,IxB66NnB2C,EAAmBlC,EAAuBiC,GAE1CF,EAAiBxC,EwB96NA,GAEA+rC,EAAU,SAAAlN,GAEhB,QAFMkN,GAEL5nC,GxBg7NRhD,EAAgBrB,KwBl7NHisC,GAGblN,EAAAx+B,KAAAP,MACAA,KAAKqE,QAAUA,EACfrE,KAAKugB,WAAa7d,EAAAuC,OAAOsb,WxBk8N7B,MAxBAge,GwB/6NiB0N,EAAUlN,GAAVkN,EAAU9qC,UAQ3Bsd,MAAK,aARYwtB,EAAU9qC,UAU3B2oB,UAAS,SAACzlB,GACNrE,KAAK0V,GAAG,WAAarR,EAAQkH,QAASlH,EAAQmb,UAXjCysB,EAAU9qC,UAc3BuoB,YAAW,SAACrlB,GACRrE,KAAK6V,IAAI,WAAaxR,EAAQkH,UAfjB0gC,EAAU9qC,UAkB3B+qC,eAAc,SAACntB,EAAKxT,GAChBvL,KAAKgW,KAAK,WAAazK,EAASwT,EAAK,MAAOxT,IAnB/B0gC,GxBw8NlBppC,EAAiB,WAEpBjD,GAAQ,WwB18NaqsC,ExB28NrBpsC,EAAOD,QAAUA,EAAQ,YAInB,SAASC,EAAQD,EAASM,GAEhC,YAMA,SAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAEzF,QAASS,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAEhH,QAAS+8B,GAAUC,EAAUC,GAAc,GAA0B,kBAAfA,IAA4C,OAAfA,EAAuB,KAAM,IAAIj9B,WAAU,iEAAoEi9B,GAAeD,GAASr9B,UAAYD,OAAO8wB,OAAOyM,GAAcA,EAAWt9B,WAAa+M,aAAehJ,MAAOs5B,EAAUx8B,YAAY,EAAOE,UAAU,EAAMD,cAAc,KAAew8B,IAAYv9B,OAAOw9B,eAAiBx9B,OAAOw9B,eAAeF,EAAUC,GAAcD,EAASG,UAAYF,GARje7+B,EAAQiB,YAAa,CAErB,IAAIY,GAAe,WAAe,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAIC,GAAI,EAAGA,EAAID,EAAME,OAAQD,IAAK,CAAE,GAAIE,GAAaH,EAAMC,EAAIE,GAAWC,WAAaD,EAAWC,aAAc,EAAOD,EAAWE,cAAe,EAAU,SAAWF,KAAYA,EAAWG,UAAW,GAAMhB,OAAOiB,eAAeR,EAAQI,EAAWd,IAAKc,IAAiB,MAAO,UAAUR,EAAaa,EAAYC,GAAiJ,MAA9HD,IAAYV,EAAiBH,EAAYJ,UAAWiB,GAAiBC,GAAaX,EAAiBH,EAAac,GAAqBd,MAQ7hBqB,EAAkB1C,EyBh+NC,IzBk+NnB2C,EAAmBlC,EAAuBiC,GAE1CE,EAAc5C,EyBn+NC,IzBu+NfoC,GAFe3B,EAAuBmC,GAEzB5C,EyBt+Ne,IAEX6F,EAAY,SAAAg5B,GAelB,QAfMh5B,GAeLf,EAAeK,EAAUE,GzBq+NjClE,EAAgBrB,KyBp/NH+F,GAiBbg5B,EAAAx+B,KAAAP,MzBu+NAA,KyBn/NJ00B,QACIyX,aAAc,eACdC,cAAe,gBACfC,YAAa,cACbC,aAAc,eACdC,WAAY,aACZC,iBAAkB,mBAClBC,eAAgB,kBAOhBzsC,KAAK+E,eAAiBC,EACtBhF,KAAK2E,UAAYU,EACjBrF,KAAKsE,OAASiB,EACdvF,KAAK+I,QAAU,KACf/I,KAAK0sC,SAAW,KAChB1sC,KAAK2sC,iBzBo4OT,MArbApO,GyBv+NiBx4B,EAAYg5B,GzBy+N7Bt9B,EyBz+NiBsE,EAAY,OzB0+NzB9E,IAAK,mBACLiE,MyBz+NsB,KzB0+NtBlD,YAAY,IAEZf,IAAK,gBACLiE,MyB5+NmB,IzB6+NnBlD,YAAY,KyBh/NC+D,EAAY5E,UA+B7ByrC,MAAK,WAED,SAAU5sC,KAAK2sC,cAActsC,IACnBL,KAAK2sC,cAAc3H,cACnBhlC,KAAK2sC,cAAc3H,aAAaI,eAChCplC,KAAK2sC,cAAc3H,aAAaG,SAChCppB,KAAKkR,MAAQjtB,KAAK8kC,mBArCf/+B,EAAY5E,UAyC7B2jC,eAAc,WACV,MAAO,IAAI/oB,MAAK/b,KAAK2sC,cAAc7H,gBAAkB,GAAG7Y,UAAYlmB,EAAa8mC,kBA1CpE9mC,EAAY5E,UA6C7B2rC,gBAAe,SAACC;AAYZ,MAVAA,GAAeA,MAEf/sC,KAAKgtC,gBAELhtC,KAAK2sC,cAAgBI,EAEhB/sC,KAAK+I,SAAS/I,KAAKitC,qBAExBjtC,KAAKktC,cAEEltC,MAzDM+F,EAAY5E,UA6D7B4rC,aAAY,WACR,MAAO/sC,MAAK2sC,eA9DC5mC,EAAY5E,UAsEvBgsC,SAAQ,SAAC9oC,GzB4/NX,MAAOg7B,oBAAmBrM,MAAM,SAAmBsM,GAC/C,OAAU,OAAQA,EAAYC,KAAOD,EAAYv3B,MAC7C,IAAK,GACD,IyB7/NR/H,KAAK4sC,QAAO,CzB8/NAtN,EAAYv3B,KAAO,CACnB,OAIJ,MADAu3B,GAAYv3B,KAAO,EACZs3B,mBAAmBG,MyBlgOrBx/B,KAAKotC,MAAM/oC,GzBogOpB,KAAK,GACD,MAAOi7B,GAAYS,OAAO,SAAUT,EAAYK,KAEpD,KAAK,GAED,MADAL,GAAYv3B,KAAO,EACZs3B,mBAAmBG,MyBvgOrBx/B,KAAK8pB,UAAUzlB,GzBygOxB,KAAK,GACD,MAAOi7B,GAAYS,OAAO,SAAUT,EAAYK,KAEpD,KAAK,GACL,IAAK,MACD,MAAOL,GAAYjW,SAE5B,KAAMrpB,OyB3lOI+F,EAAY5E,UAgF7B0jC,aAAY,WACR,MAAO7kC,MAAK2sC,cAAc9H,kBAjFb9+B,EAAY5E,UAwF7BksC,gBAAe,SAAC3Y,GAEZ,MADA10B,MAAKstC,gBAAgBttC,KAAK6kC,eAAe/vB,OAAO4f,IACzC10B,MA1FM+F,EAAY5E,UAiG7BmsC,gBAAe,SAAC5Y,GAEZ,MADA10B,MAAK2sC,cAAc9H,aAAenQ,EAC3B10B,MAnGM+F,EAAY5E,UA0GvB2oB,UAAS,SAACzlB,GzBkhOZ,GyBtgOQiX,GAMAtC,CzBigOR,OAAOqmB,oBAAmBrM,MAAM,SAAoBsM,GAChD,OAAU,OAAQA,EAAYC,KAAOD,EAAYv3B,MAC7C,IAAK,GASD,GARAu3B,EAAYC,KAAO,EyBlhO3Bl7B,EAAUA,MAENA,EAAQqwB,QAAQ10B,KAAKstC,gBAAgBjpC,EAAQqwB,QAEjD10B,KAAKgtC,gBAEAhtC,KAAK6kC,eAAe/iC,OAAM,CzBqhOnBw9B,EAAYv3B,KAAO,CACnB,OAGJ,KyBzhO+B,IAAImE,OAAM,uBzB2hO7C,KAAK,GAED,MADAozB,GAAYv3B,KAAO,EACZs3B,mBAAmBG,MyB3hObx/B,KAAK2E,UAAU4kB,KAAK,8BACjCsb,aAAc7kC,KAAKutC,uBACnBvI,cACIC,cAAe,YzB+hOvB,KAAK,GAMD,MyBxiOJ3pB,GAAQgkB,EAAAK,KAMR3mB,EAAOsC,EAAStC,OAEpBhZ,KAAK8sC,gBAAgB9zB,GAChBhD,KAAKhW,KAAK00B,OAAO8X,iBAAkBlxB,GzB+hOzBgkB,EAAYS,OAAO,SyB7hO3BzkB,EzB+hOH,KAAK,IAQD,KAPAgkB,GAAYC,KAAO,GACnBD,EAAYU,GAAKV,EAAY,SAAS,GyB5hO9CA,EAAAU,GAAIhgC,KAAK2E,UAAUD,SAASu7B,UAASX,EAAAU,IAErChgC,KAAK23B,QACA3hB,KAAKhW,KAAK00B,OAAO+X,eAAcnN,EAAAU,IzB+hOtBV,EAAYU,EAEtB,KAAK,IACL,IAAK,MACD,MAAOV,GAAYjW,SAE5B,KAAMrpB,OAAQ,EAAG,OyB9qOP+F,EAAY5E,UAqJvBisC,MAAK,SAAC/oC,GzBkiOR,GyBphOQiX,GAIAtC,CzBihOR,OAAOqmB,oBAAmBrM,MAAM,SAAgBsM,GAC5C,OAAU,OAAQA,EAAYC,KAAOD,EAAYv3B,MAC7C,IAAK,GASD,GARAu3B,EAAYC,KAAO,EyBliO3Bl7B,EAAUA,MAENA,EAAQqwB,QAAQ10B,KAAKstC,gBAAgBjpC,EAAQqwB,QAEjD10B,KAAKgtC,gBAEAhtC,KAAK4sC,QAAO,CzBqiOLtN,EAAYv3B,KAAO,CACnB,OAGJ,KyBziOiB,IAAImE,OAAM,4BzB2iO/B,KAAK,GACD,GyB1iOHlM,KAAK6kC,eAAe/iC,OAAM,CzB2iOnBw9B,EAAYv3B,KAAO,CACnB,OAGJ,KyB/iO+B,IAAImE,OAAM,uBzBijO7C,KAAK,GAED,MADAozB,GAAYv3B,KAAO,GACZs3B,mBAAmBG,MyBjjObx/B,KAAK2E,UAAUgmC,IAAI,8BAAgC3qC,KAAK2sC,cAActsC,IACvFwkC,aAAc7kC,KAAKutC,yBzBojOnB,KAAK,IAMD,MyB3jOJjyB,GAAQgkB,EAAAK,KAIR3mB,EAAOsC,EAAStC,OAEpBhZ,KAAK8sC,gBAAgB9zB,GAChBhD,KAAKhW,KAAK00B,OAAO4X,aAAchxB,GzBojOrBgkB,EAAYS,OAAO,SyBljO3BzkB,EzBojOH,KAAK,IAQD,KAPAgkB,GAAYC,KAAO,GACnBD,EAAYU,GAAKV,EAAY,SAAS,GyBljO9CA,EAAAU,GAAIhgC,KAAK2E,UAAUD,SAASu7B,UAASX,EAAAU,IAErChgC,KAAK23B,QACA3hB,KAAKhW,KAAK00B,OAAO6X,WAAUjN,EAAAU,IzBqjOlBV,EAAYU,EAEtB,KAAK,IACL,IAAK,MACD,MAAOV,GAAYjW,SAE5B,KAAMrpB,OAAQ,EAAG,OyB9uOP+F,EAAY5E,UA8LvBqsC,OAAM,WzBwjOR,GyBljOQlyB,EzBmjOR,OAAO+jB,oBAAmBrM,MAAM,SAAiBsM,GAC7C,OAAU,OAAQA,EAAYC,KAAOD,EAAYv3B,MAC7C,IAAK,GAGD,GAFAu3B,EAAYC,KAAO,EyBxjOtBv/B,KAAK4sC,QAAO,CzB2jOLtN,EAAYv3B,KAAO,CACnB,OAGJ,KyB/jOiB,IAAImE,OAAM,4BzBikO/B,KAAK,GAED,MADAozB,GAAYv3B,KAAO,EACZs3B,mBAAmBG,MyBjkObx/B,KAAK2E,UAAS,UAAQ,8BAAgC3E,KAAK2sC,cAActsC,IzBmkO1F,KAAK,GAKD,MyBxkOJib,GAAQgkB,EAAAK,KAEZ3/B,KAAK23B,QACA3hB,KAAKhW,KAAK00B,OAAO0X,cAAe9wB,GzBqkOtBgkB,EAAYS,OAAO,SyBnkO3BzkB,EzBqkOH,KAAK,IAQD,KAPAgkB,GAAYC,KAAO,GACnBD,EAAYU,GAAKV,EAAY,SAAS,GyBnkO9CA,EAAAU,GAAIhgC,KAAK2E,UAAUD,SAASu7B,UAASX,EAAAU,IAErChgC,KAAKgW,KAAKhW,KAAK00B,OAAO2X,YAAW/M,EAAAU,IzBukOnBV,EAAYU,EAEtB,KAAK,IACL,IAAK,MACD,MAAOV,GAAYjW,SAE5B,KAAMrpB,OAAQ,EAAG,OyB5xOP+F,EAAY5E,UA2N7Bw2B,MAAK,WAID,MAHA33B,MAAKgtC,gBACDhtC,KAAK4sC,SAAW5sC,KAAK+I,SAAS/I,KAAK+I,QAAQ2gB,aAAane,QAASvL,KAAK2sC,cAAc3H,aAAaG,UACrGnlC,KAAK2sC,iBACE3sC,MA/NM+F,EAAY5E,UAwO7BssC,iBAAgB,SAACC,EAAUhZ,GzB2kOvB,GAAIwJ,GAAQl+B,IyBzkOZA,MAAK0V,IAAI1V,KAAK00B,OAAO8X,iBAAkBxsC,KAAK00B,OAAO4X,cAAe,WAE9DpO,EAAK55B,OAAOmwB,QAAQiZ,EAAUxP,EAAK6O,kBAIvC/sC,KAAK0V,GAAG1V,KAAK00B,OAAO6X,WAAY,WAE5BrO,EAAKvG,QACA2V,gBAAgB5Y,GAChByY,YAIT,IAAIQ,GAAyB3tC,KAAKsE,OAAOkwB,QAAQkZ,EAEjD,IAAIC,EACA,IACI3tC,KAAK8sC,gBAAgBa,GACvB,MAAO1hC,QAETjM,MAAKstC,gBAAgB5Y,EAGzB,OAAO10B,OAlQM+F,EAAY5E,UAsQ7BosC,qBAAoB,WzBukOhB,GAAIpP,GAASn+B,IyBrkOb,OAAOA,MAAK6kC,eAAe5tB,IAAI,SAACia,GAC5B,MAAOiN,GAAKx5B,UAAU0iC,UAAUnW,MAzQvBnrB,EAAY5E,UA8Q7B+rC,YAAW,WzBukOP,GAAI5O,GAASt+B,IyBnkOb,IAFAA,KAAKgtC,iBAEAhtC,KAAK4sC,QAAS,KAAM,IAAI1gC,OAAM,4BAUnC,OARA5J,GAAAoF,KAAK,SAACK,GAEF,MAAIu2B,GAAKsO,QAAgB7kC,QAEzBu2B,GAAK8O,SAENrnC,EAAawlC,cAAevrC,KAAK0sC,UAE7B1sC,MA5RM+F,EAAY5E,UAgS7B6rC,cAAa,WAIT,MAFA1qC,GAAAwF,YAAY9H,KAAK0sC,UAEV1sC,MApSM+F,EAAY5E,UAwS7BysC,SAAQ,SAACpuB,GAEL,IAAKxf,KAAK4sC,QAAS,KAAM,IAAI1gC,OAAM,4BAEnC,IAAIlM,KAAK2sC,cAAc3H,aAAaU,cAAe,CAE/C,GAAIzgC,GAASjF,KAAK+E,cAElBya,GAAUva,EAAOsb,WAAWE,QAAQjB,EAASxf,KAAK2sC,cAAc3H,aAAaU,eACzE1X,YAAY,EACZC,YAAa,SACbC,UAAW,IACXxU,KAAM,QAKd,MAAO8F,IAzTMzZ,EAAY5E,UA6T7B0sC,QAAO,SAACruB,GAIJ,MAFAxf,MAAKgW,KAAKhW,KAAK00B,OAAOyX,aAAcnsC,KAAK4tC,SAASpuB,IAE3Cxf,MAjUM+F,EAAY5E,UAqU7B8rC,mBAAkB,WAEd,IAAKjtC,KAAK4sC,QAAS,KAAM,IAAI1gC,OAAM,4BAEnC,IAAIjH,GAASjF,KAAK+E,cAelB,OAbA/E,MAAK+I,QAAU9D,EAAOgW,MAClBsa,KAAK,EACLD,cAAet1B,KAAK2sC,cAAc3H,aAAaI,gBAGnDplC,KAAK+I,QAAQ0V,QAEbze,KAAK+I,QAAQ+gB,WACTve,QAASvL,KAAK2sC,cAAc3H,aAAaG,QACzC3lB,QAASxf,KAAK6tC,QAAQ9c,KAAK/wB,MAC3B4e,QAAS,eAGN5e,MAxVM+F,GzB65OlBlD,EAAiB,WAEpBjD,GAAQ,WyB/5OamG,EzBg6OrBlG,EAAOD,QAAUA,EAAQ,YAInB,SAASC,EAAQD,I0Bx6OvB,SAAA2J,IAUA,SAAAA,GACA,YAwBA,SAAAukC,GAAAC,EAAAC,EAAA/8B,EAAAg9B,GAEA,GAAAC,GAAAhtC,OAAA8wB,QAAAgc,GAAAG,GAAAhtC,WACAitC,EAAA,GAAAC,GAAAJ,MAMA,OAFAC,GAAAI,QAAAC,EAAAR,EAAA98B,EAAAm9B,GAEAF,EAcA,QAAAM,GAAA7mC,EAAA/G,EAAAuG,GACA,IACA,OAAcmT,KAAA,SAAAnT,IAAAQ,EAAApH,KAAAK,EAAAuG,IACT,MAAAgZ,GACL,OAAc7F,KAAA,QAAAnT,IAAAgZ,IAiBd,QAAAguB,MACA,QAAAM,MACA,QAAAC,MASA,QAAAC,GAAAxtC,IACA,OAAA,QAAA,UAAAoF,QAAA,SAAA6S,GACAjY,EAAAiY,GAAA,SAAAjS,GACA,MAAAnH,MAAAsuC,QAAAl1B,EAAAjS,MAkCA,QAAAynC,GAAAznC,GACAnH,KAAAmH,IAAAA,EAGA,QAAA0nC,GAAAX,GAGA,QAAAY,GAAA11B,EAAAjS,GACA,GAAA0L,GAAAq7B,EAAA90B,GAAAjS,GACAjC,EAAA2N,EAAA3N,KACA,OAAAA,aAAA0pC,GACApmC,QAAAC,QAAAvD,EAAAiC,KAAAwF,KAAAoiC,EAAAC,GACAxmC,QAAAC,QAAAvD,GAAAyH,KAAA,SAAAsiC,GAiBA,MADAp8B,GAAA3N,MAAA+pC,EACAp8B,IAaA,QAAAq8B,GAAA91B,EAAAjS,GACA,QAAAgoC,KACA,MAAAL,GAAA11B,EAAAjS,GAGA,MAAAioC,GAaAA,EAAAA,EAAAziC,KACAwiC,EAGAA,GACA,GAAA3mC,SAAA,SAAAC,GACAA,EAAA0mC,OAjCA,gBAAA/mC,UAAAA,QAAAinC,SACAP,EAAA1mC,QAAAinC,OAAAte,KAAA+d,GAGA,IAGAM,GAHAL,EAAAD,EAAA/d,KAAAmd,EAAA,QACAc,EAAAF,EAAA/d,KAAAmd,EAAA,QACAY,GAAA/d,KAAAmd,EAAA,SAiCAluC,MAAAsuC,QAAAY,EAoBA,QAAAX,GAAAR,EAAA98B,EAAAm9B,GACA,GAAAh8B,GAAAk9B,CAEA,OAAA,UAAAl2B,EAAAjS,GACA,GAAAiL,IAAAm9B,EACA,KAAA,IAAArjC,OAAA,+BAGA,IAAAkG,IAAAo9B,EAAA,CACA,GAAA,UAAAp2B,EACA,KAAAjS,EAKA,OAAAsoC,KAGA,OAAA,CACA,GAAAC,GAAAtB,EAAAsB,QACA,IAAAA,EAAA,CACA,GAAA,WAAAt2B,GACA,UAAAA,GAAAs2B,EAAAC,SAAAv2B,KAAAtN,EAAA,CAGAsiC,EAAAsB,SAAA,IAIA,IAAAE,GAAAF,EAAAC,SAAA,SACA,IAAAC,EAAA,CACA,GAAAC,GAAArB,EAAAoB,EAAAF,EAAAC,SAAAxoC,EACA,IAAA,UAAA0oC,EAAAv1B,KAAA,CAGAlB,EAAA,QACAjS,EAAA0oC,EAAA1oC,GACA,WAIA,GAAA,WAAAiS,EAGA,SAIA,GAAAy2B,GAAArB,EACAkB,EAAAC,SAAAv2B,GACAs2B,EAAAC,SACAxoC,EAGA,IAAA,UAAA0oC,EAAAv1B,KAAA,CACA8zB,EAAAsB,SAAA,KAIAt2B,EAAA,QACAjS,EAAA0oC,EAAA1oC,GACA,UAMAiS,EAAA,OACAjS,EAAA2E,CAEA,IAAAgkC,GAAAD,EAAA1oC,GACA,KAAA2oC,EAAArd,KAKA,MADArgB,GAAA29B,EACAD,CAJA1B,GAAAsB,EAAAM,YAAAF,EAAA5qC,MACAkpC,EAAArmC,KAAA2nC,EAAAO,QAMA7B,EAAAsB,SAAA,KAGA,GAAA,SAAAt2B,EACAhH,IAAA29B,EACA3B,EAAAzO,KAAAx4B,EAEAinC,EAAAzO,KAAA7zB,MAGS,IAAA,UAAAsN,EAAA,CACT,GAAAhH,IAAAk9B,EAEA,KADAl9B,GAAAo9B,EACAroC,CAGAinC,GAAA8B,kBAAA/oC,KAGAiS,EAAA,OACAjS,EAAA2E,OAGS,WAAAsN,GACTg1B,EAAArO,OAAA,SAAA54B,EAGAiL,GAAAm9B,CAEA,IAAAM,GAAArB,EAAAT,EAAA98B,EAAAm9B,EACA,IAAA,WAAAyB,EAAAv1B,KAAA,CAGAlI,EAAAg8B,EAAA3b,KACA+c,EACAO,CAEA,IAAAD,IACA5qC,MAAA2qC,EAAA1oC,IACAsrB,KAAA2b,EAAA3b,KAGA,IAAAod,EAAA1oC,MAAAgpC,EAOA,MAAAL,EANA1B,GAAAsB,UAAA,SAAAt2B,IAGAjS,EAAA2E,OAMS,UAAA+jC,EAAAv1B,OACTlI,EAAAo9B,EAGAp2B,EAAA,QACAjS,EAAA0oC,EAAA1oC,OAkBA,QAAAipC,GAAAC,GACA,GAAAp+B,IAAiBq+B,OAAAD,EAAA,GAEjB,KAAAA,KACAp+B,EAAAs+B,SAAAF,EAAA,IAGA,IAAAA,KACAp+B,EAAAu+B,WAAAH,EAAA,GACAp+B,EAAAw+B,SAAAJ,EAAA,IAGArwC,KAAA0wC,WAAA9pC,KAAAqL,GAGA,QAAA0+B,GAAA1+B,GACA,GAAA49B,GAAA59B,EAAA2+B,cACAf,GAAAv1B,KAAA,eACAu1B,GAAA1oC,IACA8K,EAAA2+B,WAAAf,EAGA,QAAAxB,GAAAJ,GAIAjuC,KAAA0wC,aAAwBJ,OAAA,SACxBrC,EAAA1nC,QAAA6pC,EAAApwC,MACAA,KAAA23B,OAAA,GA8BA,QAAA/c,GAAAi2B,GACA,GAAAA,EAAA,CACA,GAAAC,GAAAD,EAAAE,EACA,IAAAD,EACA,MAAAA,GAAAvwC,KAAAswC,EAGA,IAAA,kBAAAA,GAAA9oC,KACA,MAAA8oC,EAGA,KAAAG,MAAAH,EAAA/uC,QAAA,CACA,GAAAD,GAAA,GAAAkG,EAAA,QAAAA,KACA,OAAAlG,EAAAgvC,EAAA/uC,QACA,GAAAmvC,EAAA1wC,KAAAswC,EAAAhvC,GAGA,MAFAkG,GAAA7C,MAAA2rC,EAAAhvC,GACAkG,EAAA0qB,MAAA,EACA1qB,CAOA,OAHAA,GAAA7C,MAAA4G,EACA/D,EAAA0qB,MAAA,EAEA1qB,EAGA,OAAAA,GAAAA,KAAAA,GAKA,OAAYA,KAAA0nC,GAIZ,QAAAA,KACA,OAAYvqC,MAAA4G,EAAA2mB,MAAA,GAvcZ,GACA3mB,GADAmlC,EAAA/vC,OAAAC,UAAAC,eAEA2vC,EACA,kBAAAG,SAAAA,OAAAvB,UAAA,aAEAwB,EAAA,gBAAAtxC,GACAuxC,EAAA7nC,EAAA81B,kBACA,IAAA+R,EAQA,YAPAD,IAGAtxC,EAAAD,QAAAwxC,GASAA,GAAA7nC,EAAA81B,mBAAA8R,EAAAtxC,EAAAD,WAaAwxC,EAAAtD,KAAAA,CAoBA,IAAAwB,GAAA,iBACAS,EAAA,iBACAR,EAAA,YACAC,EAAA,YAIAW,KAUAkB,EAAA3C,EAAAvtC,UAAAgtC,EAAAhtC,SACAstC,GAAAttC,UAAAkwC,EAAAnjC,YAAAwgC,EACAA,EAAAxgC,YAAAugC,EACAA,EAAA6C,YAAA,oBAYAF,EAAAG,oBAAA,SAAAC,GACA,GAAAC,GAAA,kBAAAD,IAAAA,EAAAtjC,WACA,OAAAujC,GACAA,IAAAhD,GAGA,uBAAAgD,EAAAH,aAAAG,EAAAv7B,OACA,GAGAk7B,EAAAM,KAAA,SAAAF,GAOA,MANAtwC,QAAAw9B,eACAx9B,OAAAw9B,eAAA8S,EAAA9C,GAEA8C,EAAA7S,UAAA+P,EAEA8C,EAAArwC,UAAAD,OAAA8wB,OAAAqf,GACAG,GAQAJ,EAAA5R,MAAA,SAAAr4B,GACA,MAAA,IAAAynC,GAAAznC,IA8EAwnC,EAAAE,EAAA1tC,WAKAiwC,EAAApe,MAAA,SAAA+a,EAAAC,EAAA/8B,EAAAg9B,GACA,GAAA0D,GAAA,GAAA9C,GACAf,EAAAC,EAAAC,EAAA/8B,EAAAg9B,GAGA,OAAAmD,GAAAG,oBAAAvD,GACA2D,EACAA,EAAA5pC,OAAA4E,KAAA,SAAAkG,GACA,MAAAA,GAAA4f,KAAA5f,EAAA3N,MAAAysC,EAAA5pC,UAoJA4mC,EAAA0C,GAEAA,EAAAN,GAAA,WACA,MAAA/wC,OAGAqxC,EAAAjgC,SAAA,WACA,MAAA,sBAkCAggC,EAAA9qC,KAAA,SAAAkK,GACA,GAAAlK,KACA,KAAA,GAAArF,KAAAuP,GACAlK,EAAAM,KAAA3F,EAMA,OAJAqF,GAAAkiB,UAIA,QAAAzgB,KACA,KAAAzB,EAAAxE,QAAA,CACA,GAAAb,GAAAqF,EAAAy7B,KACA,IAAA9gC,IAAAuP,GAGA,MAFAzI,GAAA7C,MAAAjE,EACA8G,EAAA0qB,MAAA,EACA1qB,EAQA,MADAA,GAAA0qB,MAAA,EACA1qB,IAsCAqpC,EAAAx2B,OAAAA,EAMAyzB,EAAAltC,WACA+M,YAAAmgC,EAEA1W,MAAA,SAAAia,GASA,GARA5xC,KAAAu/B,KAAA,EACAv/B,KAAA+H,KAAA,EACA/H,KAAA2/B,KAAA7zB,EACA9L,KAAAyyB,MAAA,EACAzyB,KAAA0vC,SAAA,KAEA1vC,KAAA0wC,WAAAnqC,QAAAoqC,IAEAiB,EACA,IAAA,GAAA17B,KAAAlW,MAEA,MAAAkW,EAAAujB,OAAA,IACAwX,EAAA1wC,KAAAP,KAAAkW,KACA86B,OAAA96B,EAAA1C,MAAA,MACAxT,KAAAkW,GAAApK,IAMAud,KAAA,WACArpB,KAAAyyB,MAAA,CAEA,IAAAof,GAAA7xC,KAAA0wC,WAAA,GACAoB,EAAAD,EAAAjB,UACA,IAAA,UAAAkB,EAAAx3B,KACA,KAAAw3B,GAAA3qC,GAGA,OAAAnH,MAAA+xC,MAGA7B,kBAAA,SAAA8B,GAMA,QAAAC,GAAAC,EAAAC,GAIA,MAHAtC,GAAAv1B,KAAA,QACAu1B,EAAA1oC,IAAA6qC,EACA5D,EAAArmC,KAAAmqC,IACAC,EATA,GAAAnyC,KAAAyyB,KACA,KAAAuf,EAWA,KAAA,GARA5D,GAAApuC,KAQA6B,EAAA7B,KAAA0wC,WAAA5uC,OAAA,EAA8CD,GAAA,IAAQA,EAAA,CACtD,GAAAoQ,GAAAjS,KAAA0wC,WAAA7uC,GACAguC,EAAA59B,EAAA2+B,UAEA,IAAA,SAAA3+B,EAAAq+B,OAIA,MAAA2B,GAAA,MAGA,IAAAhgC,EAAAq+B,QAAAtwC,KAAAu/B,KAAA,CACA,GAAA6S,GAAAnB,EAAA1wC,KAAA0R,EAAA,YACAogC,EAAApB,EAAA1wC,KAAA0R,EAAA,aAEA,IAAAmgC,GAAAC,EAAA,CACA,GAAAryC,KAAAu/B,KAAAttB,EAAAs+B,SACA,MAAA0B,GAAAhgC,EAAAs+B,UAAA,EACa,IAAAvwC,KAAAu/B,KAAAttB,EAAAu+B,WACb,MAAAyB,GAAAhgC,EAAAu+B,gBAGW,IAAA4B,GACX,GAAApyC,KAAAu/B,KAAAttB,EAAAs+B,SACA,MAAA0B,GAAAhgC,EAAAs+B,UAAA,OAGW,CAAA,IAAA8B,EAMX,KAAA,IAAAnmC,OAAA,yCALA,IAAAlM,KAAAu/B,KAAAttB,EAAAu+B,WACA,MAAAyB,GAAAhgC,EAAAu+B,gBAUAzQ,OAAA,SAAAzlB,EAAAnT,GACA,IAAA,GAAAtF,GAAA7B,KAAA0wC,WAAA5uC,OAAA,EAA8CD,GAAA,IAAQA,EAAA,CACtD,GAAAoQ,GAAAjS,KAAA0wC,WAAA7uC,EACA,IAAAoQ,EAAAq+B,QAAAtwC,KAAAu/B,MACA0R,EAAA1wC,KAAA0R,EAAA,eACAjS,KAAAu/B,KAAAttB,EAAAu+B,WAAA,CACA,GAAA8B,GAAArgC,CACA,QAIAqgC,IACA,UAAAh4B,GACA,aAAAA,IACAg4B,EAAAhC,QAAAnpC,GACAA,GAAAmrC,EAAA9B,aAGA8B,EAAA,KAGA,IAAAzC,GAAAyC,EAAAA,EAAA1B,aAUA,OATAf,GAAAv1B,KAAAA,EACAu1B,EAAA1oC,IAAAA,EAEAmrC,EACAtyC,KAAA+H,KAAAuqC,EAAA9B,WAEAxwC,KAAA+yB,SAAA8c,GAGAM,GAGApd,SAAA,SAAA8c,EAAAY,GACA,GAAA,UAAAZ,EAAAv1B,KACA,KAAAu1B,GAAA1oC,GAGA,WAAA0oC,EAAAv1B,MACA,aAAAu1B,EAAAv1B,KACAta,KAAA+H,KAAA8nC,EAAA1oC,IACO,WAAA0oC,EAAAv1B,MACPta,KAAA+xC,KAAAlC,EAAA1oC,IACAnH,KAAA+H,KAAA,OACO,WAAA8nC,EAAAv1B,MAAAm2B,IACPzwC,KAAA+H,KAAA0oC,IAIA8B,OAAA,SAAA/B,GACA,IAAA,GAAA3uC,GAAA7B,KAAA0wC,WAAA5uC,OAAA,EAA8CD,GAAA,IAAQA,EAAA,CACtD,GAAAoQ,GAAAjS,KAAA0wC,WAAA7uC,EACA,IAAAoQ,EAAAu+B,aAAAA,EAGA,MAFAxwC,MAAA+yB,SAAA9gB,EAAA2+B,WAAA3+B,EAAAw+B,UACAE,EAAA1+B,GACAk+B,IAKAp9B,QAAA,SAAAu9B,GACA,IAAA,GAAAzuC,GAAA7B,KAAA0wC,WAAA5uC,OAAA,EAA8CD,GAAA,IAAQA,EAAA,CACtD,GAAAoQ,GAAAjS,KAAA0wC,WAAA7uC,EACA,IAAAoQ,EAAAq+B,SAAAA,EAAA,CACA,GAAAT,GAAA59B,EAAA2+B,UACA,IAAA,UAAAf,EAAAv1B,KAAA,CACA,GAAAk4B,GAAA3C,EAAA1oC,GACAwpC,GAAA1+B,GAEA,MAAAugC,IAMA,KAAA,IAAAtmC,OAAA,0BAGAumC,cAAA,SAAA5B,EAAAb,EAAAC,GAOA,MANAjwC,MAAA0vC,UACAC,SAAA/0B,EAAAi2B,GACAb,WAAAA,EACAC,QAAAA,GAGAE,KAOA,gBAAA5mC,GAAAA,EACA,gBAAAjB,QAAAA,OACA,gBAAA2I,MAAAA,KAAAjR,Q1B66O6BO,KAAKX,EAAU,WAAa,MAAOI","file":"ringcentral-bundle.min.js","sourcesContent":["(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[\"SDK\"] = factory();\n\telse\n\t\troot[\"RingCentral\"] = root[\"RingCentral\"] || {}, root[\"RingCentral\"][\"SDK\"] = factory();\n})(this, function() {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/","(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[\"SDK\"] = factory();\n\telse\n\t\troot[\"RingCentral\"] = root[\"RingCentral\"] || {}, root[\"RingCentral\"][\"SDK\"] = 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 = \"/build/\";\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\nmodule.exports = __webpack_require__(1);\n\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _coreUtils = __webpack_require__(2);\n\nvar Utils = _interopRequireWildcard(_coreUtils);\n\nvar _coreCache = __webpack_require__(11);\n\nvar _coreCache2 = _interopRequireDefault(_coreCache);\n\nvar _coreExternals = __webpack_require__(3);\n\nvar Externals = _interopRequireWildcard(_coreExternals);\n\nvar _coreObservable = __webpack_require__(12);\n\nvar _coreObservable2 = _interopRequireDefault(_coreObservable);\n\nvar _httpClient = __webpack_require__(13);\n\nvar _httpClient2 = _interopRequireDefault(_httpClient);\n\nvar _httpApiResponse = __webpack_require__(15);\n\nvar _httpApiResponse2 = _interopRequireDefault(_httpApiResponse);\n\nvar _httpUtils = __webpack_require__(14);\n\nvar HttpUtils = _interopRequireWildcard(_httpUtils);\n\nvar _mocksClientMock = __webpack_require__(16);\n\nvar _mocksClientMock2 = _interopRequireDefault(_mocksClientMock);\n\nvar _mocksMock = __webpack_require__(18);\n\nvar _mocksMock2 = _interopRequireDefault(_mocksMock);\n\nvar _mocksRegistry = __webpack_require__(17);\n\nvar _mocksRegistry2 = _interopRequireDefault(_mocksRegistry);\n\nvar _platformPlatform = __webpack_require__(19);\n\nvar _platformPlatform2 = _interopRequireDefault(_platformPlatform);\n\nvar _platformAuth = __webpack_require__(21);\n\nvar _platformAuth2 = _interopRequireDefault(_platformAuth);\n\nvar _platformQueue = __webpack_require__(20);\n\nvar _platformQueue2 = _interopRequireDefault(_platformQueue);\n\nvar _pubnubPubnubFactory = __webpack_require__(22);\n\nvar _pubnubPubnubFactory2 = _interopRequireDefault(_pubnubPubnubFactory);\n\nvar _subscriptionSubscription = __webpack_require__(24);\n\nvar _subscriptionSubscription2 = _interopRequireDefault(_subscriptionSubscription);\n\n__webpack_require__(25);\n\nvar SDK = (function () {\n _createClass(SDK, null, [{\n key: 'version',\n value: '2.0.0',\n enumerable: true\n }, {\n key: 'server',\n value: {\n sandbox: 'https://platform.devtest.ringcentral.com',\n production: 'https://platform.ringcentral.com'\n },\n\n /**\n * @constructor\n * @param {object} [options]\n * @param {string} [options.server]\n * @param {string} [options.cachePrefix]\n * @param {string} [options.appSecret]\n * @param {string} [options.appKey]\n * @param {string} [options.appName]\n * @param {string} [options.appVersion]\n * @param {string} [options.pubnubFactory]\n * @param {string} [options.client]\n */\n enumerable: true\n }]);\n\n function SDK(options) {\n _classCallCheck(this, SDK);\n\n options = options || {};\n\n this._cache = new _coreCache2['default'](Externals.localStorage, options.cachePrefix);\n\n this._client = options.client || new _httpClient2['default']();\n\n this._platform = new _platformPlatform2['default'](this._client, this._cache, options.server, options.appKey, options.appSecret);\n\n this._pubnubFactory = options.pubnubFactory || Externals.PUBNUB;\n }\n\n /**\n * @return {Platform}\n */\n\n SDK.prototype.platform = function platform() {\n return this._platform;\n };\n\n /**\n * @return {Subscription}\n */\n\n SDK.prototype.createSubscription = function createSubscription() {\n return new _subscriptionSubscription2['default'](this._pubnubFactory, this._platform, this._cache);\n };\n\n /**\n * @return {Cache}\n */\n\n SDK.prototype.cache = function cache() {\n return this._cache;\n };\n\n _createClass(SDK, null, [{\n key: 'core',\n value: {\n Cache: _coreCache2['default'],\n Observable: _coreObservable2['default'],\n Utils: Utils,\n Externals: Externals\n },\n enumerable: true\n }, {\n key: 'http',\n value: {\n Client: _httpClient2['default'],\n ApiResponse: _httpApiResponse2['default'],\n Utils: HttpUtils\n },\n enumerable: true\n }, {\n key: 'platform',\n value: {\n Auth: _platformAuth2['default'],\n Platform: _platformPlatform2['default'],\n Queue: _platformQueue2['default']\n },\n enumerable: true\n }, {\n key: 'subscription',\n value: {\n Subscription: _subscriptionSubscription2['default']\n },\n enumerable: true\n }, {\n key: 'mocks',\n value: {\n Client: _mocksClientMock2['default'],\n Registry: _mocksRegistry2['default'],\n Mock: _mocksMock2['default']\n },\n enumerable: true\n }, {\n key: 'pubnub',\n value: {\n PubnubMockFactory: _pubnubPubnubFactory2['default']\n },\n enumerable: true\n }]);\n\n return SDK;\n})();\n\nexports['default'] = SDK;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\nexports.queryStringify = queryStringify;\nexports.parseQueryString = parseQueryString;\nexports.isFunction = isFunction;\nexports.isArray = isArray;\nexports.poll = poll;\nexports.stopPolling = stopPolling;\nexports.isNodeJS = isNodeJS;\nexports.isBrowser = isBrowser;\nexports.delay = delay;\n\nvar _ExternalsJs = __webpack_require__(3);\n\n/**\n * TODO Replace with something better\n * @see https://github.com/joyent/node/blob/master/lib/querystring.js\n * @param {object} parameters\n * @returns {string}\n */\n\nfunction queryStringify(parameters) {\n\n var array = [];\n\n parameters = parameters || {};\n\n Object.keys(parameters).forEach(function (k) {\n\n var v = parameters[k];\n\n if (isArray(v)) {\n v.forEach(function (vv) {\n array.push(encodeURIComponent(k) + '=' + encodeURIComponent(vv));\n });\n } else {\n array.push(encodeURIComponent(k) + '=' + encodeURIComponent(v));\n }\n });\n\n return array.join('&');\n}\n\n/**\n * TODO Replace with something better\n * @see https://github.com/joyent/node/blob/master/lib/querystring.js\n * @param {string} queryString\n * @returns {object}\n */\n\nfunction parseQueryString(queryString) {\n\n var argsParsed = {};\n\n queryString.split('&').forEach(function (arg) {\n\n arg = decodeURIComponent(arg);\n\n if (arg.indexOf('=') == -1) {\n\n argsParsed[arg.trim()] = true;\n } else {\n\n var pair = arg.split('='),\n key = pair[0].trim(),\n value = pair[1].trim();\n\n if (key in argsParsed) {\n if (key in argsParsed && !isArray(argsParsed[key])) argsParsed[key] = [argsParsed[key]];\n argsParsed[key].push(value);\n } else {\n argsParsed[key] = value;\n }\n }\n });\n\n return argsParsed;\n}\n\n/**\n * @param obj\n * @return {boolean}\n */\n\nfunction isFunction(obj) {\n return typeof obj === \"function\";\n}\n\n/**\n * @param obj\n * @return {boolean}\n */\n\nfunction isArray(obj) {\n return Array.isArray ? Array.isArray(obj) : typeof obj === \"array\";\n}\n\n/**\n * @param fn\n * @param interval\n * @param timeout\n */\n\nfunction poll(fn, interval, timeout) {\n //NodeJS.Timer|number\n\n module.exports.stopPolling(timeout);\n\n interval = interval || 1000;\n\n var next = function next(delay) {\n\n delay = delay || interval;\n\n interval = delay;\n\n return setTimeout(function () {\n\n fn(next, delay);\n }, delay);\n };\n\n return next();\n}\n\nfunction stopPolling(timeout) {\n if (timeout) clearTimeout(timeout);\n}\n\nfunction isNodeJS() {\n return typeof process !== 'undefined';\n}\n\nfunction isBrowser() {\n return typeof window !== 'undefined';\n}\n\nfunction delay(timeout) {\n return new _ExternalsJs.Promise(function (resolve, reject) {\n setTimeout(function () {\n resolve(null);\n }, timeout);\n });\n}\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _es6Promise = __webpack_require__(4);\n\nvar _es6Promise2 = _interopRequireDefault(_es6Promise);\n\nvar _nodeFetch = __webpack_require__(9);\n\nvar _nodeFetch2 = _interopRequireDefault(_nodeFetch);\n\nvar _pubnub = __webpack_require__(10);\n\nvar _pubnub2 = _interopRequireDefault(_pubnub);\n\nvar Promise = _es6Promise2['default'] && _es6Promise2['default'].Promise || window.Promise;\n\nexports.Promise = Promise;\nvar fetch = _nodeFetch2['default'] || window.fetch;\nexports.fetch = fetch;\nvar Request = fetch.Request || window.Request;\nexports.Request = Request;\nvar Response = fetch.Response || window.Response;\nexports.Response = Response;\nvar Headers = fetch.Headers || window.Headers;\n\nexports.Headers = Headers;\nvar PUBNUB = _pubnub2['default'] || window.PUBNUB;\n\nexports.PUBNUB = PUBNUB;\nvar localStorage = typeof window !== 'undefined' && typeof window.localStorage !== 'undefined' ? window.localStorage : {};\nexports.localStorage = localStorage;\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\nvar require;var __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(setImmediate, global, module) {/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license Licensed under MIT license\n * See https://raw.githubusercontent.com/jakearchibald/es6-promise/master/LICENSE\n * @version 2.2.0\n */\n\n(function() {\n \"use strict\";\n function lib$es6$promise$utils$$objectOrFunction(x) {\n return typeof x === 'function' || (typeof x === 'object' && x !== null);\n }\n\n function lib$es6$promise$utils$$isFunction(x) {\n return typeof x === 'function';\n }\n\n function lib$es6$promise$utils$$isMaybeThenable(x) {\n return typeof x === 'object' && x !== null;\n }\n\n var lib$es6$promise$utils$$_isArray;\n if (!Array.isArray) {\n lib$es6$promise$utils$$_isArray = function (x) {\n return Object.prototype.toString.call(x) === '[object Array]';\n };\n } else {\n lib$es6$promise$utils$$_isArray = Array.isArray;\n }\n\n var lib$es6$promise$utils$$isArray = lib$es6$promise$utils$$_isArray;\n var lib$es6$promise$asap$$len = 0;\n var lib$es6$promise$asap$$toString = {}.toString;\n var lib$es6$promise$asap$$vertxNext;\n var lib$es6$promise$asap$$customSchedulerFn;\n\n function lib$es6$promise$asap$$asap(callback, arg) {\n lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len] = callback;\n lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len + 1] = arg;\n lib$es6$promise$asap$$len += 2;\n if (lib$es6$promise$asap$$len === 2) {\n // If len is 2, 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 if (lib$es6$promise$asap$$customSchedulerFn) {\n lib$es6$promise$asap$$customSchedulerFn(lib$es6$promise$asap$$flush);\n } else {\n lib$es6$promise$asap$$scheduleFlush();\n }\n }\n }\n\n var lib$es6$promise$asap$$default = lib$es6$promise$asap$$asap;\n function lib$es6$promise$asap$$setScheduler(scheduleFn) {\n lib$es6$promise$asap$$customSchedulerFn = scheduleFn;\n }\n\n var lib$es6$promise$asap$$browserWindow = (typeof window !== 'undefined') ? window : undefined;\n var lib$es6$promise$asap$$browserGlobal = lib$es6$promise$asap$$browserWindow || {};\n var lib$es6$promise$asap$$BrowserMutationObserver = lib$es6$promise$asap$$browserGlobal.MutationObserver || lib$es6$promise$asap$$browserGlobal.WebKitMutationObserver;\n var lib$es6$promise$asap$$isNode = typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n // test for web worker but not in IE10\n var lib$es6$promise$asap$$isWorker = typeof Uint8ClampedArray !== 'undefined' &&\n typeof importScripts !== 'undefined' &&\n typeof MessageChannel !== 'undefined';\n\n // node\n function lib$es6$promise$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$es6$promise$asap$$flush);\n };\n }\n\n // vertx\n function lib$es6$promise$asap$$useVertxTimer() {\n return function() {\n lib$es6$promise$asap$$vertxNext(lib$es6$promise$asap$$flush);\n };\n }\n\n function lib$es6$promise$asap$$useMutationObserver() {\n var iterations = 0;\n var observer = new lib$es6$promise$asap$$BrowserMutationObserver(lib$es6$promise$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$es6$promise$asap$$useMessageChannel() {\n var channel = new MessageChannel();\n channel.port1.onmessage = lib$es6$promise$asap$$flush;\n return function () {\n channel.port2.postMessage(0);\n };\n }\n\n function lib$es6$promise$asap$$useSetTimeout() {\n return function() {\n setTimeout(lib$es6$promise$asap$$flush, 1);\n };\n }\n\n var lib$es6$promise$asap$$queue = new Array(1000);\n function lib$es6$promise$asap$$flush() {\n for (var i = 0; i < lib$es6$promise$asap$$len; i+=2) {\n var callback = lib$es6$promise$asap$$queue[i];\n var arg = lib$es6$promise$asap$$queue[i+1];\n\n callback(arg);\n\n lib$es6$promise$asap$$queue[i] = undefined;\n lib$es6$promise$asap$$queue[i+1] = undefined;\n }\n\n lib$es6$promise$asap$$len = 0;\n }\n\n function lib$es6$promise$asap$$attemptVertex() {\n try {\n var r = require;\n var vertx = __webpack_require__(!(function webpackMissingModule() { var e = new Error(\"Cannot find module \\\"vertx\\\"\"); e.code = 'MODULE_NOT_FOUND'; throw e; }()));\n lib$es6$promise$asap$$vertxNext = vertx.runOnLoop || vertx.runOnContext;\n return lib$es6$promise$asap$$useVertxTimer();\n } catch(e) {\n return lib$es6$promise$asap$$useSetTimeout();\n }\n }\n\n var lib$es6$promise$asap$$scheduleFlush;\n // Decide what async method to use to triggering processing of queued callbacks:\n if (lib$es6$promise$asap$$isNode) {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useNextTick();\n } else if (lib$es6$promise$asap$$BrowserMutationObserver) {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMutationObserver();\n } else if (lib$es6$promise$asap$$isWorker) {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMessageChannel();\n } else if (lib$es6$promise$asap$$browserWindow === undefined && \"function\" === 'function') {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$attemptVertex();\n } else {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useSetTimeout();\n }\n\n function lib$es6$promise$$internal$$noop() {}\n\n var lib$es6$promise$$internal$$PENDING = void 0;\n var lib$es6$promise$$internal$$FULFILLED = 1;\n var lib$es6$promise$$internal$$REJECTED = 2;\n\n var lib$es6$promise$$internal$$GET_THEN_ERROR = new lib$es6$promise$$internal$$ErrorObject();\n\n function lib$es6$promise$$internal$$selfFullfillment() {\n return new TypeError(\"You cannot resolve a promise with itself\");\n }\n\n function lib$es6$promise$$internal$$cannotReturnOwn() {\n return new TypeError('A promises callback cannot return that same promise.');\n }\n\n function lib$es6$promise$$internal$$getThen(promise) {\n try {\n return promise.then;\n } catch(error) {\n lib$es6$promise$$internal$$GET_THEN_ERROR.error = error;\n return lib$es6$promise$$internal$$GET_THEN_ERROR;\n }\n }\n\n function lib$es6$promise$$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$es6$promise$$internal$$handleForeignThenable(promise, thenable, then) {\n lib$es6$promise$asap$$default(function(promise) {\n var sealed = false;\n var error = lib$es6$promise$$internal$$tryThen(then, thenable, function(value) {\n if (sealed) { return; }\n sealed = true;\n if (thenable !== value) {\n lib$es6$promise$$internal$$resolve(promise, value);\n } else {\n lib$es6$promise$$internal$$fulfill(promise, value);\n }\n }, function(reason) {\n if (sealed) { return; }\n sealed = true;\n\n lib$es6$promise$$internal$$reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && error) {\n sealed = true;\n lib$es6$promise$$internal$$reject(promise, error);\n }\n }, promise);\n }\n\n function lib$es6$promise$$internal$$handleOwnThenable(promise, thenable) {\n if (thenable._state === lib$es6$promise$$internal$$FULFILLED) {\n lib$es6$promise$$internal$$fulfill(promise, thenable._result);\n } else if (thenable._state === lib$es6$promise$$internal$$REJECTED) {\n lib$es6$promise$$internal$$reject(promise, thenable._result);\n } else {\n lib$es6$promise$$internal$$subscribe(thenable, undefined, function(value) {\n lib$es6$promise$$internal$$resolve(promise, value);\n }, function(reason) {\n lib$es6$promise$$internal$$reject(promise, reason);\n });\n }\n }\n\n function lib$es6$promise$$internal$$handleMaybeThenable(promise, maybeThenable) {\n if (maybeThenable.constructor === promise.constructor) {\n lib$es6$promise$$internal$$handleOwnThenable(promise, maybeThenable);\n } else {\n var then = lib$es6$promise$$internal$$getThen(maybeThenable);\n\n if (then === lib$es6$promise$$internal$$GET_THEN_ERROR) {\n lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$GET_THEN_ERROR.error);\n } else if (then === undefined) {\n lib$es6$promise$$internal$$fulfill(promise, maybeThenable);\n } else if (lib$es6$promise$utils$$isFunction(then)) {\n lib$es6$promise$$internal$$handleForeignThenable(promise, maybeThenable, then);\n } else {\n lib$es6$promise$$internal$$fulfill(promise, maybeThenable);\n }\n }\n }\n\n function lib$es6$promise$$internal$$resolve(promise, value) {\n if (promise === value) {\n lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$selfFullfillment());\n } else if (lib$es6$promise$utils$$objectOrFunction(value)) {\n lib$es6$promise$$internal$$handleMaybeThenable(promise, value);\n } else {\n lib$es6$promise$$internal$$fulfill(promise, value);\n }\n }\n\n function lib$es6$promise$$internal$$publishRejection(promise) {\n if (promise._onerror) {\n promise._onerror(promise._result);\n }\n\n lib$es6$promise$$internal$$publish(promise);\n }\n\n function lib$es6$promise$$internal$$fulfill(promise, value) {\n if (promise._state !== lib$es6$promise$$internal$$PENDING) { return; }\n\n promise._result = value;\n promise._state = lib$es6$promise$$internal$$FULFILLED;\n\n if (promise._subscribers.length !== 0) {\n lib$es6$promise$asap$$default(lib$es6$promise$$internal$$publish, promise);\n }\n }\n\n function lib$es6$promise$$internal$$reject(promise, reason) {\n if (promise._state !== lib$es6$promise$$internal$$PENDING) { return; }\n promise._state = lib$es6$promise$$internal$$REJECTED;\n promise._result = reason;\n\n lib$es6$promise$asap$$default(lib$es6$promise$$internal$$publishRejection, promise);\n }\n\n function lib$es6$promise$$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$es6$promise$$internal$$FULFILLED] = onFulfillment;\n subscribers[length + lib$es6$promise$$internal$$REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n lib$es6$promise$asap$$default(lib$es6$promise$$internal$$publish, parent);\n }\n }\n\n function lib$es6$promise$$internal$$publish(promise) {\n var subscribers = promise._subscribers;\n var settled = promise._state;\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$es6$promise$$internal$$invokeCallback(settled, child, callback, detail);\n } else {\n callback(detail);\n }\n }\n\n promise._subscribers.length = 0;\n }\n\n function lib$es6$promise$$internal$$ErrorObject() {\n this.error = null;\n }\n\n var lib$es6$promise$$internal$$TRY_CATCH_ERROR = new lib$es6$promise$$internal$$ErrorObject();\n\n function lib$es6$promise$$internal$$tryCatch(callback, detail) {\n try {\n return callback(detail);\n } catch(e) {\n lib$es6$promise$$internal$$TRY_CATCH_ERROR.error = e;\n return lib$es6$promise$$internal$$TRY_CATCH_ERROR;\n }\n }\n\n function lib$es6$promise$$internal$$invokeCallback(settled, promise, callback, detail) {\n var hasCallback = lib$es6$promise$utils$$isFunction(callback),\n value, error, succeeded, failed;\n\n if (hasCallback) {\n value = lib$es6$promise$$internal$$tryCatch(callback, detail);\n\n if (value === lib$es6$promise$$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$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$cannotReturnOwn());\n return;\n }\n\n } else {\n value = detail;\n succeeded = true;\n }\n\n if (promise._state !== lib$es6$promise$$internal$$PENDING) {\n // noop\n } else if (hasCallback && succeeded) {\n lib$es6$promise$$internal$$resolve(promise, value);\n } else if (failed) {\n lib$es6$promise$$internal$$reject(promise, error);\n } else if (settled === lib$es6$promise$$internal$$FULFILLED) {\n lib$es6$promise$$internal$$fulfill(promise, value);\n } else if (settled === lib$es6$promise$$internal$$REJECTED) {\n lib$es6$promise$$internal$$reject(promise, value);\n }\n }\n\n function lib$es6$promise$$internal$$initializePromise(promise, resolver) {\n try {\n resolver(function resolvePromise(value){\n lib$es6$promise$$internal$$resolve(promise, value);\n }, function rejectPromise(reason) {\n lib$es6$promise$$internal$$reject(promise, reason);\n });\n } catch(e) {\n lib$es6$promise$$internal$$reject(promise, e);\n }\n }\n\n function lib$es6$promise$enumerator$$Enumerator(Constructor, input) {\n var enumerator = this;\n\n enumerator._instanceConstructor = Constructor;\n enumerator.promise = new Constructor(lib$es6$promise$$internal$$noop);\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$es6$promise$$internal$$fulfill(enumerator.promise, enumerator._result);\n } else {\n enumerator.length = enumerator.length || 0;\n enumerator._enumerate();\n if (enumerator._remaining === 0) {\n lib$es6$promise$$internal$$fulfill(enumerator.promise, enumerator._result);\n }\n }\n } else {\n lib$es6$promise$$internal$$reject(enumerator.promise, enumerator._validationError());\n }\n }\n\n lib$es6$promise$enumerator$$Enumerator.prototype._validateInput = function(input) {\n return lib$es6$promise$utils$$isArray(input);\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._validationError = function() {\n return new Error('Array Methods must be provided an Array');\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._init = function() {\n this._result = new Array(this.length);\n };\n\n var lib$es6$promise$enumerator$$default = lib$es6$promise$enumerator$$Enumerator;\n\n lib$es6$promise$enumerator$$Enumerator.prototype._enumerate = function() {\n var enumerator = this;\n\n var length = enumerator.length;\n var promise = enumerator.promise;\n var input = enumerator._input;\n\n for (var i = 0; promise._state === lib$es6$promise$$internal$$PENDING && i < length; i++) {\n enumerator._eachEntry(input[i], i);\n }\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._eachEntry = function(entry, i) {\n var enumerator = this;\n var c = enumerator._instanceConstructor;\n\n if (lib$es6$promise$utils$$isMaybeThenable(entry)) {\n if (entry.constructor === c && entry._state !== lib$es6$promise$$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] = entry;\n }\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._settledAt = function(state, i, value) {\n var enumerator = this;\n var promise = enumerator.promise;\n\n if (promise._state === lib$es6$promise$$internal$$PENDING) {\n enumerator._remaining--;\n\n if (state === lib$es6$promise$$internal$$REJECTED) {\n lib$es6$promise$$internal$$reject(promise, value);\n } else {\n enumerator._result[i] = value;\n }\n }\n\n if (enumerator._remaining === 0) {\n lib$es6$promise$$internal$$fulfill(promise, enumerator._result);\n }\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._willSettleAt = function(promise, i) {\n var enumerator = this;\n\n lib$es6$promise$$internal$$subscribe(promise, undefined, function(value) {\n enumerator._settledAt(lib$es6$promise$$internal$$FULFILLED, i, value);\n }, function(reason) {\n enumerator._settledAt(lib$es6$promise$$internal$$REJECTED, i, reason);\n });\n };\n function lib$es6$promise$promise$all$$all(entries) {\n return new lib$es6$promise$enumerator$$default(this, entries).promise;\n }\n var lib$es6$promise$promise$all$$default = lib$es6$promise$promise$all$$all;\n function lib$es6$promise$promise$race$$race(entries) {\n /*jshint validthis:true */\n var Constructor = this;\n\n var promise = new Constructor(lib$es6$promise$$internal$$noop);\n\n if (!lib$es6$promise$utils$$isArray(entries)) {\n lib$es6$promise$$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$es6$promise$$internal$$resolve(promise, value);\n }\n\n function onRejection(reason) {\n lib$es6$promise$$internal$$reject(promise, reason);\n }\n\n for (var i = 0; promise._state === lib$es6$promise$$internal$$PENDING && i < length; i++) {\n lib$es6$promise$$internal$$subscribe(Constructor.resolve(entries[i]), undefined, onFulfillment, onRejection);\n }\n\n return promise;\n }\n var lib$es6$promise$promise$race$$default = lib$es6$promise$promise$race$$race;\n function lib$es6$promise$promise$resolve$$resolve(object) {\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$es6$promise$$internal$$noop);\n lib$es6$promise$$internal$$resolve(promise, object);\n return promise;\n }\n var lib$es6$promise$promise$resolve$$default = lib$es6$promise$promise$resolve$$resolve;\n function lib$es6$promise$promise$reject$$reject(reason) {\n /*jshint validthis:true */\n var Constructor = this;\n var promise = new Constructor(lib$es6$promise$$internal$$noop);\n lib$es6$promise$$internal$$reject(promise, reason);\n return promise;\n }\n var lib$es6$promise$promise$reject$$default = lib$es6$promise$promise$reject$$reject;\n\n var lib$es6$promise$promise$$counter = 0;\n\n function lib$es6$promise$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$es6$promise$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 var lib$es6$promise$promise$$default = lib$es6$promise$promise$$Promise;\n /**\n Promise objects represent the eventual result of an asynchronous operation. The\n primary way of interacting with a promise is through its `then` method, which\n registers callbacks to receive either a promise’s eventual value or the reason\n why the promise cannot be fulfilled.\n\n Terminology\n -----------\n\n - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n - `thenable` is an object or function that defines a `then` method.\n - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n - `exception` is a value that is thrown using the throw statement.\n - `reason` is a value that indicates why a promise was rejected.\n - `settled` the final resting state of a promise, fulfilled or rejected.\n\n A promise can be in one of three states: pending, fulfilled, or rejected.\n\n Promises that are fulfilled have a fulfillment value and are in the fulfilled\n state. Promises that are rejected have a rejection reason and are in the\n rejected state. A fulfillment value is never a thenable.\n\n Promises can also be said to *resolve* a value. If this value is also a\n promise, then the original promise's settled state will match the value's\n settled state. So a promise that *resolves* a promise that rejects will\n itself reject, and a promise that *resolves* a promise that fulfills will\n itself fulfill.\n\n\n Basic Usage:\n ------------\n\n ```js\n var promise = new Promise(function(resolve, reject) {\n // on success\n resolve(value);\n\n // on failure\n reject(reason);\n });\n\n promise.then(function(value) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Advanced Usage:\n ---------------\n\n Promises shine when abstracting away asynchronous interactions such as\n `XMLHttpRequest`s.\n\n ```js\n function getJSON(url) {\n return new Promise(function(resolve, reject){\n var xhr = new XMLHttpRequest();\n\n xhr.open('GET', url);\n xhr.onreadystatechange = handler;\n xhr.responseType = 'json';\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send();\n\n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200) {\n resolve(this.response);\n } else {\n reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n }\n }\n };\n });\n }\n\n getJSON('/posts.json').then(function(json) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Unlike callbacks, promises are great composable primitives.\n\n ```js\n Promise.all([\n getJSON('/posts'),\n getJSON('/comments')\n ]).then(function(values){\n values[0] // => postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class Promise\n @param {function} resolver\n Useful for tooling.\n @constructor\n */\n function lib$es6$promise$promise$$Promise(resolver) {\n this._id = lib$es6$promise$promise$$counter++;\n this._state = undefined;\n this._result = undefined;\n this._subscribers = [];\n\n if (lib$es6$promise$$internal$$noop !== resolver) {\n if (!lib$es6$promise$utils$$isFunction(resolver)) {\n lib$es6$promise$promise$$needsResolver();\n }\n\n if (!(this instanceof lib$es6$promise$promise$$Promise)) {\n lib$es6$promise$promise$$needsNew();\n }\n\n lib$es6$promise$$internal$$initializePromise(this, resolver);\n }\n }\n\n lib$es6$promise$promise$$Promise.all = lib$es6$promise$promise$all$$default;\n lib$es6$promise$promise$$Promise.race = lib$es6$promise$promise$race$$default;\n lib$es6$promise$promise$$Promise.resolve = lib$es6$promise$promise$resolve$$default;\n lib$es6$promise$promise$$Promise.reject = lib$es6$promise$promise$reject$$default;\n lib$es6$promise$promise$$Promise._setScheduler = lib$es6$promise$asap$$setScheduler;\n lib$es6$promise$promise$$Promise._asap = lib$es6$promise$asap$$default;\n\n lib$es6$promise$promise$$Promise.prototype = {\n constructor: lib$es6$promise$promise$$Promise,\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 Useful for tooling.\n @return {Promise}\n */\n then: function(onFulfillment, onRejection) {\n var parent = this;\n var state = parent._state;\n\n if (state === lib$es6$promise$$internal$$FULFILLED && !onFulfillment || state === lib$es6$promise$$internal$$REJECTED && !onRejection) {\n return this;\n }\n\n var child = new this.constructor(lib$es6$promise$$internal$$noop);\n var result = parent._result;\n\n if (state) {\n var callback = arguments[state - 1];\n lib$es6$promise$asap$$default(function(){\n lib$es6$promise$$internal$$invokeCallback(state, child, callback, result);\n });\n } else {\n lib$es6$promise$$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 Useful for tooling.\n @return {Promise}\n */\n 'catch': function(onRejection) {\n return this.then(null, onRejection);\n }\n };\n function lib$es6$promise$polyfill$$polyfill() {\n var local;\n\n if (typeof global !== 'undefined') {\n local = global;\n } else if (typeof self !== 'undefined') {\n local = self;\n } else {\n try {\n local = Function('return this')();\n } catch (e) {\n throw new Error('polyfill failed because global object is unavailable in this environment');\n }\n }\n\n var P = local.Promise;\n\n if (P && Object.prototype.toString.call(P.resolve()) === '[object Promise]' && !P.cast) {\n return;\n }\n\n local.Promise = lib$es6$promise$promise$$default;\n }\n var lib$es6$promise$polyfill$$default = lib$es6$promise$polyfill$$polyfill;\n\n var lib$es6$promise$umd$$ES6Promise = {\n 'Promise': lib$es6$promise$promise$$default,\n 'polyfill': lib$es6$promise$polyfill$$default\n };\n\n /* global define:true module:true window: true */\n if (\"function\" === 'function' && __webpack_require__(8)['amd']) {\n !(__WEBPACK_AMD_DEFINE_RESULT__ = function() { return lib$es6$promise$umd$$ES6Promise; }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else if (typeof module !== 'undefined' && module['exports']) {\n module['exports'] = lib$es6$promise$umd$$ES6Promise;\n } else if (typeof this !== 'undefined') {\n this['ES6Promise'] = lib$es6$promise$umd$$ES6Promise;\n }\n\n lib$es6$promise$polyfill$$default();\n}).call(this);\n\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(5).setImmediate, (function() { return this; }()), __webpack_require__(7)(module)))\n\n/***/ },\n/* 5 */\n/***/ function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(setImmediate, clearImmediate) {var nextTick = __webpack_require__(6).nextTick;\nvar apply = Function.prototype.apply;\nvar slice = Array.prototype.slice;\nvar immediateIds = {};\nvar nextImmediateId = 0;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n return new Timeout(apply.call(setInterval, window, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) { timeout.close(); };\n\nfunction Timeout(id, clearFn) {\n this._id = id;\n this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n this._clearFn.call(window, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n clearTimeout(item._idleTimeoutId);\n\n var msecs = item._idleTimeout;\n if (msecs >= 0) {\n item._idleTimeoutId = setTimeout(function onTimeout() {\n if (item._onTimeout)\n item._onTimeout();\n }, msecs);\n }\n};\n\n// That's not how node.js implements it but the exposed api is the same.\nexports.setImmediate = typeof setImmediate === \"function\" ? setImmediate : function(fn) {\n var id = nextImmediateId++;\n var args = arguments.length < 2 ? false : slice.call(arguments, 1);\n\n immediateIds[id] = true;\n\n nextTick(function onNextTick() {\n if (immediateIds[id]) {\n // fn.call() is faster so we optimize for the common use-case\n // @see http://jsperf.com/call-apply-segu\n if (args) {\n fn.apply(null, args);\n } else {\n fn.call(null);\n }\n // Prevent ids from leaking\n exports.clearImmediate(id);\n }\n });\n\n return id;\n};\n\nexports.clearImmediate = typeof clearImmediate === \"function\" ? clearImmediate : function(id) {\n delete immediateIds[id];\n};\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(5).setImmediate, __webpack_require__(5).clearImmediate))\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n// shim for using process in browser\n\nvar process = module.exports = {};\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = setTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n clearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n setTimeout(drainQueue, 0);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n/***/ },\n/* 7 */\n/***/ function(module, exports) {\n\nmodule.exports = function(module) {\r\n\tif(!module.webpackPolyfill) {\r\n\t\tmodule.deprecate = function() {};\r\n\t\tmodule.paths = [];\r\n\t\t// module.parent = undefined by default\r\n\t\tmodule.children = [];\r\n\t\tmodule.webpackPolyfill = 1;\r\n\t}\r\n\treturn module;\r\n}\r\n\n\n/***/ },\n/* 8 */\n/***/ function(module, exports) {\n\nmodule.exports = function() { throw new Error(\"define cannot be used indirect\"); };\r\n\n\n/***/ },\n/* 9 */\n/***/ function(module, exports) {\n\n(function() {\n 'use strict';\n\n if (self.fetch) {\n return\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n }\n\n function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var list = this.map[name]\n if (!list) {\n list = []\n this.map[name] = list\n }\n list.push(value)\n }\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n }\n\n Headers.prototype.get = function(name) {\n var values = this.map[normalizeName(name)]\n return values ? values[0] : null\n }\n\n Headers.prototype.getAll = function(name) {\n return this.map[normalizeName(name)] || []\n }\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n }\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = [normalizeValue(value)]\n }\n\n Headers.prototype.forEach = function(callback, thisArg) {\n Object.getOwnPropertyNames(this.map).forEach(function(name) {\n this.map[name].forEach(function(value) {\n callback.call(thisArg, value, name, this)\n }, this)\n }, this)\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n reader.readAsArrayBuffer(blob)\n return fileReaderReady(reader)\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader()\n reader.readAsText(blob)\n return fileReaderReady(reader)\n }\n\n var support = {\n blob: 'FileReader' in self && 'Blob' in self && (function() {\n try {\n new Blob();\n return true\n } catch(e) {\n return false\n }\n })(),\n formData: 'FormData' in self\n }\n\n function Body() {\n this.bodyUsed = false\n\n\n this._initBody = function(body) {\n this._bodyInit = body\n if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (!body) {\n this._bodyText = ''\n } else {\n throw new Error('unsupported BodyInit type')\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n } else {\n this.text = function() {\n var rejected = consumed(this)\n return rejected ? rejected : Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return (methods.indexOf(upcased) > -1) ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {}\n var body = options.body\n if (Request.prototype.isPrototypeOf(input)) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n if (!body) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n } else {\n this.url = input\n }\n\n this.credentials = options.credentials || this.credentials || 'omit'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n }\n\n function decode(body) {\n var form = new FormData()\n body.trim().split('&').forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n }\n\n function headers(xhr) {\n var head = new Headers()\n var pairs = xhr.getAllResponseHeaders().trim().split('\\n')\n pairs.forEach(function(header) {\n var split = header.trim().split(':')\n var key = split.shift().trim()\n var value = split.join(':').trim()\n head.append(key, value)\n })\n return head\n }\n\n Body.call(Request.prototype)\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {}\n }\n\n this._initBody(bodyInit)\n this.type = 'default'\n this.url = null\n this.status = options.status\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = options.statusText\n this.headers = options.headers instanceof Headers ? options.headers : new Headers(options.headers)\n this.url = options.url || ''\n }\n\n Body.call(Response.prototype)\n\n self.Headers = Headers;\n self.Request = Request;\n self.Response = Response;\n\n self.fetch = function(input, init) {\n var request\n if (Request.prototype.isPrototypeOf(input) && !init) {\n request = input\n } else {\n request = new Request(input, init)\n }\n\n return new Promise(function(resolve, reject) {\n var xhr = new XMLHttpRequest()\n\n function responseURL() {\n if ('responseURL' in xhr) {\n return xhr.responseURL\n }\n\n // Avoid security warnings on getResponseHeader when not allowed by CORS\n if (/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())) {\n return xhr.getResponseHeader('X-Request-URL')\n }\n\n return;\n }\n\n xhr.onload = function() {\n var status = (xhr.status === 1223) ? 204 : xhr.status\n if (status < 100 || status > 599) {\n reject(new TypeError('Network request failed'))\n return\n }\n var options = {\n status: status,\n statusText: xhr.statusText,\n headers: headers(xhr),\n url: responseURL()\n }\n var body = 'response' in xhr ? xhr.response : xhr.responseText;\n resolve(new Response(body, options))\n }\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.open(request.method, request.url, true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob'\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n }\n self.fetch.polyfill = true\n})();\n\n\n/***/ },\n/* 10 */\n/***/ function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(module) {// Version: 3.7.14\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n/* =-========================= JSON =============================-= */\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n\n(window['JSON'] && window['JSON']['stringify']) || (function () {\n window['JSON'] || (window['JSON'] = {});\n\n function toJSON(key) {\n try { return this.valueOf() }\n catch(e) { return null }\n }\n\n var cx = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n escapable = /[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n gap,\n indent,\n meta = { // table of character substitutions\n '\\b': '\\\\b',\n '\\t': '\\\\t',\n '\\n': '\\\\n',\n '\\f': '\\\\f',\n '\\r': '\\\\r',\n '\"' : '\\\\\"',\n '\\\\': '\\\\\\\\'\n },\n rep;\n\n function quote(string) {\n escapable.lastIndex = 0;\n return escapable.test(string) ?\n '\"' + string.replace(escapable, function (a) {\n var c = meta[a];\n return typeof c === 'string' ? c :\n '\\\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n }) + '\"' :\n '\"' + string + '\"';\n }\n\n function str(key, holder) {\n var i, // The loop counter.\n k, // The member key.\n v, // The member value.\n length,\n partial,\n mind = gap,\n value = holder[key];\n\n if (value && typeof value === 'object') {\n value = toJSON.call( value, key );\n }\n\n if (typeof rep === 'function') {\n value = rep.call(holder, key, value);\n }\n\n switch (typeof value) {\n case 'string':\n return quote(value);\n\n case 'number':\n return isFinite(value) ? String(value) : 'null';\n\n case 'boolean':\n case 'null':\n return String(value);\n\n case 'object':\n\n if (!value) {\n return 'null';\n }\n\n gap += indent;\n partial = [];\n\n if (Object.prototype.toString.apply(value) === '[object Array]') {\n\n length = value.length;\n for (i = 0; i < length; i += 1) {\n partial[i] = str(i, value) || 'null';\n }\n\n v = partial.length === 0 ? '[]' :\n gap ? '[\\n' + gap +\n partial.join(',\\n' + gap) + '\\n' +\n mind + ']' :\n '[' + partial.join(',') + ']';\n gap = mind;\n return v;\n }\n if (rep && typeof rep === 'object') {\n length = rep.length;\n for (i = 0; i < length; i += 1) {\n k = rep[i];\n if (typeof k === 'string') {\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? ': ' : ':') + v);\n }\n }\n }\n } else {\n for (k in value) {\n if (Object.hasOwnProperty.call(value, k)) {\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? ': ' : ':') + v);\n }\n }\n }\n }\n\n v = partial.length === 0 ? '{}' :\n gap ? '{\\n' + gap + partial.join(',\\n' + gap) + '\\n' +\n mind + '}' : '{' + partial.join(',') + '}';\n gap = mind;\n return v;\n }\n }\n\n if (typeof JSON['stringify'] !== 'function') {\n JSON['stringify'] = function (value, replacer, space) {\n var i;\n gap = '';\n indent = '';\n\n if (typeof space === 'number') {\n for (i = 0; i < space; i += 1) {\n indent += ' ';\n }\n } else if (typeof space === 'string') {\n indent = space;\n }\n rep = replacer;\n if (replacer && typeof replacer !== 'function' &&\n (typeof replacer !== 'object' ||\n typeof replacer.length !== 'number')) {\n throw new Error('JSON.stringify');\n }\n return str('', {'': value});\n };\n }\n\n if (typeof JSON['parse'] !== 'function') {\n // JSON is parsed on the server for security.\n JSON['parse'] = function (text) {return eval('('+text+')')};\n }\n}());\nvar NOW = 1\n, READY = false\n, READY_BUFFER = []\n, PRESENCE_SUFFIX = '-pnpres'\n, DEF_WINDOWING = 10 // MILLISECONDS.\n, DEF_TIMEOUT = 10000 // MILLISECONDS.\n, DEF_SUB_TIMEOUT = 310 // SECONDS.\n, DEF_KEEPALIVE = 60 // SECONDS (FOR TIMESYNC).\n, SECOND = 1000 // A THOUSAND MILLISECONDS.\n, URLBIT = '/'\n, PARAMSBIT = '&'\n, PRESENCE_HB_THRESHOLD = 5\n, PRESENCE_HB_DEFAULT = 30\n, SDK_VER = '3.7.14'\n, REPL = /{([\\w\\-]+)}/g;\n\n/**\n * UTILITIES\n */\nfunction unique() { return'x'+ ++NOW+''+(+new Date) }\nfunction rnow() { return+new Date }\n\n/**\n * NEXTORIGIN\n * ==========\n * var next_origin = nextorigin();\n */\nvar nextorigin = (function() {\n var max = 20\n , ori = Math.floor(Math.random() * max);\n return function( origin, failover ) {\n return origin.indexOf('pubsub.') > 0\n && origin.replace(\n 'pubsub', 'ps' + (\n failover ? generate_uuid().split('-')[0] :\n (++ori < max? ori : ori=1)\n ) ) || origin;\n }\n})();\n\n\n/**\n * Build Url\n * =======\n *\n */\nfunction build_url( url_components, url_params ) {\n var url = url_components.join(URLBIT)\n , params = [];\n\n if (!url_params) return url;\n\n each( url_params, function( key, value ) {\n var value_str = (typeof value == 'object')?JSON['stringify'](value):value;\n (typeof value != 'undefined' &&\n value != null && encode(value_str).length > 0\n ) && params.push(key + \"=\" + encode(value_str));\n } );\n\n url += \"?\" + params.join(PARAMSBIT);\n return url;\n}\n\n/**\n * UPDATER\n * =======\n * var timestamp = unique();\n */\nfunction updater( fun, rate ) {\n var timeout\n , last = 0\n , runnit = function() {\n if (last + rate > rnow()) {\n clearTimeout(timeout);\n timeout = setTimeout( runnit, rate );\n }\n else {\n last = rnow();\n fun();\n }\n };\n\n return runnit;\n}\n\n/**\n * GREP\n * ====\n * var list = grep( [1,2,3], function(item) { return item % 2 } )\n */\nfunction grep( list, fun ) {\n var fin = [];\n each( list || [], function(l) { fun(l) && fin.push(l) } );\n return fin\n}\n\n/**\n * SUPPLANT\n * ========\n * var text = supplant( 'Hello {name}!', { name : 'John' } )\n */\nfunction supplant( str, values ) {\n return str.replace( REPL, function( _, match ) {\n return values[match] || _\n } );\n}\n\n/**\n * timeout\n * =======\n * timeout( function(){}, 100 );\n */\nfunction timeout( fun, wait ) {\n return setTimeout( fun, wait );\n}\n\n/**\n * uuid\n * ====\n * var my_uuid = generate_uuid();\n */\nfunction generate_uuid(callback) {\n var u = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,\n function(c) {\n var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);\n return v.toString(16);\n });\n if (callback) callback(u);\n return u;\n}\n\nfunction isArray(arg) {\n return !!arg && typeof arg !== 'string' && (Array.isArray && Array.isArray(arg) || typeof(arg.length) === \"number\")\n //return !!arg && (Array.isArray && Array.isArray(arg) || typeof(arg.length) === \"number\")\n}\n\n/**\n * EACH\n * ====\n * each( [1,2,3], function(item) { } )\n */\nfunction each( o, f) {\n if ( !o || !f ) return;\n\n if ( isArray(o) )\n for ( var i = 0, l = o.length; i < l; )\n f.call( o[i], o[i], i++ );\n else\n for ( var i in o )\n o.hasOwnProperty &&\n o.hasOwnProperty(i) &&\n f.call( o[i], i, o[i] );\n}\n\n/**\n * MAP\n * ===\n * var list = map( [1,2,3], function(item) { return item + 1 } )\n */\nfunction map( list, fun ) {\n var fin = [];\n each( list || [], function( k, v ) { fin.push(fun( k, v )) } );\n return fin;\n}\n\n\nfunction pam_encode(str) {\n return encodeURIComponent(str).replace(/[!'()*~]/g, function(c) {\n return '%' + c.charCodeAt(0).toString(16).toUpperCase();\n });\n}\n\n/**\n * ENCODE\n * ======\n * var encoded_data = encode('path');\n */\nfunction encode(path) { return encodeURIComponent(path) }\n\n/**\n * Generate Subscription Channel List\n * ==================================\n * generate_channel_list(channels_object);\n */\nfunction generate_channel_list(channels, nopresence) {\n var list = [];\n each( channels, function( channel, status ) {\n if (nopresence) {\n if(channel.search('-pnpres') < 0) {\n if (status.subscribed) list.push(channel);\n }\n } else {\n if (status.subscribed) list.push(channel);\n }\n });\n return list.sort();\n}\n\n/**\n * Generate Subscription Channel Groups List\n * ==================================\n * generate_channel_group_list(channels_groups object);\n */\nfunction generate_channel_group_list(channel_groups, nopresence) {\n var list = [];\n each(channel_groups, function( channel_group, status ) {\n if (nopresence) {\n if(channel_group.search('-pnpres') < 0) {\n if (status.subscribed) list.push(channel_group);\n }\n } else {\n if (status.subscribed) list.push(channel_group);\n }\n });\n return list.sort();\n}\n\n// PUBNUB READY TO CONNECT\nfunction ready() { timeout( function() {\n if (READY) return;\n READY = 1;\n each( READY_BUFFER, function(connect) { connect() } );\n}, SECOND ); }\n\nfunction PNmessage(args) {\n msg = args || {'apns' : {}},\n msg['getPubnubMessage'] = function() {\n var m = {};\n\n if (Object.keys(msg['apns']).length) {\n m['pn_apns'] = {\n 'aps' : {\n 'alert' : msg['apns']['alert'] ,\n 'badge' : msg['apns']['badge']\n }\n }\n for (var k in msg['apns']) {\n m['pn_apns'][k] = msg['apns'][k];\n }\n var exclude1 = ['badge','alert'];\n for (var k in exclude1) {\n delete m['pn_apns'][exclude1[k]];\n }\n }\n\n\n\n if (msg['gcm']) {\n m['pn_gcm'] = {\n 'data' : msg['gcm']\n }\n }\n\n for (var k in msg) {\n m[k] = msg[k];\n }\n var exclude = ['apns','gcm','publish', 'channel','callback','error'];\n for (var k in exclude) {\n delete m[exclude[k]];\n }\n\n return m;\n };\n msg['publish'] = function() {\n\n var m = msg.getPubnubMessage();\n\n if (msg['pubnub'] && msg['channel']) {\n msg['pubnub'].publish({\n 'message' : m,\n 'channel' : msg['channel'],\n 'callback' : msg['callback'],\n 'error' : msg['error']\n })\n }\n };\n return msg;\n}\n\nfunction PN_API(setup) {\n var SUB_WINDOWING = +setup['windowing'] || DEF_WINDOWING\n , SUB_TIMEOUT = (+setup['timeout'] || DEF_SUB_TIMEOUT) * SECOND\n , KEEPALIVE = (+setup['keepalive'] || DEF_KEEPALIVE) * SECOND\n , TIME_CHECK = setup['timecheck'] || 0\n , NOLEAVE = setup['noleave'] || 0\n , PUBLISH_KEY = setup['publish_key']\n , SUBSCRIBE_KEY = setup['subscribe_key']\n , AUTH_KEY = setup['auth_key'] || ''\n , SECRET_KEY = setup['secret_key'] || ''\n , hmac_SHA256 = setup['hmac_SHA256']\n , SSL = setup['ssl'] ? 's' : ''\n , ORIGIN = 'http'+SSL+'://'+(setup['origin']||'pubsub.pubnub.com')\n , STD_ORIGIN = nextorigin(ORIGIN)\n , SUB_ORIGIN = nextorigin(ORIGIN)\n , CONNECT = function(){}\n , PUB_QUEUE = []\n , CLOAK = true\n , TIME_DRIFT = 0\n , SUB_CALLBACK = 0\n , SUB_CHANNEL = 0\n , SUB_RECEIVER = 0\n , SUB_RESTORE = setup['restore'] || 0\n , SUB_BUFF_WAIT = 0\n , TIMETOKEN = 0\n , RESUMED = false\n , CHANNELS = {}\n , CHANNEL_GROUPS = {}\n , SUB_ERROR = function(){}\n , STATE = {}\n , PRESENCE_HB_TIMEOUT = null\n , PRESENCE_HB = validate_presence_heartbeat(\n setup['heartbeat'] || setup['pnexpires'] || 0, setup['error']\n )\n , PRESENCE_HB_INTERVAL = setup['heartbeat_interval'] || (PRESENCE_HB / 2) -1\n , PRESENCE_HB_RUNNING = false\n , NO_WAIT_FOR_PENDING = setup['no_wait_for_pending']\n , COMPATIBLE_35 = setup['compatible_3.5'] || false\n , xdr = setup['xdr']\n , params = setup['params'] || {}\n , error = setup['error'] || function() {}\n , _is_online = setup['_is_online'] || function() { return 1 }\n , jsonp_cb = setup['jsonp_cb'] || function() { return 0 }\n , db = setup['db'] || {'get': function(){}, 'set': function(){}}\n , CIPHER_KEY = setup['cipher_key']\n , UUID = setup['uuid'] || ( !setup['unique_uuid'] && db && db['get'](SUBSCRIBE_KEY+'uuid') || '')\n , USE_INSTANCEID = setup['instance_id'] || false\n , INSTANCEID = ''\n , shutdown = setup['shutdown']\n , use_send_beacon = (typeof setup['use_send_beacon'] != 'undefined')?setup['use_send_beacon']:true\n , sendBeacon = (use_send_beacon)?setup['sendBeacon']:null\n , _poll_timer\n , _poll_timer2;\n\n if (PRESENCE_HB === 2) PRESENCE_HB_INTERVAL = 1;\n\n var crypto_obj = setup['crypto_obj'] ||\n {\n 'encrypt' : function(a,key){ return a},\n 'decrypt' : function(b,key){return b}\n };\n\n function _get_url_params(data) {\n if (!data) data = {};\n each( params , function( key, value ) {\n if (!(key in data)) data[key] = value;\n });\n return data;\n }\n\n function _object_to_key_list(o) {\n var l = []\n each( o , function( key, value ) {\n l.push(key);\n });\n return l;\n }\n function _object_to_key_list_sorted(o) {\n return _object_to_key_list(o).sort();\n }\n\n function _get_pam_sign_input_from_params(params) {\n var si = \"\";\n var l = _object_to_key_list_sorted(params);\n\n for (var i in l) {\n var k = l[i]\n si += k + \"=\" + pam_encode(params[k]) ;\n if (i != l.length - 1) si += \"&\"\n }\n return si;\n }\n\n function validate_presence_heartbeat(heartbeat, cur_heartbeat, error) {\n var err = false;\n\n if (typeof heartbeat === 'undefined') {\n return cur_heartbeat;\n }\n\n if (typeof heartbeat === 'number') {\n if (heartbeat > PRESENCE_HB_THRESHOLD || heartbeat == 0)\n err = false;\n else\n err = true;\n } else if(typeof heartbeat === 'boolean'){\n if (!heartbeat) {\n return 0;\n } else {\n return PRESENCE_HB_DEFAULT;\n }\n } else {\n err = true;\n }\n\n if (err) {\n error && error(\"Presence Heartbeat value invalid. Valid range ( x > \" + PRESENCE_HB_THRESHOLD + \" or x = 0). Current Value : \" + (cur_heartbeat || PRESENCE_HB_THRESHOLD));\n return cur_heartbeat || PRESENCE_HB_THRESHOLD;\n } else return heartbeat;\n }\n\n function encrypt(input, key) {\n return crypto_obj['encrypt'](input, key || CIPHER_KEY) || input;\n }\n function decrypt(input, key) {\n return crypto_obj['decrypt'](input, key || CIPHER_KEY) ||\n crypto_obj['decrypt'](input, CIPHER_KEY) ||\n input;\n }\n\n function error_common(message, callback) {\n callback && callback({ 'error' : message || \"error occurred\"});\n error && error(message);\n }\n function _presence_heartbeat() {\n\n clearTimeout(PRESENCE_HB_TIMEOUT);\n\n if (!PRESENCE_HB_INTERVAL || PRESENCE_HB_INTERVAL >= 500 ||\n PRESENCE_HB_INTERVAL < 1 ||\n (!generate_channel_list(CHANNELS,true).length && !generate_channel_group_list(CHANNEL_GROUPS, true).length ) )\n {\n PRESENCE_HB_RUNNING = false;\n return;\n }\n\n PRESENCE_HB_RUNNING = true;\n SELF['presence_heartbeat']({\n 'callback' : function(r) {\n PRESENCE_HB_TIMEOUT = timeout( _presence_heartbeat, (PRESENCE_HB_INTERVAL) * SECOND );\n },\n 'error' : function(e) {\n error && error(\"Presence Heartbeat unable to reach Pubnub servers.\" + JSON.stringify(e));\n PRESENCE_HB_TIMEOUT = timeout( _presence_heartbeat, (PRESENCE_HB_INTERVAL) * SECOND );\n }\n });\n }\n\n function start_presence_heartbeat() {\n !PRESENCE_HB_RUNNING && _presence_heartbeat();\n }\n\n function publish(next) {\n\n if (NO_WAIT_FOR_PENDING) {\n if (!PUB_QUEUE.length) return;\n } else {\n if (next) PUB_QUEUE.sending = 0;\n if ( PUB_QUEUE.sending || !PUB_QUEUE.length ) return;\n PUB_QUEUE.sending = 1;\n }\n\n xdr(PUB_QUEUE.shift());\n }\n function each_channel_group(callback) {\n var count = 0;\n\n each( generate_channel_group_list(CHANNEL_GROUPS), function(channel_group) {\n var chang = CHANNEL_GROUPS[channel_group];\n\n if (!chang) return;\n\n count++;\n (callback||function(){})(chang);\n } );\n\n return count;\n }\n\n function each_channel(callback) {\n var count = 0;\n\n each( generate_channel_list(CHANNELS), function(channel) {\n var chan = CHANNELS[channel];\n\n if (!chan) return;\n\n count++;\n (callback||function(){})(chan);\n } );\n\n return count;\n }\n function _invoke_callback(response, callback, err) {\n if (typeof response == 'object') {\n if (response['error']) {\n var callback_data = {};\n\n if (response['message']) {\n callback_data['message'] = response['message'];\n }\n\n if (response['payload']) {\n callback_data['payload'] = response['payload'];\n }\n\n err && err(callback_data);\n return;\n\n }\n if (response['payload']) {\n if (response['next_page'])\n callback && callback(response['payload'], response['next_page']);\n else\n callback && callback(response['payload']);\n return;\n }\n }\n callback && callback(response);\n }\n\n function _invoke_error(response,err) {\n\n if (typeof response == 'object' && response['error']) {\n var callback_data = {};\n\n if (response['message']) {\n callback_data['message'] = response['message'];\n }\n\n if (response['payload']) {\n callback_data['payload'] = response['payload'];\n }\n \n err && err(callback_data);\n return;\n } else {\n err && err(response);\n }\n }\n function CR(args, callback, url1, data) {\n var callback = args['callback'] || callback\n , err = args['error'] || error\n , jsonp = jsonp_cb();\n\n data = data || {};\n \n if (!data['auth']) {\n data['auth'] = args['auth_key'] || AUTH_KEY;\n }\n \n var url = [\n STD_ORIGIN, 'v1', 'channel-registration',\n 'sub-key', SUBSCRIBE_KEY\n ];\n\n url.push.apply(url,url1);\n \n if (jsonp) data['callback'] = jsonp;\n \n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : url\n });\n\n }\n\n // Announce Leave Event\n var SELF = {\n 'LEAVE' : function( channel, blocking, auth_key, callback, error ) {\n\n var data = { 'uuid' : UUID, 'auth' : auth_key || AUTH_KEY }\n , origin = nextorigin(ORIGIN)\n , callback = callback || function(){}\n , err = error || function(){}\n , url\n , jsonp = jsonp_cb();\n\n\n\n // Prevent Leaving a Presence Channel\n if (channel.indexOf(PRESENCE_SUFFIX) > 0) return true;\n\n\n\n\n if (COMPATIBLE_35) {\n if (!SSL) return false;\n if (jsonp == '0') return false;\n }\n\n if (NOLEAVE) return false;\n\n if (jsonp != '0') data['callback'] = jsonp;\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n url = [\n origin, 'v2', 'presence', 'sub_key',\n SUBSCRIBE_KEY, 'channel', encode(channel), 'leave'\n ];\n\n params = _get_url_params(data);\n\n\n if (sendBeacon) {\n url_string = build_url(url, params);\n if (sendBeacon(url_string)) {\n callback && callback({\"status\": 200, \"action\": \"leave\", \"message\": \"OK\", \"service\": \"Presence\"});\n return true;\n }\n }\n\n\n xdr({\n blocking : blocking || SSL,\n timeout : 2000,\n callback : jsonp,\n data : params,\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : url\n });\n return true;\n },\n 'LEAVE_GROUP' : function( channel_group, blocking, auth_key, callback, error ) {\n\n var data = { 'uuid' : UUID, 'auth' : auth_key || AUTH_KEY }\n , origin = nextorigin(ORIGIN)\n , callback = callback || function(){}\n , err = error || function(){}\n , jsonp = jsonp_cb();\n\n // Prevent Leaving a Presence Channel Group\n if (channel_group.indexOf(PRESENCE_SUFFIX) > 0) return true;\n\n if (COMPATIBLE_35) {\n if (!SSL) return false;\n if (jsonp == '0') return false;\n }\n\n if (NOLEAVE) return false;\n\n if (jsonp != '0') data['callback'] = jsonp;\n\n if (channel_group && channel_group.length > 0) data['channel-group'] = channel_group;\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n blocking : blocking || SSL,\n timeout : 5000,\n callback : jsonp,\n data : _get_url_params(data),\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : [\n origin, 'v2', 'presence', 'sub_key',\n SUBSCRIBE_KEY, 'channel', encode(','), 'leave'\n ]\n });\n return true;\n },\n 'set_resumed' : function(resumed) {\n RESUMED = resumed;\n },\n 'get_cipher_key' : function() {\n return CIPHER_KEY;\n },\n 'set_cipher_key' : function(key) {\n CIPHER_KEY = key;\n },\n 'raw_encrypt' : function(input, key) {\n return encrypt(input, key);\n },\n 'raw_decrypt' : function(input, key) {\n return decrypt(input, key);\n },\n 'get_heartbeat' : function() {\n return PRESENCE_HB;\n },\n \n 'set_heartbeat' : function(heartbeat, heartbeat_interval) {\n PRESENCE_HB = validate_presence_heartbeat(heartbeat, PRESENCE_HB, error);\n PRESENCE_HB_INTERVAL = heartbeat_interval || (PRESENCE_HB / 2) - 1;\n if (PRESENCE_HB == 2) {\n PRESENCE_HB_INTERVAL = 1;\n }\n CONNECT();\n _presence_heartbeat();\n },\n \n 'get_heartbeat_interval' : function() {\n return PRESENCE_HB_INTERVAL;\n },\n \n 'set_heartbeat_interval' : function(heartbeat_interval) {\n PRESENCE_HB_INTERVAL = heartbeat_interval;\n _presence_heartbeat();\n },\n \n 'get_version' : function() {\n return SDK_VER;\n },\n 'getGcmMessageObject' : function(obj) {\n return {\n 'data' : obj\n }\n },\n 'getApnsMessageObject' : function(obj) {\n var x = {\n 'aps' : { 'badge' : 1, 'alert' : ''}\n }\n for (k in obj) {\n k[x] = obj[k];\n }\n return x;\n },\n 'newPnMessage' : function() {\n var x = {};\n if (gcm) x['pn_gcm'] = gcm;\n if (apns) x['pn_apns'] = apns;\n for ( k in n ) {\n x[k] = n[k];\n }\n return x;\n },\n\n '_add_param' : function(key,val) {\n params[key] = val;\n },\n\n 'channel_group' : function(args, callback) {\n var ns_ch = args['channel_group']\n , callback = callback || args['callback']\n , channels = args['channels'] || args['channel']\n , cloak = args['cloak']\n , namespace\n , channel_group\n , url = []\n , data = {}\n , mode = args['mode'] || 'add';\n\n\n if (ns_ch) {\n var ns_ch_a = ns_ch.split(':');\n\n if (ns_ch_a.length > 1) {\n namespace = (ns_ch_a[0] === '*')?null:ns_ch_a[0];\n\n channel_group = ns_ch_a[1];\n } else {\n channel_group = ns_ch_a[0];\n }\n }\n\n namespace && url.push('namespace') && url.push(encode(namespace));\n\n url.push('channel-group');\n\n if (channel_group && channel_group !== '*') {\n url.push(channel_group);\n }\n\n if (channels ) {\n if (isArray(channels)) {\n channels = channels.join(',');\n }\n data[mode] = channels;\n data['cloak'] = (CLOAK)?'true':'false';\n } else {\n if (mode === 'remove') url.push('remove');\n }\n\n if (typeof cloak != 'undefined') data['cloak'] = (cloak)?'true':'false';\n\n CR(args, callback, url, data);\n },\n\n 'channel_group_list_groups' : function(args, callback) {\n var namespace;\n\n namespace = args['namespace'] || args['ns'] || args['channel_group'] || null;\n if (namespace) {\n args[\"channel_group\"] = namespace + \":*\";\n }\n\n SELF['channel_group'](args, callback);\n },\n\n 'channel_group_list_channels' : function(args, callback) {\n if (!args['channel_group']) return error('Missing Channel Group');\n SELF['channel_group'](args, callback);\n },\n\n 'channel_group_remove_channel' : function(args, callback) {\n if (!args['channel_group']) return error('Missing Channel Group');\n if (!args['channel'] && !args['channels'] ) return error('Missing Channel');\n\n args['mode'] = 'remove';\n SELF['channel_group'](args,callback);\n },\n\n 'channel_group_remove_group' : function(args, callback) {\n if (!args['channel_group']) return error('Missing Channel Group');\n if (args['channel']) return error('Use channel_group_remove_channel if you want to remove a channel from a group.');\n\n args['mode'] = 'remove';\n SELF['channel_group'](args,callback);\n },\n\n 'channel_group_add_channel' : function(args, callback) {\n if (!args['channel_group']) return error('Missing Channel Group');\n if (!args['channel'] && !args['channels'] ) return error('Missing Channel');\n SELF['channel_group'](args,callback);\n },\n\n 'channel_group_cloak' : function(args, callback) {\n if (typeof args['cloak'] == 'undefined') {\n callback(CLOAK);\n return;\n }\n CLOAK = args['cloak'];\n SELF['channel_group'](args,callback);\n },\n\n 'channel_group_list_namespaces' : function(args, callback) {\n var url = ['namespace'];\n CR(args, callback, url);\n },\n 'channel_group_remove_namespace' : function(args, callback) {\n var url = ['namespace',args['namespace'],'remove'];\n CR(args, callback, url);\n },\n\n /*\n PUBNUB.history({\n channel : 'my_chat_channel',\n limit : 100,\n callback : function(history) { }\n });\n */\n 'history' : function( args, callback ) {\n var callback = args['callback'] || callback\n , count = args['count'] || args['limit'] || 100\n , reverse = args['reverse'] || \"false\"\n , err = args['error'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , cipher_key = args['cipher_key']\n , channel = args['channel']\n , channel_group = args['channel_group']\n , start = args['start']\n , end = args['end']\n , include_token = args['include_token']\n , string_msg_token = args['string_message_token'] || false\n , params = {}\n , jsonp = jsonp_cb();\n\n // Make sure we have a Channel\n if (!channel && !channel_group) return error('Missing Channel');\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n params['stringtoken'] = 'true';\n params['count'] = count;\n params['reverse'] = reverse;\n params['auth'] = auth_key;\n\n if (channel_group) {\n params['channel-group'] = channel_group;\n if (!channel) {\n channel = ','; \n }\n }\n if (jsonp) params['callback'] = jsonp;\n if (start) params['start'] = start;\n if (end) params['end'] = end;\n if (include_token) params['include_token'] = 'true';\n if (string_msg_token) params['string_message_token'] = 'true';\n\n // Send Message\n xdr({\n callback : jsonp,\n data : _get_url_params(params),\n success : function(response) {\n if (typeof response == 'object' && response['error']) {\n err({'message' : response['message'], 'payload' : response['payload']});\n return;\n }\n var messages = response[0];\n var decrypted_messages = [];\n for (var a = 0; a < messages.length; a++) {\n var new_message = decrypt(messages[a],cipher_key);\n try {\n decrypted_messages['push'](JSON['parse'](new_message));\n } catch (e) {\n decrypted_messages['push']((new_message));\n }\n }\n callback([decrypted_messages, response[1], response[2]]);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : [\n STD_ORIGIN, 'v2', 'history', 'sub-key',\n SUBSCRIBE_KEY, 'channel', encode(channel)\n ]\n });\n },\n\n /*\n PUBNUB.replay({\n source : 'my_channel',\n destination : 'new_channel'\n });\n */\n 'replay' : function(args, callback) {\n var callback = callback || args['callback'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , source = args['source']\n , destination = args['destination']\n , stop = args['stop']\n , start = args['start']\n , end = args['end']\n , reverse = args['reverse']\n , limit = args['limit']\n , jsonp = jsonp_cb()\n , data = {}\n , url;\n\n // Check User Input\n if (!source) return error('Missing Source Channel');\n if (!destination) return error('Missing Destination Channel');\n if (!PUBLISH_KEY) return error('Missing Publish Key');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n // Setup URL Params\n if (jsonp != '0') data['callback'] = jsonp;\n if (stop) data['stop'] = 'all';\n if (reverse) data['reverse'] = 'true';\n if (start) data['start'] = start;\n if (end) data['end'] = end;\n if (limit) data['count'] = limit;\n\n data['auth'] = auth_key;\n\n // Compose URL Parts\n url = [\n STD_ORIGIN, 'v1', 'replay',\n PUBLISH_KEY, SUBSCRIBE_KEY,\n source, destination\n ];\n\n // Start (or Stop) Replay!\n xdr({\n callback : jsonp,\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function() { callback([ 0, 'Disconnected' ]) },\n url : url,\n data : _get_url_params(data)\n });\n },\n\n /*\n PUBNUB.auth('AJFLKAJSDKLA');\n */\n 'auth' : function(auth) {\n AUTH_KEY = auth;\n CONNECT();\n },\n\n /*\n PUBNUB.time(function(time){ });\n */\n 'time' : function(callback) {\n var jsonp = jsonp_cb();\n\n var data = { 'uuid' : UUID, 'auth' : AUTH_KEY }\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n timeout : SECOND * 5,\n url : [STD_ORIGIN, 'time', jsonp],\n success : function(response) { callback(response[0]) },\n fail : function() { callback(0) }\n });\n },\n\n /*\n PUBNUB.publish({\n channel : 'my_chat_channel',\n message : 'hello!'\n });\n */\n 'publish' : function( args, callback ) {\n var msg = args['message'];\n if (!msg) return error('Missing Message');\n\n var callback = callback || args['callback'] || msg['callback'] || function(){}\n , channel = args['channel'] || msg['channel']\n , auth_key = args['auth_key'] || AUTH_KEY\n , cipher_key = args['cipher_key']\n , err = args['error'] || msg['error'] || function() {}\n , post = args['post'] || false\n , store = ('store_in_history' in args) ? args['store_in_history']: true\n , jsonp = jsonp_cb()\n , add_msg = 'push'\n , params\n , url;\n\n if (args['prepend']) add_msg = 'unshift'\n\n if (!channel) return error('Missing Channel');\n if (!PUBLISH_KEY) return error('Missing Publish Key');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n if (msg['getPubnubMessage']) {\n msg = msg['getPubnubMessage']();\n }\n\n // If trying to send Object\n msg = JSON['stringify'](encrypt(msg, cipher_key));\n\n // Create URL\n url = [\n STD_ORIGIN, 'publish',\n PUBLISH_KEY, SUBSCRIBE_KEY,\n 0, encode(channel),\n jsonp, encode(msg)\n ];\n\n params = { 'uuid' : UUID, 'auth' : auth_key }\n\n if (!store) params['store'] =\"0\"\n\n if (USE_INSTANCEID) params['instanceid'] = INSTANCEID;\n\n // Queue Message Send\n PUB_QUEUE[add_msg]({\n callback : jsonp,\n timeout : SECOND * 5,\n url : url,\n data : _get_url_params(params),\n fail : function(response){\n _invoke_error(response, err);\n publish(1);\n },\n success : function(response) {\n _invoke_callback(response, callback, err);\n publish(1);\n },\n mode : (post)?'POST':'GET'\n });\n\n // Send Message\n publish();\n },\n\n /*\n PUBNUB.unsubscribe({ channel : 'my_chat' });\n */\n 'unsubscribe' : function(args, callback) {\n var channel = args['channel']\n , channel_group = args['channel_group']\n , auth_key = args['auth_key'] || AUTH_KEY\n , callback = callback || args['callback'] || function(){}\n , err = args['error'] || function(){};\n\n TIMETOKEN = 0;\n //SUB_RESTORE = 1; REVISIT !!!!\n\n if (channel) {\n // Prepare Channel(s)\n channel = map( (\n channel.join ? channel.join(',') : ''+channel\n ).split(','), function(channel) {\n if (!CHANNELS[channel]) return;\n return channel + ',' + channel + PRESENCE_SUFFIX;\n } ).join(',');\n\n // Iterate over Channels\n each( channel.split(','), function(ch) {\n var CB_CALLED = true;\n if (!ch) return;\n CHANNELS[ch] = 0;\n if (ch in STATE) delete STATE[ch];\n if (READY) {\n CB_CALLED = SELF['LEAVE']( ch, 0 , auth_key, callback, err);\n }\n if (!CB_CALLED) callback({action : \"leave\"});\n\n \n } );\n }\n\n if (channel_group) {\n // Prepare channel group(s)\n channel_group = map( (\n channel_group.join ? channel_group.join(',') : ''+channel_group\n ).split(','), function(channel_group) {\n if (!CHANNEL_GROUPS[channel_group]) return;\n return channel_group + ',' + channel_group + PRESENCE_SUFFIX;\n } ).join(',');\n\n // Iterate over channel groups\n each( channel_group.split(','), function(chg) {\n var CB_CALLED = true;\n if (!chg) return;\n CHANNEL_GROUPS[chg] = 0;\n if (chg in STATE) delete STATE[chg];\n if (READY) {\n CB_CALLED = SELF['LEAVE_GROUP']( chg, 0 , auth_key, callback, err);\n }\n if (!CB_CALLED) callback({action : \"leave\"});\n\n } );\n }\n\n // Reset Connection if Count Less\n CONNECT();\n },\n\n /*\n PUBNUB.subscribe({\n channel : 'my_chat'\n callback : function(message) { }\n });\n */\n 'subscribe' : function( args, callback ) {\n var channel = args['channel']\n , channel_group = args['channel_group']\n , callback = callback || args['callback']\n , callback = callback || args['message']\n , connect = args['connect'] || function(){}\n , reconnect = args['reconnect'] || function(){}\n , disconnect = args['disconnect'] || function(){}\n , SUB_ERROR = args['error'] || SUB_ERROR || function(){}\n , idlecb = args['idle'] || function(){}\n , presence = args['presence'] || 0\n , noheresync = args['noheresync'] || 0\n , backfill = args['backfill'] || 0\n , timetoken = args['timetoken'] || 0\n , sub_timeout = args['timeout'] || SUB_TIMEOUT\n , windowing = args['windowing'] || SUB_WINDOWING\n , state = args['state']\n , heartbeat = args['heartbeat'] || args['pnexpires']\n , heartbeat_interval = args['heartbeat_interval']\n , restore = args['restore'] || SUB_RESTORE;\n\n AUTH_KEY = args['auth_key'] || AUTH_KEY;\n\n // Restore Enabled?\n SUB_RESTORE = restore;\n\n // Always Reset the TT\n TIMETOKEN = timetoken;\n\n // Make sure we have a Channel\n if (!channel && !channel_group) {\n return error('Missing Channel');\n }\n\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n if (heartbeat || heartbeat === 0 || heartbeat_interval || heartbeat_interval === 0) {\n SELF['set_heartbeat'](heartbeat, heartbeat_interval);\n }\n\n // Setup Channel(s)\n if (channel) {\n each( (channel.join ? channel.join(',') : ''+channel).split(','),\n function(channel) {\n var settings = CHANNELS[channel] || {};\n\n // Store Channel State\n CHANNELS[SUB_CHANNEL = channel] = {\n name : channel,\n connected : settings.connected,\n disconnected : settings.disconnected,\n subscribed : 1,\n callback : SUB_CALLBACK = callback,\n 'cipher_key' : args['cipher_key'],\n connect : connect,\n disconnect : disconnect,\n reconnect : reconnect\n };\n\n if (state) {\n if (channel in state) {\n STATE[channel] = state[channel];\n } else {\n STATE[channel] = state;\n }\n }\n\n // Presence Enabled?\n if (!presence) return;\n\n // Subscribe Presence Channel\n SELF['subscribe']({\n 'channel' : channel + PRESENCE_SUFFIX,\n 'callback' : presence,\n 'restore' : restore\n });\n\n // Presence Subscribed?\n if (settings.subscribed) return;\n\n // See Who's Here Now?\n if (noheresync) return;\n SELF['here_now']({\n 'channel' : channel,\n 'data' : _get_url_params({ 'uuid' : UUID, 'auth' : AUTH_KEY }),\n 'callback' : function(here) {\n each( 'uuids' in here ? here['uuids'] : [],\n function(uid) { presence( {\n 'action' : 'join',\n 'uuid' : uid,\n 'timestamp' : Math.floor(rnow() / 1000),\n 'occupancy' : here['occupancy'] || 1\n }, here, channel ); } );\n }\n });\n } );\n }\n\n // Setup Channel Groups\n if (channel_group) {\n each( (channel_group.join ? channel_group.join(',') : ''+channel_group).split(','),\n function(channel_group) {\n var settings = CHANNEL_GROUPS[channel_group] || {};\n\n CHANNEL_GROUPS[channel_group] = {\n name : channel_group,\n connected : settings.connected,\n disconnected : settings.disconnected,\n subscribed : 1,\n callback : SUB_CALLBACK = callback,\n 'cipher_key' : args['cipher_key'],\n connect : connect,\n disconnect : disconnect,\n reconnect : reconnect\n };\n\n // Presence Enabled?\n if (!presence) return;\n\n // Subscribe Presence Channel\n SELF['subscribe']({\n 'channel_group' : channel_group + PRESENCE_SUFFIX,\n 'callback' : presence,\n 'restore' : restore,\n 'auth_key' : AUTH_KEY\n });\n\n // Presence Subscribed?\n if (settings.subscribed) return;\n\n // See Who's Here Now?\n if (noheresync) return;\n SELF['here_now']({\n 'channel_group' : channel_group,\n 'data' : _get_url_params({ 'uuid' : UUID, 'auth' : AUTH_KEY }),\n 'callback' : function(here) {\n each( 'uuids' in here ? here['uuids'] : [],\n function(uid) { presence( {\n 'action' : 'join',\n 'uuid' : uid,\n 'timestamp' : Math.floor(rnow() / 1000),\n 'occupancy' : here['occupancy'] || 1\n }, here, channel_group ); } );\n }\n });\n } );\n }\n\n\n // Test Network Connection\n function _test_connection(success) {\n if (success) {\n // Begin Next Socket Connection\n timeout( CONNECT, windowing);\n }\n else {\n // New Origin on Failed Connection\n STD_ORIGIN = nextorigin( ORIGIN, 1 );\n SUB_ORIGIN = nextorigin( ORIGIN, 1 );\n\n // Re-test Connection\n timeout( function() {\n SELF['time'](_test_connection);\n }, SECOND );\n }\n\n // Disconnect & Reconnect\n each_channel(function(channel){\n // Reconnect\n if (success && channel.disconnected) {\n channel.disconnected = 0;\n return channel.reconnect(channel.name);\n }\n\n // Disconnect\n if (!success && !channel.disconnected) {\n channel.disconnected = 1;\n channel.disconnect(channel.name);\n }\n });\n \n // Disconnect & Reconnect for channel groups\n each_channel_group(function(channel_group){\n // Reconnect\n if (success && channel_group.disconnected) {\n channel_group.disconnected = 0;\n return channel_group.reconnect(channel_group.name);\n }\n\n // Disconnect\n if (!success && !channel_group.disconnected) {\n channel_group.disconnected = 1;\n channel_group.disconnect(channel_group.name);\n }\n });\n }\n\n // Evented Subscribe\n function _connect() {\n var jsonp = jsonp_cb()\n , channels = generate_channel_list(CHANNELS).join(',')\n , channel_groups = generate_channel_group_list(CHANNEL_GROUPS).join(',');\n\n // Stop Connection\n if (!channels && !channel_groups) return;\n\n if (!channels) channels = ',';\n\n // Connect to PubNub Subscribe Servers\n _reset_offline();\n\n var data = _get_url_params({ 'uuid' : UUID, 'auth' : AUTH_KEY });\n\n if (channel_groups) {\n data['channel-group'] = channel_groups;\n }\n\n\n var st = JSON.stringify(STATE);\n if (st.length > 2) data['state'] = JSON.stringify(STATE);\n\n if (PRESENCE_HB) data['heartbeat'] = PRESENCE_HB;\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n start_presence_heartbeat();\n SUB_RECEIVER = xdr({\n timeout : sub_timeout,\n callback : jsonp,\n fail : function(response) {\n if (response && response['error'] && response['service']) {\n _invoke_error(response, SUB_ERROR);\n _test_connection(1);\n } else {\n SELF['time'](function(success){\n !success && ( _invoke_error(response, SUB_ERROR));\n _test_connection(success);\n });\n }\n },\n data : _get_url_params(data),\n url : [\n SUB_ORIGIN, 'subscribe',\n SUBSCRIBE_KEY, encode(channels),\n jsonp, TIMETOKEN\n ],\n success : function(messages) {\n\n // Check for Errors\n if (!messages || (\n typeof messages == 'object' &&\n 'error' in messages &&\n messages['error']\n )) {\n SUB_ERROR(messages['error']);\n return timeout( CONNECT, SECOND );\n }\n\n // User Idle Callback\n idlecb(messages[1]);\n\n // Restore Previous Connection Point if Needed\n TIMETOKEN = !TIMETOKEN &&\n SUB_RESTORE &&\n db['get'](SUBSCRIBE_KEY) || messages[1];\n\n /*\n // Connect\n each_channel_registry(function(registry){\n if (registry.connected) return;\n registry.connected = 1;\n registry.connect(channel.name);\n });\n */\n\n // Connect\n each_channel(function(channel){\n if (channel.connected) return;\n channel.connected = 1;\n channel.connect(channel.name);\n });\n\n // Connect for channel groups\n each_channel_group(function(channel_group){\n if (channel_group.connected) return;\n channel_group.connected = 1;\n channel_group.connect(channel_group.name);\n });\n\n if (RESUMED && !SUB_RESTORE) {\n TIMETOKEN = 0;\n RESUMED = false;\n // Update Saved Timetoken\n db['set']( SUBSCRIBE_KEY, 0 );\n timeout( _connect, windowing );\n return;\n }\n\n // Invoke Memory Catchup and Receive Up to 100\n // Previous Messages from the Queue.\n if (backfill) {\n TIMETOKEN = 10000;\n backfill = 0;\n }\n\n // Update Saved Timetoken\n db['set']( SUBSCRIBE_KEY, messages[1] );\n\n // Route Channel <---> Callback for Message\n var next_callback = (function() {\n var channels = '';\n var channels2 = '';\n\n if (messages.length > 3) {\n channels = messages[3];\n channels2 = messages[2];\n } else if (messages.length > 2) {\n channels = messages[2];\n } else {\n channels = map(\n generate_channel_list(CHANNELS), function(chan) { return map(\n Array(messages[0].length)\n .join(',').split(','),\n function() { return chan; }\n ) }).join(',')\n }\n\n var list = channels.split(',');\n var list2 = (channels2)?channels2.split(','):[];\n\n return function() {\n var channel = list.shift()||SUB_CHANNEL;\n var channel2 = list2.shift();\n\n var chobj = {};\n\n if (channel2) {\n if (channel && channel.indexOf('-pnpres') >= 0 \n && channel2.indexOf('-pnpres') < 0) {\n channel2 += '-pnpres';\n }\n chobj = CHANNEL_GROUPS[channel2] || CHANNELS[channel2] || {'callback' : function(){}};\n } else {\n chobj = CHANNELS[channel];\n }\n\n var r = [\n chobj\n .callback||SUB_CALLBACK,\n channel.split(PRESENCE_SUFFIX)[0]\n ];\n channel2 && r.push(channel2.split(PRESENCE_SUFFIX)[0]);\n return r;\n };\n })();\n\n var latency = detect_latency(+messages[1]);\n each( messages[0], function(msg) {\n var next = next_callback();\n var decrypted_msg = decrypt(msg,\n (CHANNELS[next[1]])?CHANNELS[next[1]]['cipher_key']:null);\n next[0] && next[0]( decrypted_msg, messages, next[2] || next[1], latency, next[1]);\n });\n\n timeout( _connect, windowing );\n }\n });\n }\n\n CONNECT = function() {\n _reset_offline();\n timeout( _connect, windowing );\n };\n\n // Reduce Status Flicker\n if (!READY) return READY_BUFFER.push(CONNECT);\n\n // Connect Now\n CONNECT();\n },\n\n /*\n PUBNUB.here_now({ channel : 'my_chat', callback : fun });\n */\n 'here_now' : function( args, callback ) {\n var callback = args['callback'] || callback\n , err = args['error'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , channel = args['channel']\n , channel_group = args['channel_group']\n , jsonp = jsonp_cb()\n , uuids = ('uuids' in args) ? args['uuids'] : true\n , state = args['state']\n , data = { 'uuid' : UUID, 'auth' : auth_key };\n\n if (!uuids) data['disable_uuids'] = 1;\n if (state) data['state'] = 1;\n\n // Make sure we have a Channel\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n var url = [\n STD_ORIGIN, 'v2', 'presence',\n 'sub_key', SUBSCRIBE_KEY\n ];\n\n channel && url.push('channel') && url.push(encode(channel));\n\n if (jsonp != '0') { data['callback'] = jsonp; }\n\n if (channel_group) {\n data['channel-group'] = channel_group;\n !channel && url.push('channel') && url.push(','); \n }\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : url\n });\n },\n\n /*\n PUBNUB.current_channels_by_uuid({ channel : 'my_chat', callback : fun });\n */\n 'where_now' : function( args, callback ) {\n var callback = args['callback'] || callback\n , err = args['error'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , jsonp = jsonp_cb()\n , uuid = args['uuid'] || UUID\n , data = { 'auth' : auth_key };\n\n // Make sure we have a Channel\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n if (jsonp != '0') { data['callback'] = jsonp; }\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : [\n STD_ORIGIN, 'v2', 'presence',\n 'sub_key', SUBSCRIBE_KEY,\n 'uuid', encode(uuid)\n ]\n });\n },\n\n 'state' : function(args, callback) {\n var callback = args['callback'] || callback || function(r) {}\n , err = args['error'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , jsonp = jsonp_cb()\n , state = args['state']\n , uuid = args['uuid'] || UUID\n , channel = args['channel']\n , channel_group = args['channel_group']\n , url\n , data = _get_url_params({ 'auth' : auth_key });\n\n // Make sure we have a Channel\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n if (!uuid) return error('Missing UUID');\n if (!channel && !channel_group) return error('Missing Channel');\n\n if (jsonp != '0') { data['callback'] = jsonp; }\n\n if (typeof channel != 'undefined'\n && CHANNELS[channel] && CHANNELS[channel].subscribed ) {\n if (state) STATE[channel] = state;\n }\n\n if (typeof channel_group != 'undefined'\n && CHANNEL_GROUPS[channel_group]\n && CHANNEL_GROUPS[channel_group].subscribed\n ) {\n if (state) STATE[channel_group] = state;\n data['channel-group'] = channel_group;\n\n if (!channel) {\n channel = ',';\n }\n }\n\n data['state'] = JSON.stringify(state);\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n if (state) {\n url = [\n STD_ORIGIN, 'v2', 'presence',\n 'sub-key', SUBSCRIBE_KEY,\n 'channel', channel,\n 'uuid', uuid, 'data'\n ]\n } else {\n url = [\n STD_ORIGIN, 'v2', 'presence',\n 'sub-key', SUBSCRIBE_KEY,\n 'channel', channel,\n 'uuid', encode(uuid)\n ]\n }\n\n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : url\n\n });\n\n },\n\n /*\n PUBNUB.grant({\n channel : 'my_chat',\n callback : fun,\n error : fun,\n ttl : 24 * 60, // Minutes\n read : true,\n write : true,\n auth_key : '3y8uiajdklytowsj'\n });\n */\n 'grant' : function( args, callback ) {\n var callback = args['callback'] || callback\n , err = args['error'] || function(){}\n , channel = args['channel'] || args['channels']\n , channel_group = args['channel_group']\n , jsonp = jsonp_cb()\n , ttl = args['ttl']\n , r = (args['read'] )?\"1\":\"0\"\n , w = (args['write'])?\"1\":\"0\"\n , m = (args['manage'])?\"1\":\"0\"\n , auth_key = args['auth_key'] || args['auth_keys'];\n\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n if (!PUBLISH_KEY) return error('Missing Publish Key');\n if (!SECRET_KEY) return error('Missing Secret Key');\n\n var timestamp = Math.floor(new Date().getTime() / 1000)\n , sign_input = SUBSCRIBE_KEY + \"\\n\" + PUBLISH_KEY + \"\\n\"\n + \"grant\" + \"\\n\";\n\n var data = {\n 'w' : w,\n 'r' : r,\n 'timestamp' : timestamp\n };\n if (args['manage']) {\n data['m'] = m;\n }\n if (isArray(channel)) {\n channel = channel['join'](',');\n }\n if (isArray(auth_key)) {\n auth_key = auth_key['join'](',');\n }\n if (typeof channel != 'undefined' && channel != null && channel.length > 0) data['channel'] = channel;\n if (typeof channel_group != 'undefined' && channel_group != null && channel_group.length > 0) {\n data['channel-group'] = channel_group;\n }\n if (jsonp != '0') { data['callback'] = jsonp; }\n if (ttl || ttl === 0) data['ttl'] = ttl;\n\n if (auth_key) data['auth'] = auth_key;\n\n data = _get_url_params(data)\n\n if (!auth_key) delete data['auth'];\n\n sign_input += _get_pam_sign_input_from_params(data);\n\n var signature = hmac_SHA256( sign_input, SECRET_KEY );\n\n signature = signature.replace( /\\+/g, \"-\" );\n signature = signature.replace( /\\//g, \"_\" );\n\n data['signature'] = signature;\n\n xdr({\n callback : jsonp,\n data : data,\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : [\n STD_ORIGIN, 'v1', 'auth', 'grant' ,\n 'sub-key', SUBSCRIBE_KEY\n ]\n });\n },\n\n /*\n PUBNUB.mobile_gw_provision ({\n device_id: 'A655FBA9931AB',\n op : 'add' | 'remove',\n gw_type : 'apns' | 'gcm',\n channel : 'my_chat',\n callback : fun,\n error : fun,\n });\n */\n\n 'mobile_gw_provision' : function( args ) {\n\n var callback = args['callback'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , err = args['error'] || function() {}\n , jsonp = jsonp_cb()\n , channel = args['channel']\n , op = args['op']\n , gw_type = args['gw_type']\n , device_id = args['device_id']\n , params\n , url;\n\n if (!device_id) return error('Missing Device ID (device_id)');\n if (!gw_type) return error('Missing GW Type (gw_type: gcm or apns)');\n if (!op) return error('Missing GW Operation (op: add or remove)');\n if (!channel) return error('Missing gw destination Channel (channel)');\n if (!PUBLISH_KEY) return error('Missing Publish Key');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n // Create URL\n url = [\n STD_ORIGIN, 'v1/push/sub-key',\n SUBSCRIBE_KEY, 'devices', device_id\n ];\n\n params = { 'uuid' : UUID, 'auth' : auth_key, 'type': gw_type};\n\n if (op == \"add\") {\n params['add'] = channel;\n } else if (op == \"remove\") {\n params['remove'] = channel;\n }\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n callback : jsonp,\n data : params,\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : url\n });\n\n },\n\n /*\n PUBNUB.audit({\n channel : 'my_chat',\n callback : fun,\n error : fun,\n read : true,\n write : true,\n auth_key : '3y8uiajdklytowsj'\n });\n */\n 'audit' : function( args, callback ) {\n var callback = args['callback'] || callback\n , err = args['error'] || function(){}\n , channel = args['channel']\n , channel_group = args['channel_group']\n , auth_key = args['auth_key']\n , jsonp = jsonp_cb();\n\n // Make sure we have a Channel\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n if (!PUBLISH_KEY) return error('Missing Publish Key');\n if (!SECRET_KEY) return error('Missing Secret Key');\n\n var timestamp = Math.floor(new Date().getTime() / 1000)\n , sign_input = SUBSCRIBE_KEY + \"\\n\"\n + PUBLISH_KEY + \"\\n\"\n + \"audit\" + \"\\n\";\n\n var data = {'timestamp' : timestamp };\n if (jsonp != '0') { data['callback'] = jsonp; }\n if (typeof channel != 'undefined' && channel != null && channel.length > 0) data['channel'] = channel;\n if (typeof channel_group != 'undefined' && channel_group != null && channel_group.length > 0) {\n data['channel-group'] = channel_group;\n }\n if (auth_key) data['auth'] = auth_key;\n\n data = _get_url_params(data);\n\n if (!auth_key) delete data['auth'];\n\n sign_input += _get_pam_sign_input_from_params(data);\n\n var signature = hmac_SHA256( sign_input, SECRET_KEY );\n\n signature = signature.replace( /\\+/g, \"-\" );\n signature = signature.replace( /\\//g, \"_\" );\n\n data['signature'] = signature;\n xdr({\n callback : jsonp,\n data : data,\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : [\n STD_ORIGIN, 'v1', 'auth', 'audit' ,\n 'sub-key', SUBSCRIBE_KEY\n ]\n });\n },\n\n /*\n PUBNUB.revoke({\n channel : 'my_chat',\n callback : fun,\n error : fun,\n auth_key : '3y8uiajdklytowsj'\n });\n */\n 'revoke' : function( args, callback ) {\n args['read'] = false;\n args['write'] = false;\n SELF['grant']( args, callback );\n },\n 'set_uuid' : function(uuid) {\n UUID = uuid;\n CONNECT();\n },\n 'get_uuid' : function() {\n return UUID;\n },\n 'isArray' : function(arg) {\n return isArray(arg);\n },\n 'get_subscibed_channels' : function() {\n return generate_channel_list(CHANNELS, true);\n },\n 'presence_heartbeat' : function(args) {\n var callback = args['callback'] || function() {}\n var err = args['error'] || function() {}\n var jsonp = jsonp_cb();\n var data = { 'uuid' : UUID, 'auth' : AUTH_KEY };\n\n var st = JSON['stringify'](STATE);\n if (st.length > 2) data['state'] = JSON['stringify'](STATE);\n\n if (PRESENCE_HB > 0 && PRESENCE_HB < 320) data['heartbeat'] = PRESENCE_HB;\n\n if (jsonp != '0') { data['callback'] = jsonp; }\n\n var channels = encode(generate_channel_list(CHANNELS, true)['join'](','));\n var channel_groups = generate_channel_group_list(CHANNEL_GROUPS, true)['join'](',');\n\n if (!channels) channels = ',';\n if (channel_groups) data['channel-group'] = channel_groups;\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n timeout : SECOND * 5,\n url : [\n STD_ORIGIN, 'v2', 'presence',\n 'sub-key', SUBSCRIBE_KEY,\n 'channel' , channels,\n 'heartbeat'\n ],\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) { _invoke_error(response, err); }\n });\n },\n 'stop_timers': function () {\n clearTimeout(_poll_timer);\n clearTimeout(_poll_timer2);\n clearTimeout(PRESENCE_HB_TIMEOUT);\n },\n 'shutdown': function () {\n SELF['stop_timers']();\n shutdown && shutdown();\n },\n\n // Expose PUBNUB Functions\n 'xdr' : xdr,\n 'ready' : ready,\n 'db' : db,\n 'uuid' : generate_uuid,\n 'map' : map,\n 'each' : each,\n 'each-channel' : each_channel,\n 'grep' : grep,\n 'offline' : function(){ _reset_offline(\n 1, { \"message\" : \"Offline. Please check your network settings.\" })\n },\n 'supplant' : supplant,\n 'now' : rnow,\n 'unique' : unique,\n 'updater' : updater\n };\n\n function _poll_online() {\n _is_online() || _reset_offline( 1, {\n \"error\" : \"Offline. Please check your network settings. \"\n });\n _poll_timer && clearTimeout(_poll_timer);\n _poll_timer = timeout( _poll_online, SECOND );\n }\n\n function _poll_online2() {\n if (!TIME_CHECK) return;\n SELF['time'](function(success){\n detect_time_detla( function(){}, success );\n success || _reset_offline( 1, {\n \"error\" : \"Heartbeat failed to connect to Pubnub Servers.\" +\n \"Please check your network settings.\"\n });\n _poll_timer2 && clearTimeout(_poll_timer2);\n _poll_timer2 = timeout( _poll_online2, KEEPALIVE );\n });\n }\n\n function _reset_offline(err, msg) {\n SUB_RECEIVER && SUB_RECEIVER(err, msg);\n SUB_RECEIVER = null;\n\n clearTimeout(_poll_timer);\n clearTimeout(_poll_timer2);\n }\n \n if (!UUID) UUID = SELF['uuid']();\n if (!INSTANCEID) INSTANCEID = SELF['uuid']();\n db['set']( SUBSCRIBE_KEY + 'uuid', UUID );\n\n _poll_timer = timeout( _poll_online, SECOND );\n _poll_timer2 = timeout( _poll_online2, KEEPALIVE );\n PRESENCE_HB_TIMEOUT = timeout(\n start_presence_heartbeat,\n ( PRESENCE_HB_INTERVAL - 3 ) * SECOND\n );\n\n // Detect Age of Message\n function detect_latency(tt) {\n var adjusted_time = rnow() - TIME_DRIFT;\n return adjusted_time - tt / 10000;\n }\n\n detect_time_detla();\n function detect_time_detla( cb, time ) {\n var stime = rnow();\n\n time && calculate(time) || SELF['time'](calculate);\n\n function calculate(time) {\n if (!time) return;\n var ptime = time / 10000\n , latency = (rnow() - stime) / 2;\n TIME_DRIFT = rnow() - (ptime + latency);\n cb && cb(TIME_DRIFT);\n }\n }\n\n return SELF;\n}\nfunction crypto_obj() {\n\n function SHA256(s) {\n return CryptoJS['SHA256'](s)['toString'](CryptoJS['enc']['Hex']);\n }\n\n var iv = \"0123456789012345\";\n\n var allowedKeyEncodings = ['hex', 'utf8', 'base64', 'binary'];\n var allowedKeyLengths = [128, 256];\n var allowedModes = ['ecb', 'cbc'];\n\n var defaultOptions = {\n 'encryptKey': true,\n 'keyEncoding': 'utf8',\n 'keyLength': 256,\n 'mode': 'cbc'\n };\n\n function parse_options(options) {\n\n // Defaults\n options = options || {};\n if (!options['hasOwnProperty']('encryptKey')) options['encryptKey'] = defaultOptions['encryptKey'];\n if (!options['hasOwnProperty']('keyEncoding')) options['keyEncoding'] = defaultOptions['keyEncoding'];\n if (!options['hasOwnProperty']('keyLength')) options['keyLength'] = defaultOptions['keyLength'];\n if (!options['hasOwnProperty']('mode')) options['mode'] = defaultOptions['mode'];\n\n // Validation\n if (allowedKeyEncodings['indexOf'](options['keyEncoding']['toLowerCase']()) == -1) options['keyEncoding'] = defaultOptions['keyEncoding'];\n if (allowedKeyLengths['indexOf'](parseInt(options['keyLength'], 10)) == -1) options['keyLength'] = defaultOptions['keyLength'];\n if (allowedModes['indexOf'](options['mode']['toLowerCase']()) == -1) options['mode'] = defaultOptions['mode'];\n\n return options;\n\n }\n\n function decode_key(key, options) {\n if (options['keyEncoding'] == 'base64') {\n return CryptoJS['enc']['Base64']['parse'](key);\n } else if (options['keyEncoding'] == 'hex') {\n return CryptoJS['enc']['Hex']['parse'](key);\n } else {\n return key;\n }\n }\n\n function get_padded_key(key, options) {\n key = decode_key(key, options);\n if (options['encryptKey']) {\n return CryptoJS['enc']['Utf8']['parse'](SHA256(key)['slice'](0, 32));\n } else {\n return key;\n }\n }\n\n function get_mode(options) {\n if (options['mode'] == 'ecb') {\n return CryptoJS['mode']['ECB'];\n } else {\n return CryptoJS['mode']['CBC'];\n }\n }\n\n function get_iv(options) {\n return (options['mode'] == 'cbc') ? CryptoJS['enc']['Utf8']['parse'](iv) : null;\n }\n\n return {\n\n 'encrypt': function(data, key, options) {\n if (!key) return data;\n options = parse_options(options);\n var iv = get_iv(options);\n var mode = get_mode(options);\n var cipher_key = get_padded_key(key, options);\n var hex_message = JSON['stringify'](data);\n var encryptedHexArray = CryptoJS['AES']['encrypt'](hex_message, cipher_key, {'iv': iv, 'mode': mode})['ciphertext'];\n var base_64_encrypted = encryptedHexArray['toString'](CryptoJS['enc']['Base64']);\n return base_64_encrypted || data;\n },\n\n 'decrypt': function(data, key, options) {\n if (!key) return data;\n options = parse_options(options);\n var iv = get_iv(options);\n var mode = get_mode(options);\n var cipher_key = get_padded_key(key, options);\n try {\n var binary_enc = CryptoJS['enc']['Base64']['parse'](data);\n var json_plain = CryptoJS['AES']['decrypt']({'ciphertext': binary_enc}, cipher_key, {'iv': iv, 'mode': mode})['toString'](CryptoJS['enc']['Utf8']);\n var plaintext = JSON['parse'](json_plain);\n return plaintext;\n }\n catch (e) {\n return undefined;\n }\n }\n };\n}\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n/* =-========================= UTIL =============================-= */\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n\nwindow['PUBNUB'] || (function() {\n\n/**\n * UTIL LOCALS\n */\n\nvar SWF = 'https://pubnub.a.ssl.fastly.net/pubnub.swf'\n, ASYNC = 'async'\n, UA = navigator.userAgent\n, PNSDK = 'PubNub-JS-' + 'Web' + '/' + '3.7.14'\n, XORIGN = UA.indexOf('MSIE 6') == -1;\n\n/**\n * CONSOLE COMPATIBILITY\n */\nwindow.console || (window.console=window.console||{});\nconsole.log || (\n console.log =\n console.error =\n ((window.opera||{}).postError||function(){})\n);\n\n/**\n * LOCAL STORAGE OR COOKIE\n */\nvar db = (function(){\n var store = {};\n var ls = false;\n try {\n ls = window['localStorage'];\n } catch (e) { }\n var cookieGet = function(key) {\n if (document.cookie.indexOf(key) == -1) return null;\n return ((document.cookie||'').match(\n RegExp(key+'=([^;]+)')\n )||[])[1] || null;\n };\n var cookieSet = function( key, value ) {\n document.cookie = key + '=' + value +\n '; expires=Thu, 1 Aug 2030 20:00:00 UTC; path=/';\n };\n var cookieTest = (function() {\n try {\n cookieSet('pnctest', '1');\n return cookieGet('pnctest') === '1';\n } catch (e) {\n return false;\n }\n }());\n return {\n 'get' : function(key) {\n try {\n if (ls) return ls.getItem(key);\n if (cookieTest) return cookieGet(key);\n return store[key];\n } catch(e) {\n return store[key];\n }\n },\n 'set' : function( key, value ) {\n try {\n if (ls) return ls.setItem( key, value ) && 0;\n if (cookieTest) cookieSet( key, value );\n store[key] = value;\n } catch(e) {\n store[key] = value;\n }\n }\n };\n})();\n\nfunction get_hmac_SHA256(data,key) {\n var hash = CryptoJS['HmacSHA256'](data, key);\n return hash.toString(CryptoJS['enc']['Base64']);\n}\n\n/**\n * $\n * =\n * var div = $('divid');\n */\nfunction $(id) { return document.getElementById(id) }\n\n/**\n * ERROR\n * =====\n * error('message');\n */\nfunction error(message) { console['error'](message) }\n\n/**\n * SEARCH\n * ======\n * var elements = search('a div span');\n */\nfunction search( elements, start) {\n var list = [];\n each( elements.split(/\\s+/), function(el) {\n each( (start || document).getElementsByTagName(el), function(node) {\n list.push(node);\n } );\n });\n return list;\n}\n\n/**\n * BIND\n * ====\n * bind( 'keydown', search('a')[0], function(element) {\n * ...\n * } );\n */\nfunction bind( type, el, fun ) {\n each( type.split(','), function(etype) {\n var rapfun = function(e) {\n if (!e) e = window.event;\n if (!fun(e)) {\n e.cancelBubble = true;\n e.preventDefault && e.preventDefault();\n e.stopPropagation && e.stopPropagation();\n }\n };\n\n if ( el.addEventListener ) el.addEventListener( etype, rapfun, false );\n else if ( el.attachEvent ) el.attachEvent( 'on' + etype, rapfun );\n else el[ 'on' + etype ] = rapfun;\n } );\n}\n\n/**\n * UNBIND\n * ======\n * unbind( 'keydown', search('a')[0] );\n */\nfunction unbind( type, el, fun ) {\n if ( el.removeEventListener ) el.removeEventListener( type, false );\n else if ( el.detachEvent ) el.detachEvent( 'on' + type, false );\n else el[ 'on' + type ] = null;\n}\n\n/**\n * HEAD\n * ====\n * head().appendChild(elm);\n */\nfunction head() { return search('head')[0] }\n\n/**\n * ATTR\n * ====\n * var attribute = attr( node, 'attribute' );\n */\nfunction attr( node, attribute, value ) {\n if (value) node.setAttribute( attribute, value );\n else return node && node.getAttribute && node.getAttribute(attribute);\n}\n\n/**\n * CSS\n * ===\n * var obj = create('div');\n */\nfunction css( element, styles ) {\n for (var style in styles) if (styles.hasOwnProperty(style))\n try {element.style[style] = styles[style] + (\n '|width|height|top|left|'.indexOf(style) > 0 &&\n typeof styles[style] == 'number'\n ? 'px' : ''\n )}catch(e){}\n}\n\n/**\n * CREATE\n * ======\n * var obj = create('div');\n */\nfunction create(element) { return document.createElement(element) }\n\n\n/**\n * jsonp_cb\n * ========\n * var callback = jsonp_cb();\n */\nfunction jsonp_cb() { return XORIGN || FDomainRequest() ? 0 : unique() }\n\n\n\n/**\n * EVENTS\n * ======\n * PUBNUB.events.bind( 'you-stepped-on-flower', function(message) {\n * // Do Stuff with message\n * } );\n *\n * PUBNUB.events.fire( 'you-stepped-on-flower', \"message-data\" );\n * PUBNUB.events.fire( 'you-stepped-on-flower', {message:\"data\"} );\n * PUBNUB.events.fire( 'you-stepped-on-flower', [1,2,3] );\n *\n */\nvar events = {\n 'list' : {},\n 'unbind' : function( name ) { events.list[name] = [] },\n 'bind' : function( name, fun ) {\n (events.list[name] = events.list[name] || []).push(fun);\n },\n 'fire' : function( name, data ) {\n each(\n events.list[name] || [],\n function(fun) { fun(data) }\n );\n }\n};\n\n/**\n * XDR Cross Domain Request\n * ========================\n * xdr({\n * url : ['http://www.blah.com/url'],\n * success : function(response) {},\n * fail : function() {}\n * });\n */\nfunction xdr( setup ) {\n if (XORIGN || FDomainRequest()) return ajax(setup);\n\n var script = create('script')\n , callback = setup.callback\n , id = unique()\n , finished = 0\n , xhrtme = setup.timeout || DEF_TIMEOUT\n , timer = timeout( function(){done(1, {\"message\" : \"timeout\"})}, xhrtme )\n , fail = setup.fail || function(){}\n , data = setup.data || {}\n , success = setup.success || function(){}\n , append = function() { head().appendChild(script) }\n , done = function( failed, response ) {\n if (finished) return;\n finished = 1;\n\n script.onerror = null;\n clearTimeout(timer);\n\n (failed || !response) || success(response);\n\n timeout( function() {\n failed && fail();\n var s = $(id)\n , p = s && s.parentNode;\n p && p.removeChild(s);\n }, SECOND );\n };\n\n window[callback] = function(response) {\n done( 0, response );\n };\n\n if (!setup.blocking) script[ASYNC] = ASYNC;\n\n script.onerror = function() { done(1) };\n script.src = build_url( setup.url, data );\n\n attr( script, 'id', id );\n\n append();\n return done;\n}\n\n/**\n * CORS XHR Request\n * ================\n * xdr({\n * url : ['http://www.blah.com/url'],\n * success : function(response) {},\n * fail : function() {}\n * });\n */\nfunction ajax( setup ) {\n var xhr, response\n , finished = function() {\n if (loaded) return;\n loaded = 1;\n\n clearTimeout(timer);\n\n try { response = JSON['parse'](xhr.responseText); }\n catch (r) { return done(1); }\n\n complete = 1;\n success(response);\n }\n , complete = 0\n , loaded = 0\n , xhrtme = setup.timeout || DEF_TIMEOUT\n , timer = timeout( function(){done(1, {\"message\" : \"timeout\"})}, xhrtme )\n , fail = setup.fail || function(){}\n , data = setup.data || {}\n , success = setup.success || function(){}\n , async = !(setup.blocking)\n , done = function(failed,response) {\n if (complete) return;\n complete = 1;\n\n clearTimeout(timer);\n\n if (xhr) {\n xhr.onerror = xhr.onload = null;\n xhr.abort && xhr.abort();\n xhr = null;\n }\n\n failed && fail(response);\n };\n\n // Send\n try {\n xhr = FDomainRequest() ||\n window.XDomainRequest &&\n new XDomainRequest() ||\n new XMLHttpRequest();\n\n xhr.onerror = xhr.onabort = function(e){ done(\n 1, e || (xhr && xhr.responseText) || { \"error\" : \"Network Connection Error\"}\n ) };\n xhr.onload = xhr.onloadend = finished;\n xhr.onreadystatechange = function() {\n if (xhr && xhr.readyState == 4) {\n switch(xhr.status) {\n case 200:\n break;\n default:\n try {\n response = JSON['parse'](xhr.responseText);\n done(1,response);\n }\n catch (r) { return done(1, {status : xhr.status, payload : null, message : xhr.responseText}); }\n return;\n }\n }\n }\n\n var url = build_url(setup.url,data);\n\n xhr.open( 'GET', url, async );\n if (async) xhr.timeout = xhrtme;\n xhr.send();\n }\n catch(eee) {\n done(0);\n XORIGN = 0;\n return xdr(setup);\n }\n\n // Return 'done'\n return done;\n}\n\n// Test Connection State\nfunction _is_online() {\n if (!('onLine' in navigator)) return 1;\n try { return navigator['onLine'] }\n catch (e) { return true }\n}\n\n\nfunction sendBeacon(url) {\n if (!('sendBeacon' in navigator)) return false;\n\n return navigator['sendBeacon'](url);\n}\n\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n/* =-========================= PUBNUB ===========================-= */\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n\nvar PDIV = $('pubnub') || 0\n, CREATE_PUBNUB = function(setup) {\n\n // Force JSONP if requested from user.\n if (setup['jsonp']) XORIGN = 0;\n else XORIGN = UA.indexOf('MSIE 6') == -1;\n\n var SUBSCRIBE_KEY = setup['subscribe_key'] || ''\n , KEEPALIVE = (+setup['keepalive'] || DEF_KEEPALIVE) * SECOND\n , UUID = setup['uuid'] || db['get'](SUBSCRIBE_KEY+'uuid')||'';\n\n var leave_on_unload = setup['leave_on_unload'] || 0;\n\n setup['xdr'] = xdr;\n setup['db'] = db;\n setup['error'] = setup['error'] || error;\n setup['_is_online'] = _is_online;\n setup['jsonp_cb'] = jsonp_cb;\n setup['hmac_SHA256']= get_hmac_SHA256;\n setup['crypto_obj'] = crypto_obj();\n setup['sendBeacon'] = sendBeacon;\n setup['params'] = { 'pnsdk' : PNSDK }\n\n var SELF = function(setup) {\n return CREATE_PUBNUB(setup);\n };\n\n var PN = PN_API(setup);\n\n for (var prop in PN) {\n if (PN.hasOwnProperty(prop)) {\n SELF[prop] = PN[prop];\n }\n }\n SELF['css'] = css;\n SELF['$'] = $;\n SELF['create'] = create;\n SELF['bind'] = bind;\n SELF['head'] = head;\n SELF['search'] = search;\n SELF['attr'] = attr;\n SELF['events'] = events;\n SELF['init'] = SELF;\n SELF['secure'] = SELF;\n SELF['crypto_obj'] = crypto_obj(); // export to instance\n\n\n // Add Leave Functions\n bind( 'beforeunload', window, function() {\n if (leave_on_unload) SELF['each-channel'](function(ch){ SELF['LEAVE']( ch.name, 0 ) });\n return true;\n } );\n\n // Return without Testing\n if (setup['notest']) return SELF;\n\n bind( 'offline', window, SELF['offline'] );\n bind( 'offline', document, SELF['offline'] );\n\n // Return PUBNUB Socket Object\n return SELF;\n};\nCREATE_PUBNUB['init'] = CREATE_PUBNUB;\nCREATE_PUBNUB['secure'] = CREATE_PUBNUB;\nCREATE_PUBNUB['crypto_obj'] = crypto_obj(); // export to constructor\n\n// Bind for PUBNUB Readiness to Subscribe\nif (document.readyState === 'complete') {\n timeout( ready, 0 );\n}\nelse {\n bind( 'load', window, function(){ timeout( ready, 0 ) } );\n}\n\nvar pdiv = PDIV || {};\n\n// CREATE A PUBNUB GLOBAL OBJECT\nPUBNUB = CREATE_PUBNUB({\n 'notest' : 1,\n 'publish_key' : attr( pdiv, 'pub-key' ),\n 'subscribe_key' : attr( pdiv, 'sub-key' ),\n 'ssl' : !document.location.href.indexOf('https') ||\n attr( pdiv, 'ssl' ) == 'on',\n 'origin' : attr( pdiv, 'origin' ),\n 'uuid' : attr( pdiv, 'uuid' )\n});\n\n// jQuery Interface\nwindow['jQuery'] && (window['jQuery']['PUBNUB'] = CREATE_PUBNUB);\n\n// For Modern JS + Testling.js - http://testling.com/\ntypeof(module) !== 'undefined' && (module['exports'] = PUBNUB) && ready();\n\nvar pubnubs = $('pubnubs') || 0;\n\n// LEAVE NOW IF NO PDIV.\nif (!PDIV) return;\n\n// PUBNUB Flash Socket\ncss( PDIV, { 'position' : 'absolute', 'top' : -SECOND } );\n\nif ('opera' in window || attr( PDIV, 'flash' )) PDIV['innerHTML'] =\n '';\n\n// Create Interface for Opera Flash\nPUBNUB['rdx'] = function( id, data ) {\n if (!data) return FDomainRequest[id]['onerror']();\n FDomainRequest[id]['responseText'] = unescape(data);\n FDomainRequest[id]['onload']();\n};\n\nfunction FDomainRequest() {\n if (!pubnubs || !pubnubs['get']) return 0;\n\n var fdomainrequest = {\n 'id' : FDomainRequest['id']++,\n 'send' : function() {},\n 'abort' : function() { fdomainrequest['id'] = {} },\n 'open' : function( method, url ) {\n FDomainRequest[fdomainrequest['id']] = fdomainrequest;\n pubnubs['get']( fdomainrequest['id'], url );\n }\n };\n\n return fdomainrequest;\n}\nFDomainRequest['id'] = SECOND;\n\n})();\n(function(){\n\n// ---------------------------------------------------------------------------\n// WEBSOCKET INTERFACE\n// ---------------------------------------------------------------------------\nvar WS = PUBNUB['ws'] = function( url, protocols ) {\n if (!(this instanceof WS)) return new WS( url, protocols );\n\n var self = this\n , url = self.url = url || ''\n , protocol = self.protocol = protocols || 'Sec-WebSocket-Protocol'\n , bits = url.split('/')\n , setup = {\n 'ssl' : bits[0] === 'wss:'\n ,'origin' : bits[2]\n ,'publish_key' : bits[3]\n ,'subscribe_key' : bits[4]\n ,'channel' : bits[5]\n };\n\n // READY STATES\n self['CONNECTING'] = 0; // The connection is not yet open.\n self['OPEN'] = 1; // The connection is open and ready to communicate.\n self['CLOSING'] = 2; // The connection is in the process of closing.\n self['CLOSED'] = 3; // The connection is closed or couldn't be opened.\n\n // CLOSE STATES\n self['CLOSE_NORMAL'] = 1000; // Normal Intended Close; completed.\n self['CLOSE_GOING_AWAY'] = 1001; // Closed Unexpecttedly.\n self['CLOSE_PROTOCOL_ERROR'] = 1002; // Server: Not Supported.\n self['CLOSE_UNSUPPORTED'] = 1003; // Server: Unsupported Protocol.\n self['CLOSE_TOO_LARGE'] = 1004; // Server: Too Much Data.\n self['CLOSE_NO_STATUS'] = 1005; // Server: No reason.\n self['CLOSE_ABNORMAL'] = 1006; // Abnormal Disconnect.\n\n // Events Default\n self['onclose'] = self['onerror'] =\n self['onmessage'] = self['onopen'] =\n self['onsend'] = function(){};\n\n // Attributes\n self['binaryType'] = '';\n self['extensions'] = '';\n self['bufferedAmount'] = 0;\n self['trasnmitting'] = false;\n self['buffer'] = [];\n self['readyState'] = self['CONNECTING'];\n\n // Close if no setup.\n if (!url) {\n self['readyState'] = self['CLOSED'];\n self['onclose']({\n 'code' : self['CLOSE_ABNORMAL'],\n 'reason' : 'Missing URL',\n 'wasClean' : true\n });\n return self;\n }\n\n // PubNub WebSocket Emulation\n self.pubnub = PUBNUB['init'](setup);\n self.pubnub.setup = setup;\n self.setup = setup;\n\n self.pubnub['subscribe']({\n 'restore' : false,\n 'channel' : setup['channel'],\n 'disconnect' : self['onerror'],\n 'reconnect' : self['onopen'],\n 'error' : function() {\n self['onclose']({\n 'code' : self['CLOSE_ABNORMAL'],\n 'reason' : 'Missing URL',\n 'wasClean' : false\n });\n },\n 'callback' : function(message) {\n self['onmessage']({ 'data' : message });\n },\n 'connect' : function() {\n self['readyState'] = self['OPEN'];\n self['onopen']();\n }\n });\n};\n\n// ---------------------------------------------------------------------------\n// WEBSOCKET SEND\n// ---------------------------------------------------------------------------\nWS.prototype.send = function(data) {\n var self = this;\n self.pubnub['publish']({\n 'channel' : self.pubnub.setup['channel'],\n 'message' : data,\n 'callback' : function(response) {\n self['onsend']({ 'data' : response });\n }\n });\n};\n\n// ---------------------------------------------------------------------------\n// WEBSOCKET CLOSE\n// ---------------------------------------------------------------------------\nWS.prototype.close = function() {\n var self = this;\n self.pubnub['unsubscribe']({ 'channel' : self.pubnub.setup['channel'] });\n self['readyState'] = self['CLOSED'];\n self['onclose']({});\n};\n\n})();\n/*\nCryptoJS v3.1.2\ncode.google.com/p/crypto-js\n(c) 2009-2013 by Jeff Mott. All rights reserved.\ncode.google.com/p/crypto-js/wiki/License\n*/\nvar CryptoJS=CryptoJS||function(h,s){var f={},g=f.lib={},q=function(){},m=g.Base={extend:function(a){q.prototype=this;var c=new q;a&&c.mixIn(a);c.hasOwnProperty(\"init\")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty(\"toString\")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},\nr=g.WordArray=m.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=s?c:4*a.length},toString:function(a){return(a||k).stringify(this)},concat:function(a){var c=this.words,d=a.words,b=this.sigBytes;a=a.sigBytes;this.clamp();if(b%4)for(var e=0;e>>2]|=(d[e>>>2]>>>24-8*(e%4)&255)<<24-8*((b+e)%4);else if(65535>>2]=d[e>>>2];else c.push.apply(c,d);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<\n32-8*(c%4);a.length=h.ceil(c/4)},clone:function(){var a=m.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],d=0;d>>2]>>>24-8*(b%4)&255;d.push((e>>>4).toString(16));d.push((e&15).toString(16))}return d.join(\"\")},parse:function(a){for(var c=a.length,d=[],b=0;b>>3]|=parseInt(a.substr(b,\n2),16)<<24-4*(b%8);return new r.init(d,c/2)}},n=l.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var d=[],b=0;b>>2]>>>24-8*(b%4)&255));return d.join(\"\")},parse:function(a){for(var c=a.length,d=[],b=0;b>>2]|=(a.charCodeAt(b)&255)<<24-8*(b%4);return new r.init(d,c)}},j=l.Utf8={stringify:function(a){try{return decodeURIComponent(escape(n.stringify(a)))}catch(c){throw Error(\"Malformed UTF-8 data\");}},parse:function(a){return n.parse(unescape(encodeURIComponent(a)))}},\nu=g.BufferedBlockAlgorithm=m.extend({reset:function(){this._data=new r.init;this._nDataBytes=0},_append:function(a){\"string\"==typeof a&&(a=j.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,d=c.words,b=c.sigBytes,e=this.blockSize,f=b/(4*e),f=a?h.ceil(f):h.max((f|0)-this._minBufferSize,0);a=f*e;b=h.min(4*a,b);if(a){for(var g=0;gn;){var j;a:{j=k;for(var u=h.sqrt(j),t=2;t<=u;t++)if(!(j%t)){j=!1;break a}j=!0}j&&(8>n&&(m[n]=l(h.pow(k,0.5))),r[n]=l(h.pow(k,1/3)),n++);k++}var a=[],f=f.SHA256=q.extend({_doReset:function(){this._hash=new g.init(m.slice(0))},_doProcessBlock:function(c,d){for(var b=this._hash.words,e=b[0],f=b[1],g=b[2],j=b[3],h=b[4],m=b[5],n=b[6],q=b[7],p=0;64>p;p++){if(16>p)a[p]=\nc[d+p]|0;else{var k=a[p-15],l=a[p-2];a[p]=((k<<25|k>>>7)^(k<<14|k>>>18)^k>>>3)+a[p-7]+((l<<15|l>>>17)^(l<<13|l>>>19)^l>>>10)+a[p-16]}k=q+((h<<26|h>>>6)^(h<<21|h>>>11)^(h<<7|h>>>25))+(h&m^~h&n)+r[p]+a[p];l=((e<<30|e>>>2)^(e<<19|e>>>13)^(e<<10|e>>>22))+(e&f^e&g^f&g);q=n;n=m;m=h;h=j+k|0;j=g;g=f;f=e;e=k+l|0}b[0]=b[0]+e|0;b[1]=b[1]+f|0;b[2]=b[2]+g|0;b[3]=b[3]+j|0;b[4]=b[4]+h|0;b[5]=b[5]+m|0;b[6]=b[6]+n|0;b[7]=b[7]+q|0},_doFinalize:function(){var a=this._data,d=a.words,b=8*this._nDataBytes,e=8*a.sigBytes;\nd[e>>>5]|=128<<24-e%32;d[(e+64>>>9<<4)+14]=h.floor(b/4294967296);d[(e+64>>>9<<4)+15]=b;a.sigBytes=4*d.length;this._process();return this._hash},clone:function(){var a=q.clone.call(this);a._hash=this._hash.clone();return a}});s.SHA256=q._createHelper(f);s.HmacSHA256=q._createHmacHelper(f)})(Math);\n\n// HMAC SHA256\n(function(){var h=CryptoJS,s=h.enc.Utf8;h.algo.HMAC=h.lib.Base.extend({init:function(f,g){f=this._hasher=new f.init;\"string\"==typeof g&&(g=s.parse(g));var h=f.blockSize,m=4*h;g.sigBytes>m&&(g=f.finalize(g));g.clamp();for(var r=this._oKey=g.clone(),l=this._iKey=g.clone(),k=r.words,n=l.words,j=0;j>>2]>>>24-8*(r%4)&255)<<16|(l[r+1>>>2]>>>24-8*((r+1)%4)&255)<<8|l[r+2>>>2]>>>24-8*((r+2)%4)&255,v=0;4>v&&r+0.75*v>>6*(3-v)&63));if(l=t.charAt(64))for(;d.length%4;)d.push(l);return d.join(\"\")},parse:function(d){var l=d.length,s=this._map,t=s.charAt(64);t&&(t=d.indexOf(t),-1!=t&&(l=t));for(var t=[],r=0,w=0;w<\nl;w++)if(w%4){var v=s.indexOf(d.charAt(w-1))<<2*(w%4),b=s.indexOf(d.charAt(w))>>>6-2*(w%4);t[r>>>2]|=(v|b)<<24-8*(r%4);r++}return p.create(t,r)},_map:\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\"}})();\n\n// BlockCipher\n(function(u){function p(b,n,a,c,e,j,k){b=b+(n&a|~n&c)+e+k;return(b<>>32-j)+n}function d(b,n,a,c,e,j,k){b=b+(n&c|a&~c)+e+k;return(b<>>32-j)+n}function l(b,n,a,c,e,j,k){b=b+(n^a^c)+e+k;return(b<>>32-j)+n}function s(b,n,a,c,e,j,k){b=b+(a^(n|~c))+e+k;return(b<>>32-j)+n}for(var t=CryptoJS,r=t.lib,w=r.WordArray,v=r.Hasher,r=t.algo,b=[],x=0;64>x;x++)b[x]=4294967296*u.abs(u.sin(x+1))|0;r=r.MD5=v.extend({_doReset:function(){this._hash=new w.init([1732584193,4023233417,2562383102,271733878])},\n_doProcessBlock:function(q,n){for(var a=0;16>a;a++){var c=n+a,e=q[c];q[c]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360}var a=this._hash.words,c=q[n+0],e=q[n+1],j=q[n+2],k=q[n+3],z=q[n+4],r=q[n+5],t=q[n+6],w=q[n+7],v=q[n+8],A=q[n+9],B=q[n+10],C=q[n+11],u=q[n+12],D=q[n+13],E=q[n+14],x=q[n+15],f=a[0],m=a[1],g=a[2],h=a[3],f=p(f,m,g,h,c,7,b[0]),h=p(h,f,m,g,e,12,b[1]),g=p(g,h,f,m,j,17,b[2]),m=p(m,g,h,f,k,22,b[3]),f=p(f,m,g,h,z,7,b[4]),h=p(h,f,m,g,r,12,b[5]),g=p(g,h,f,m,t,17,b[6]),m=p(m,g,h,f,w,22,b[7]),\nf=p(f,m,g,h,v,7,b[8]),h=p(h,f,m,g,A,12,b[9]),g=p(g,h,f,m,B,17,b[10]),m=p(m,g,h,f,C,22,b[11]),f=p(f,m,g,h,u,7,b[12]),h=p(h,f,m,g,D,12,b[13]),g=p(g,h,f,m,E,17,b[14]),m=p(m,g,h,f,x,22,b[15]),f=d(f,m,g,h,e,5,b[16]),h=d(h,f,m,g,t,9,b[17]),g=d(g,h,f,m,C,14,b[18]),m=d(m,g,h,f,c,20,b[19]),f=d(f,m,g,h,r,5,b[20]),h=d(h,f,m,g,B,9,b[21]),g=d(g,h,f,m,x,14,b[22]),m=d(m,g,h,f,z,20,b[23]),f=d(f,m,g,h,A,5,b[24]),h=d(h,f,m,g,E,9,b[25]),g=d(g,h,f,m,k,14,b[26]),m=d(m,g,h,f,v,20,b[27]),f=d(f,m,g,h,D,5,b[28]),h=d(h,f,\nm,g,j,9,b[29]),g=d(g,h,f,m,w,14,b[30]),m=d(m,g,h,f,u,20,b[31]),f=l(f,m,g,h,r,4,b[32]),h=l(h,f,m,g,v,11,b[33]),g=l(g,h,f,m,C,16,b[34]),m=l(m,g,h,f,E,23,b[35]),f=l(f,m,g,h,e,4,b[36]),h=l(h,f,m,g,z,11,b[37]),g=l(g,h,f,m,w,16,b[38]),m=l(m,g,h,f,B,23,b[39]),f=l(f,m,g,h,D,4,b[40]),h=l(h,f,m,g,c,11,b[41]),g=l(g,h,f,m,k,16,b[42]),m=l(m,g,h,f,t,23,b[43]),f=l(f,m,g,h,A,4,b[44]),h=l(h,f,m,g,u,11,b[45]),g=l(g,h,f,m,x,16,b[46]),m=l(m,g,h,f,j,23,b[47]),f=s(f,m,g,h,c,6,b[48]),h=s(h,f,m,g,w,10,b[49]),g=s(g,h,f,m,\nE,15,b[50]),m=s(m,g,h,f,r,21,b[51]),f=s(f,m,g,h,u,6,b[52]),h=s(h,f,m,g,k,10,b[53]),g=s(g,h,f,m,B,15,b[54]),m=s(m,g,h,f,e,21,b[55]),f=s(f,m,g,h,v,6,b[56]),h=s(h,f,m,g,x,10,b[57]),g=s(g,h,f,m,t,15,b[58]),m=s(m,g,h,f,D,21,b[59]),f=s(f,m,g,h,z,6,b[60]),h=s(h,f,m,g,C,10,b[61]),g=s(g,h,f,m,j,15,b[62]),m=s(m,g,h,f,A,21,b[63]);a[0]=a[0]+f|0;a[1]=a[1]+m|0;a[2]=a[2]+g|0;a[3]=a[3]+h|0},_doFinalize:function(){var b=this._data,n=b.words,a=8*this._nDataBytes,c=8*b.sigBytes;n[c>>>5]|=128<<24-c%32;var e=u.floor(a/\n4294967296);n[(c+64>>>9<<4)+15]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360;n[(c+64>>>9<<4)+14]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;b.sigBytes=4*(n.length+1);this._process();b=this._hash;n=b.words;for(a=0;4>a;a++)c=n[a],n[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return b},clone:function(){var b=v.clone.call(this);b._hash=this._hash.clone();return b}});t.MD5=v._createHelper(r);t.HmacMD5=v._createHmacHelper(r)})(Math);\n(function(){var u=CryptoJS,p=u.lib,d=p.Base,l=p.WordArray,p=u.algo,s=p.EvpKDF=d.extend({cfg:d.extend({keySize:4,hasher:p.MD5,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(d,r){for(var p=this.cfg,s=p.hasher.create(),b=l.create(),u=b.words,q=p.keySize,p=p.iterations;u.length>>2]&255}};d.BlockCipher=v.extend({cfg:v.cfg.extend({mode:b,padding:q}),reset:function(){v.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;this._mode=c.call(a,\nthis,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var n=d.CipherParams=l.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),b=(p.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;return(a?s.create([1398893684,\n1701076831]).concat(a).concat(b):b).toString(r)},parse:function(a){a=r.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=s.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return n.create({ciphertext:a,salt:c})}},a=d.SerializableCipher=l.extend({cfg:l.extend({format:b}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var l=a.createEncryptor(c,d);b=l.finalize(b);l=l.cfg;return n.create({ciphertext:b,key:c,iv:l.iv,algorithm:a,mode:l.mode,padding:l.padding,blockSize:a.blockSize,formatter:d.format})},\ndecrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return\"string\"==typeof a?b.parse(a,this):a}}),p=(p.kdf={}).OpenSSL={execute:function(a,b,c,d){d||(d=s.random(8));a=w.create({keySize:b+c}).compute(a,d);c=s.create(a.words.slice(b),4*c);a.sigBytes=4*b;return n.create({key:a,iv:c,salt:d})}},c=d.PasswordBasedCipher=a.extend({cfg:a.cfg.extend({kdf:p}),encrypt:function(b,c,d,l){l=this.cfg.extend(l);d=l.kdf.execute(d,\nb.keySize,b.ivSize);l.iv=d.iv;b=a.encrypt.call(this,b,c,d.key,l);b.mixIn(d);return b},decrypt:function(b,c,d,l){l=this.cfg.extend(l);c=this._parse(c,l.format);d=l.kdf.execute(d,b.keySize,b.ivSize,c.salt);l.iv=d.iv;return a.decrypt.call(this,b,c,d.key,l)}})}();\n\n// AES\n(function(){for(var u=CryptoJS,p=u.lib.BlockCipher,d=u.algo,l=[],s=[],t=[],r=[],w=[],v=[],b=[],x=[],q=[],n=[],a=[],c=0;256>c;c++)a[c]=128>c?c<<1:c<<1^283;for(var e=0,j=0,c=0;256>c;c++){var k=j^j<<1^j<<2^j<<3^j<<4,k=k>>>8^k&255^99;l[e]=k;s[k]=e;var z=a[e],F=a[z],G=a[F],y=257*a[k]^16843008*k;t[e]=y<<24|y>>>8;r[e]=y<<16|y>>>16;w[e]=y<<8|y>>>24;v[e]=y;y=16843009*G^65537*F^257*z^16843008*e;b[k]=y<<24|y>>>8;x[k]=y<<16|y>>>16;q[k]=y<<8|y>>>24;n[k]=y;e?(e=z^a[a[a[G^z]]],j^=a[a[j]]):e=j=1}var H=[0,1,2,4,8,\n16,32,64,128,27,54],d=d.AES=p.extend({_doReset:function(){for(var a=this._key,c=a.words,d=a.sigBytes/4,a=4*((this._nRounds=d+6)+1),e=this._keySchedule=[],j=0;j>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255]):(k=k<<8|k>>>24,k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255],k^=H[j/d|0]<<24);e[j]=e[j-d]^k}c=this._invKeySchedule=[];for(d=0;dd||4>=j?k:b[l[k>>>24]]^x[l[k>>>16&255]]^q[l[k>>>\n8&255]]^n[l[k&255]]},encryptBlock:function(a,b){this._doCryptBlock(a,b,this._keySchedule,t,r,w,v,l)},decryptBlock:function(a,c){var d=a[c+1];a[c+1]=a[c+3];a[c+3]=d;this._doCryptBlock(a,c,this._invKeySchedule,b,x,q,n,s);d=a[c+1];a[c+1]=a[c+3];a[c+3]=d},_doCryptBlock:function(a,b,c,d,e,j,l,f){for(var m=this._nRounds,g=a[b]^c[0],h=a[b+1]^c[1],k=a[b+2]^c[2],n=a[b+3]^c[3],p=4,r=1;r>>24]^e[h>>>16&255]^j[k>>>8&255]^l[n&255]^c[p++],s=d[h>>>24]^e[k>>>16&255]^j[n>>>8&255]^l[g&255]^c[p++],t=\nd[k>>>24]^e[n>>>16&255]^j[g>>>8&255]^l[h&255]^c[p++],n=d[n>>>24]^e[g>>>16&255]^j[h>>>8&255]^l[k&255]^c[p++],g=q,h=s,k=t;q=(f[g>>>24]<<24|f[h>>>16&255]<<16|f[k>>>8&255]<<8|f[n&255])^c[p++];s=(f[h>>>24]<<24|f[k>>>16&255]<<16|f[n>>>8&255]<<8|f[g&255])^c[p++];t=(f[k>>>24]<<24|f[n>>>16&255]<<16|f[g>>>8&255]<<8|f[h&255])^c[p++];n=(f[n>>>24]<<24|f[g>>>16&255]<<16|f[h>>>8&255]<<8|f[k&255])^c[p++];a[b]=q;a[b+1]=s;a[b+2]=t;a[b+3]=n},keySize:8});u.AES=p._createHelper(d)})();\n\n// Mode ECB\nCryptoJS.mode.ECB = (function () {\n var ECB = CryptoJS.lib.BlockCipherMode.extend();\n\n ECB.Encryptor = ECB.extend({\n processBlock: function (words, offset) {\n this._cipher.encryptBlock(words, offset);\n }\n });\n\n ECB.Decryptor = ECB.extend({\n processBlock: function (words, offset) {\n this._cipher.decryptBlock(words, offset);\n }\n });\n\n return ECB;\n}());// Moved to hmac-sha-256.js\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(7)(module)))\n\n/***/ },\n/* 11 */\n/***/ function(module, exports) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar Cache = (function () {\n _createClass(Cache, null, [{\n key: 'defaultPrefix',\n value: 'rc-',\n enumerable: true\n }]);\n\n function Cache(storage, prefix) {\n _classCallCheck(this, Cache);\n\n this.setPrefix(prefix);\n this._storage = storage;\n }\n\n Cache.prototype.setPrefix = function setPrefix(prefix) {\n this._prefix = prefix || Cache.defaultPrefix;\n return this;\n };\n\n Cache.prototype.setItem = function setItem(key, data) {\n this._storage[this._prefixKey(key)] = JSON.stringify(data);\n return this;\n };\n\n Cache.prototype.removeItem = function removeItem(key) {\n delete this._storage[this._prefixKey(key)];\n return this;\n };\n\n Cache.prototype.getItem = function getItem(key) {\n var item = this._storage[this._prefixKey(key)];\n if (!item) return null;\n return JSON.parse(item);\n };\n\n Cache.prototype.clean = function clean() {\n\n for (var key in this._storage) {\n\n if (!this._storage.hasOwnProperty(key)) continue;\n\n if (key.indexOf(this._prefix) === 0) {\n delete this._storage[key];\n }\n }\n\n return this;\n };\n\n Cache.prototype._prefixKey = function _prefixKey(key) {\n return this._prefix + key;\n };\n\n return Cache;\n})();\n\nexports['default'] = Cache;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 12 */\n/***/ function(module, exports) {\n\n'use strict';\n\nexports.__esModule = true;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar Observable = (function () {\n function Observable() {\n _classCallCheck(this, Observable);\n\n this.off();\n }\n\n Observable.prototype.hasListeners = function hasListeners(event) {\n return event in this._listeners;\n };\n\n Observable.prototype.on = function on(events, callback) {\n var _this = this;\n\n if (typeof events == 'string') events = [events];\n if (!events) throw new Error('No events to subscribe to');\n if (typeof callback !== 'function') throw new Error('Callback must be a function');\n\n events.forEach(function (event) {\n\n if (!_this.hasListeners(event)) _this._listeners[event] = [];\n\n _this._listeners[event].push(callback);\n });\n\n return this;\n };\n\n Observable.prototype.emit = function emit(event) {\n var _this2 = this;\n\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var result = null;\n\n if (!this.hasListeners(event)) return null;\n\n this._listeners[event].some(function (callback) {\n\n result = callback.apply(_this2, args);\n return result === false;\n });\n\n return result;\n };\n\n Observable.prototype.off = function off(event, callback) {\n var _this3 = this;\n\n if (!event) {\n\n this._listeners = {};\n } else {\n\n if (!callback) {\n\n delete this._listeners[event];\n } else {\n\n if (!this.hasListeners(event)) return this;\n\n this._listeners[event].forEach(function (cb, i) {\n\n if (cb === callback) delete _this3._listeners[event][i];\n });\n }\n }\n\n return this;\n };\n\n return Observable;\n})();\n\nexports['default'] = Observable;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 13 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _coreExternals = __webpack_require__(3);\n\nvar _coreUtils = __webpack_require__(2);\n\nvar _Utils = __webpack_require__(14);\n\nvar _coreObservable = __webpack_require__(12);\n\nvar _coreObservable2 = _interopRequireDefault(_coreObservable);\n\nvar _ApiResponse = __webpack_require__(15);\n\nvar _ApiResponse2 = _interopRequireDefault(_ApiResponse);\n\nvar Client = (function (_Observable) {\n _inherits(Client, _Observable);\n\n function Client() {\n _classCallCheck(this, Client);\n\n _Observable.apply(this, arguments);\n\n this.events = {\n beforeRequest: 'beforeRequest',\n requestSuccess: 'requestSuccess',\n requestError: 'requestError'\n };\n }\n\n /**\n * @name IApiError\n * @property {string} stack\n * @property {string} originalMessage\n * @property {ApiResponse} apiResponse\n */\n\n /**\n * @param {Request} request\n * @return {Promise}\n */\n\n Client.prototype.sendRequest = function sendRequest(request) {\n var apiResponse;\n return regeneratorRuntime.async(function sendRequest$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n apiResponse = new _ApiResponse2['default'](request);\n context$2$0.prev = 1;\n\n //TODO Stop request if listeners return false\n this.emit(this.events.beforeRequest, apiResponse);\n\n context$2$0.next = 5;\n return regeneratorRuntime.awrap(this._loadResponse(request));\n\n case 5:\n apiResponse._response = context$2$0.sent;\n\n if (!(apiResponse._isMultipart() || apiResponse._isJson())) {\n context$2$0.next = 10;\n break;\n }\n\n context$2$0.next = 9;\n return regeneratorRuntime.awrap(apiResponse.response().text());\n\n case 9:\n apiResponse._text = context$2$0.sent;\n\n case 10:\n if (apiResponse.ok()) {\n context$2$0.next = 12;\n break;\n }\n\n throw new Error('Response has unsuccessful status');\n\n case 12:\n\n this.emit(this.events.requestSuccess, apiResponse);\n\n return context$2$0.abrupt('return', apiResponse);\n\n case 16:\n context$2$0.prev = 16;\n context$2$0.t0 = context$2$0['catch'](1);\n\n if (!context$2$0.t0.apiResponse) context$2$0.t0 = this.makeError(context$2$0.t0, apiResponse);\n\n this.emit(this.events.requestError, context$2$0.t0);\n\n throw context$2$0.t0;\n\n case 21:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[1, 16]]);\n };\n\n /**\n * @param {Request} request\n * @return {Promise}\n * @private\n */\n\n Client.prototype._loadResponse = function _loadResponse(request) {\n return regeneratorRuntime.async(function _loadResponse$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.next = 2;\n return regeneratorRuntime.awrap(_coreExternals.fetch.call(null, request));\n\n case 2:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 3:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n /**\n * Wraps the JS Error object with transaction information\n * @param {Error|IApiError} e\n * @param {ApiResponse} apiResponse\n * @return {IApiError}\n */\n\n Client.prototype.makeError = function makeError(e, apiResponse) {\n\n // Wrap only if regular error\n if (!e.hasOwnProperty('apiResponse') && !e.hasOwnProperty('originalMessage')) {\n\n e.apiResponse = apiResponse;\n e.originalMessage = e.message;\n e.message = apiResponse && apiResponse.error(true) || e.originalMessage;\n }\n\n return e;\n };\n\n /**\n *\n * @param {object} init\n * @param {object} [init.url]\n * @param {object} [init.body]\n * @param {string} [init.method]\n * @param {object} [init.query]\n * @param {object} [init.headers]\n * @return {Request}\n */\n\n Client.prototype.createRequest = function createRequest(init) {\n\n init = init || {};\n init.headers = init.headers || {};\n\n // Sanity checks\n if (!init.url) throw new Error('Url is not defined');\n if (!init.method) init.method = 'GET';\n if (init.method && Client._allowedMethods.indexOf(init.method) < 0) throw new Error('Method has wrong value: ' + init.method);\n\n // Defaults\n init.credentials = init.credentials || 'include';\n init.mode = init.mode || 'cors';\n\n // Append Query String\n if (init.query) {\n init.url = init.url + (init.url.indexOf('?') > -1 ? '&' : '?') + _coreUtils.queryStringify(init.query);\n }\n\n if (!_Utils.findHeaderName('Accept', init.headers)) {\n init.headers['Accept'] = _ApiResponse2['default']._jsonContentType;\n }\n\n // Serialize body\n //TODO Check that body is a plain object\n if (typeof init.body !== 'string' || !init.body) {\n\n var contentTypeHeaderName = _Utils.findHeaderName(_ApiResponse2['default']._contentType, init.headers);\n\n if (!contentTypeHeaderName) {\n contentTypeHeaderName = _ApiResponse2['default']._contentType;\n init.headers[contentTypeHeaderName] = _ApiResponse2['default']._jsonContentType;\n }\n\n var contentType = init.headers[contentTypeHeaderName];\n\n // Assign a new encoded body\n if (contentType.indexOf(_ApiResponse2['default']._jsonContentType) > -1) {\n init.body = JSON.stringify(init.body);\n } else if (contentType.indexOf(_ApiResponse2['default']._urlencodedContentType) > -1) {\n init.body = _coreUtils.queryStringify(init.body);\n }\n }\n\n // Create a request with encoded body\n var req = new _coreExternals.Request(init.url, init);\n\n // Keep the original body accessible directly (for mocks)\n req.originalBody = init.body;\n\n return req;\n };\n\n _createClass(Client, null, [{\n key: '_allowedMethods',\n value: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'],\n enumerable: true\n }]);\n\n return Client;\n})(_coreObservable2['default']);\n\nexports['default'] = Client;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 14 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\nexports.createResponse = createResponse;\nexports.findHeaderName = findHeaderName;\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nvar _coreExternals = __webpack_require__(3);\n\nvar _coreUtils = __webpack_require__(2);\n\nvar utils = _interopRequireWildcard(_coreUtils);\n\n/**\n * Creates a response\n * @param stringBody\n * @param init\n * @return {Response}\n */\n\nfunction createResponse(stringBody, init) {\n\n init = init || {};\n\n var response = new _coreExternals.Response(stringBody, init);\n\n //TODO Wait for https://github.com/bitinn/node-fetch/issues/38\n if (utils.isNodeJS()) {\n\n response._text = stringBody;\n response._decode = function () {\n return this._text;\n };\n }\n\n return response;\n}\n\nfunction findHeaderName(name, headers) {\n name = name.toLowerCase();\n return Object.keys(headers).reduce(function (res, key) {\n if (res) return res;\n if (name == key.toLowerCase()) return key;\n return res;\n }, null);\n}\n\n/***/ },\n/* 15 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _coreExternals = __webpack_require__(3);\n\nvar _Utils = __webpack_require__(14);\n\nvar utils = _interopRequireWildcard(_Utils);\n\nvar ApiResponse = (function () {\n _createClass(ApiResponse, null, [{\n key: '_contentType',\n value: 'Content-Type',\n enumerable: true\n }, {\n key: '_jsonContentType',\n value: 'application/json',\n enumerable: true\n }, {\n key: '_multipartContentType',\n value: 'multipart/mixed',\n enumerable: true\n }, {\n key: '_urlencodedContentType',\n value: 'application/x-www-form-urlencoded',\n enumerable: true\n }, {\n key: '_headerSeparator',\n value: ':',\n enumerable: true\n }, {\n key: '_bodySeparator',\n value: '\\n\\n',\n enumerable: true\n }, {\n key: '_boundarySeparator',\n value: '--',\n\n /**\n * @param {Request} request\n * @param {Response} response\n * @param {string} responseText\n */\n enumerable: true\n }]);\n\n function ApiResponse(request, response, responseText) {\n _classCallCheck(this, ApiResponse);\n\n /** @type {Request} */\n this._request = request;\n\n /** @type {Response} */\n this._response = response;\n\n this._text = responseText;\n this._json = null;\n this._multipart = [];\n }\n\n /**\n * @return {Response}\n */\n\n ApiResponse.prototype.response = function response() {\n return this._response;\n };\n\n /**\n * @return {Request}\n */\n\n ApiResponse.prototype.request = function request() {\n return this._request;\n };\n\n /**\n * @return {boolean}\n */\n\n ApiResponse.prototype.ok = function ok() {\n return this._response && this._response.ok;\n };\n\n /**\n * @return {string}\n */\n\n ApiResponse.prototype.text = function text() {\n if (!this._isJson() && !this._isMultipart()) throw new Error('Response is not text');\n return this._text;\n };\n\n /**\n * @return {object}\n */\n\n ApiResponse.prototype.json = function json() {\n if (!this._isJson()) throw new Error('Response is not JSON');\n if (!this._json) {\n this._json = this._text ? JSON.parse(this._text) : null;\n }\n return this._json;\n };\n\n /**\n * @param [skipOKCheck]\n * @return {string}\n */\n\n ApiResponse.prototype.error = function error(skipOKCheck) {\n\n if (this.ok() && !skipOKCheck) return null;\n\n var message = (this._response && this._response.status ? this._response.status + ' ' : '') + (this._response && this._response.statusText ? this._response.statusText : '');\n\n try {\n\n if (this.json().message) message = this.json().message;\n if (this.json().error_description) message = this.json().error_description;\n if (this.json().description) message = this.json().description;\n } catch (e) {}\n\n return message;\n };\n\n /**\n * @return {ApiResponse[]}\n */\n\n ApiResponse.prototype.multipart = function multipart() {\n\n if (!this._isMultipart()) throw new Error('Response is not multipart');\n\n if (!this._multipart.length) {\n\n // Step 1. Split multipart response\n\n var text = this.text();\n\n if (!text) throw new Error('No response body');\n\n var boundary = this._getContentType().match(/boundary=([^;]+)/i)[1];\n\n if (!boundary) throw new Error('Cannot find boundary');\n\n var parts = text.toString().split(ApiResponse._boundarySeparator + boundary);\n\n if (parts[0].trim() === '') parts.shift();\n if (parts[parts.length - 1].trim() == ApiResponse._boundarySeparator) parts.pop();\n\n if (parts.length < 1) throw new Error('No parts in body');\n\n // Step 2. Parse status info\n\n var statusInfo = ApiResponse.create(parts.shift(), this._response.status, this._response.statusText).json();\n\n // Step 3. Parse all other parts\n\n this._multipart = parts.map(function (part, i) {\n\n var status = statusInfo.response[i].status;\n\n return ApiResponse.create(part, status);\n });\n }\n\n return this._multipart;\n };\n\n ApiResponse.prototype._isContentType = function _isContentType(contentType) {\n return this._getContentType().indexOf(contentType) > -1;\n };\n\n ApiResponse.prototype._getContentType = function _getContentType() {\n return this._response.headers.get(ApiResponse._contentType) || '';\n };\n\n ApiResponse.prototype._isMultipart = function _isMultipart() {\n return this._isContentType(ApiResponse._multipartContentType);\n };\n\n ApiResponse.prototype._isUrlEncoded = function _isUrlEncoded() {\n return this._isContentType(ApiResponse._urlencodedContentType);\n };\n\n ApiResponse.prototype._isJson = function _isJson() {\n return this._isContentType(ApiResponse._jsonContentType);\n };\n\n /**\n * Method is used to create ApiResponse object from string parts of multipart/mixed response\n * @param {string} [text]\n * @param {number} [status]\n * @param {string} [statusText]\n * @return {ApiResponse}\n */\n\n ApiResponse.create = function create(text, status, statusText) {\n\n text = text || '';\n status = status || 200;\n statusText = statusText || 'OK';\n\n text = text.replace(/\\r/g, '');\n\n var headers = new _coreExternals.Headers(),\n headersAndBody = text.split(ApiResponse._bodySeparator),\n headersText = headersAndBody.length > 1 ? headersAndBody.shift() : '';\n\n text = headersAndBody.join(ApiResponse._bodySeparator);\n\n (headersText || '').split('\\n').forEach(function (header) {\n\n var split = header.trim().split(ApiResponse._headerSeparator),\n key = split.shift().trim(),\n value = split.join(ApiResponse._headerSeparator).trim();\n\n if (key) headers.append(key, value);\n });\n\n return new ApiResponse(null, utils.createResponse(text, {\n headers: headers,\n status: status,\n statusText: statusText\n }), text);\n };\n\n return ApiResponse;\n})();\n\nexports['default'] = ApiResponse;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 16 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _Registry = __webpack_require__(17);\n\nvar _Registry2 = _interopRequireDefault(_Registry);\n\nvar _httpClient = __webpack_require__(13);\n\nvar _httpClient2 = _interopRequireDefault(_httpClient);\n\nvar Client = (function (_HttpClient) {\n _inherits(Client, _HttpClient);\n\n function Client() {\n _classCallCheck(this, Client);\n\n _HttpClient.call(this);\n this._registry = new _Registry2['default']();\n }\n\n Client.prototype.registry = function registry() {\n return this._registry;\n };\n\n Client.prototype._loadResponse = function _loadResponse(request) {\n var mock;\n return regeneratorRuntime.async(function _loadResponse$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n mock = this._registry.find(request);\n context$2$0.next = 3;\n return regeneratorRuntime.awrap(mock.getResponse(request));\n\n case 3:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 4:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n return Client;\n})(_httpClient2['default']);\n\nexports['default'] = Client;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 17 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _Mock = __webpack_require__(18);\n\nvar _Mock2 = _interopRequireDefault(_Mock);\n\nvar Registry = (function () {\n function Registry() {\n _classCallCheck(this, Registry);\n\n this._mocks = [];\n }\n\n Registry.prototype.add = function add(mock) {\n this._mocks.push(mock);\n return this;\n };\n\n Registry.prototype.clear = function clear() {\n this._mocks = [];\n return this;\n };\n\n Registry.prototype.find = function find(request) {\n\n //console.log('Registry is looking for', request);\n\n var mock = this._mocks.shift();\n\n if (!mock) throw new Error('No mock in registry for request ' + request.method + ' ' + request.url);\n\n if (!mock.test(request)) throw new Error('Wrong request ' + request.method + ' ' + request.url + ' for expected mock ' + mock.method() + ' ' + mock.path());\n\n return mock;\n };\n\n Registry.prototype.apiCall = function apiCall(method, path, response, status, statusText) {\n\n this.add(new _Mock2['default'](method, path, response, status, statusText));\n\n return this;\n };\n\n Registry.prototype.authentication = function authentication() {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'access_token': 'ACCESS_TOKEN',\n 'token_type': 'bearer',\n 'expires_in': 3600,\n 'refresh_token': 'REFRESH_TOKEN',\n 'refresh_token_expires_in': 60480,\n 'scope': 'SMS RCM Foo Boo',\n 'expireTime': new Date().getTime() + 3600000\n });\n\n return this;\n };\n\n Registry.prototype.logout = function logout() {\n\n this.apiCall('POST', '/restapi/oauth/revoke', {});\n\n return this;\n };\n\n Registry.prototype.presenceLoad = function presenceLoad(id) {\n\n this.apiCall('GET', '/restapi/v1.0/account/~/extension/' + id + '/presence', {\n \"uri\": \"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/\" + id + \"/presence\",\n \"extension\": {\n \"uri\": \"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/\" + id,\n \"id\": id,\n \"extensionNumber\": \"101\"\n },\n \"activeCalls\": [],\n \"presenceStatus\": \"Available\",\n \"telephonyStatus\": \"Ringing\",\n \"userStatus\": \"Available\",\n \"dndStatus\": \"TakeAllCalls\",\n \"extensionId\": id\n });\n\n return this;\n };\n\n Registry.prototype.subscribeGeneric = function subscribeGeneric(expiresIn) {\n\n expiresIn = expiresIn || 15 * 60 * 60;\n\n var date = new Date();\n\n this.apiCall('POST', '/restapi/v1.0/subscription', {\n 'eventFilters': ['/restapi/v1.0/account/~/extension/~/presence'],\n 'expirationTime': new Date(date.getTime() + expiresIn * 1000).toISOString(),\n 'expiresIn': expiresIn,\n 'deliveryMode': {\n 'transportType': 'PubNub',\n 'encryption': false,\n 'address': '123_foo',\n 'subscriberKey': 'sub-c-foo',\n 'secretKey': 'sec-c-bar'\n },\n 'id': 'foo-bar-baz',\n 'creationTime': date.toISOString(),\n 'status': 'Active',\n 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz'\n });\n\n return this;\n };\n\n Registry.prototype.subscribeOnPresence = function subscribeOnPresence(id, detailed) {\n\n id = id || '1';\n\n var date = new Date();\n\n this.apiCall('POST', '/restapi/v1.0/subscription', {\n 'eventFilters': ['/restapi/v1.0/account/~/extension/' + id + '/presence' + (detailed ? '?detailedTelephonyState=true' : '')],\n 'expirationTime': new Date(date.getTime() + 15 * 60 * 60 * 1000).toISOString(),\n 'deliveryMode': {\n 'transportType': 'PubNub',\n 'encryption': true,\n 'address': '123_foo',\n 'subscriberKey': 'sub-c-foo',\n 'secretKey': 'sec-c-bar',\n 'encryptionAlgorithm': 'AES',\n 'encryptionKey': 'VQwb6EVNcQPBhE/JgFZ2zw=='\n },\n 'creationTime': date.toISOString(),\n 'id': 'foo-bar-baz',\n 'status': 'Active',\n 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz'\n });\n\n return this;\n };\n\n Registry.prototype.tokenRefresh = function tokenRefresh(failure) {\n\n if (!failure) {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'access_token': 'ACCESS_TOKEN_FROM_REFRESH',\n 'token_type': 'bearer',\n 'expires_in': 3600,\n 'refresh_token': 'REFRESH_TOKEN_FROM_REFRESH',\n 'refresh_token_expires_in': 60480,\n 'scope': 'SMS RCM Foo Boo'\n });\n } else {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'message': 'Wrong token',\n 'error_description': 'Wrong token',\n 'description': 'Wrong token'\n }, 400);\n }\n\n return this;\n };\n\n return Registry;\n})();\n\nexports['default'] = Registry;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 18 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _httpApiResponse = __webpack_require__(15);\n\nvar _httpApiResponse2 = _interopRequireDefault(_httpApiResponse);\n\nvar _coreUtils = __webpack_require__(2);\n\nvar _httpUtils = __webpack_require__(14);\n\nvar Mock = (function () {\n function Mock(method, path, json, status, statusText, delay) {\n _classCallCheck(this, Mock);\n\n this._method = method.toUpperCase();\n this._path = path;\n this._json = json || {};\n this._delay = delay || 10;\n this._status = status || 200;\n this._statusText = statusText || 'OK';\n }\n\n Mock.prototype.path = function path() {\n return this._path;\n };\n\n Mock.prototype.method = function method() {\n return this._method;\n };\n\n Mock.prototype.test = function test(request) {\n\n return request.url.indexOf(this._path) > -1 && request.method.toUpperCase() == this._method;\n };\n\n Mock.prototype.getResponse = function getResponse(request) {\n return regeneratorRuntime.async(function getResponse$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.next = 2;\n return regeneratorRuntime.awrap(_coreUtils.delay(this._delay));\n\n case 2:\n return context$2$0.abrupt('return', this.createResponse(this._json));\n\n case 3:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n Mock.prototype.createResponse = function createResponse(json, init) {\n\n init = init || {};\n\n init.status = init.status || this._status;\n init.statusText = init.statusText || this._statusText;\n\n var str = JSON.stringify(json),\n res = _httpUtils.createResponse(str, init);\n\n res.headers.set(_httpApiResponse2['default']._contentType, _httpApiResponse2['default']._jsonContentType);\n\n return res;\n };\n\n return Mock;\n})();\n\nexports['default'] = Mock;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 19 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _coreObservable = __webpack_require__(12);\n\nvar _coreObservable2 = _interopRequireDefault(_coreObservable);\n\nvar _Queue = __webpack_require__(20);\n\nvar _Queue2 = _interopRequireDefault(_Queue);\n\nvar _Auth = __webpack_require__(21);\n\nvar _Auth2 = _interopRequireDefault(_Auth);\n\nvar _coreExternals = __webpack_require__(3);\n\nvar _coreUtils = __webpack_require__(2);\n\nvar Platform = (function (_Observable) {\n _inherits(Platform, _Observable);\n\n _createClass(Platform, null, [{\n key: '_urlPrefix',\n value: '/restapi',\n enumerable: true\n }, {\n key: '_apiVersion',\n value: 'v1.0',\n enumerable: true\n }, {\n key: '_accessTokenTtl',\n value: null,\n // Platform server by default sets it to 60 * 60 = 1 hour\n enumerable: true\n }, {\n key: '_refreshTokenTtl',\n value: 10 * 60 * 60,\n // 10 hours\n enumerable: true\n }, {\n key: '_refreshTokenTtlRemember',\n value: 7 * 24 * 60 * 60,\n // 1 week\n enumerable: true\n }, {\n key: '_tokenEndpoint',\n value: '/restapi/oauth/token',\n enumerable: true\n }, {\n key: '_revokeEndpoint',\n value: '/restapi/oauth/revoke',\n enumerable: true\n }, {\n key: '_authorizeEndpoint',\n value: '/restapi/oauth/authorize',\n enumerable: true\n }, {\n key: '_refreshDelayMs',\n value: 100,\n enumerable: true\n }, {\n key: '_cacheId',\n value: 'platform',\n enumerable: true\n }, {\n key: '_clearCacheOnRefreshError',\n value: true,\n enumerable: true\n }]);\n\n function Platform(client, cache, server, appKey, appSecret) {\n _classCallCheck(this, Platform);\n\n _Observable.call(this);\n\n this.events = {\n beforeLogin: 'beforeLogin',\n loginSuccess: 'loginSuccess',\n loginError: 'loginError',\n beforeRefresh: 'beforeRefresh',\n refreshSuccess: 'refreshSuccess',\n refreshError: 'refreshError',\n beforeLogout: 'beforeLogout',\n logoutSuccess: 'logoutSuccess',\n logoutError: 'logoutError'\n };\n this._server = server;\n this._appKey = appKey;\n this._appSecret = appSecret;\n\n /** @type {Cache} */\n this._cache = cache;\n\n /** @type {Client} */\n this._client = client;\n\n this._queue = new _Queue2['default'](this._cache, Platform._cacheId + '-refresh');\n\n this._auth = new _Auth2['default'](this._cache, Platform._cacheId);\n }\n\n /**\n * @return {Auth}\n */\n\n Platform.prototype.auth = function auth() {\n return this._auth;\n };\n\n /**\n * @return {Client}\n */\n\n Platform.prototype.client = function client() {\n return this._client;\n };\n\n /**\n * @param {string} path\n * @param {object} [options]\n * @param {boolean} [options.addServer]\n * @param {string} [options.addMethod]\n * @param {boolean} [options.addToken]\n * @return {string}\n */\n\n Platform.prototype.createUrl = function createUrl(path, options) {\n\n path = path || '';\n options = options || {};\n\n var builtUrl = '',\n hasHttp = path.indexOf('http://') != -1 || path.indexOf('https://') != -1;\n\n if (options.addServer && !hasHttp) builtUrl += this._server;\n\n if (path.indexOf(Platform._urlPrefix) == -1 && !hasHttp) builtUrl += Platform._urlPrefix + '/' + Platform._apiVersion;\n\n builtUrl += path;\n\n if (options.addMethod || options.addToken) builtUrl += path.indexOf('?') > -1 ? '&' : '?';\n\n if (options.addMethod) builtUrl += '_method=' + options.addMethod;\n if (options.addToken) builtUrl += (options.addMethod ? '&' : '') + 'access_token=' + this._auth.accessToken();\n\n return builtUrl;\n };\n\n /**\n * @param {string} options.redirectUri\n * @param {string} options.state\n * @param {string} options.brandId\n * @param {string} options.display\n * @param {string} options.prompt\n * @return {string}\n */\n\n Platform.prototype.authUrl = function authUrl(options) {\n\n options = options || {};\n\n return this.createUrl(Platform._authorizeEndpoint + '?' + _coreUtils.queryStringify({\n 'response_type': 'code',\n 'redirect_uri': options.redirectUri || '',\n 'client_id': this._appKey,\n 'state': options.state || '',\n 'brand_id': options.brandId || '',\n 'display': options.display || '',\n 'prompt': options.prompt || ''\n }), { addServer: true });\n };\n\n /**\n * @param {string} url\n * @return {Object}\n */\n\n Platform.prototype.parseAuthRedirectUrl = function parseAuthRedirectUrl(url) {\n\n var qs = _coreUtils.parseQueryString(url.split('?').reverse()[0]),\n error = qs.error_description || qs.error;\n\n if (error) {\n var e = new Error(error);\n e.error = qs.error;\n throw e;\n }\n\n return qs;\n };\n\n /**\n * @return {Promise}\n */\n\n Platform.prototype.loggedIn = function loggedIn() {\n return regeneratorRuntime.async(function loggedIn$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n context$2$0.next = 3;\n return regeneratorRuntime.awrap(this._ensureAuthentication());\n\n case 3:\n return context$2$0.abrupt('return', true);\n\n case 6:\n context$2$0.prev = 6;\n context$2$0.t0 = context$2$0['catch'](0);\n return context$2$0.abrupt('return', false);\n\n case 9:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 6]]);\n };\n\n /**\n * @param {string} options.username\n * @param {string} options.password\n * @param {string} options.extension\n * @param {string} options.code\n * @param {string} options.redirectUri\n * @param {string} options.endpointId\n * @returns {Promise}\n */\n\n Platform.prototype.login = function login(options) {\n var body, apiResponse, json;\n return regeneratorRuntime.async(function login$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n\n options = options || {};\n\n options.remember = options.remember || false;\n\n this.emit(this.events.beforeLogin);\n\n body = {\n \"access_token_ttl\": Platform._accessTokenTtl,\n \"refresh_token_ttl\": options.remember ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl\n };\n\n if (!options.code) {\n\n body.grant_type = 'password';\n body.username = options.username;\n body.password = options.password;\n body.extension = options.extension || '';\n } else if (options.code) {\n\n body.grant_type = 'authorization_code';\n body.code = options.code;\n body.redirect_uri = options.redirectUri;\n //body.client_id = this.getCredentials().key; // not needed\n }\n\n if (options.endpointId) body.endpoint_id = options.endpointId;\n\n context$2$0.next = 9;\n return regeneratorRuntime.awrap(this._tokenRequest(Platform._tokenEndpoint, body));\n\n case 9:\n apiResponse = context$2$0.sent;\n json = apiResponse.json();\n\n this._auth.setData(json).setRemember(options.remember);\n\n this.emit(this.events.loginSuccess, apiResponse);\n\n return context$2$0.abrupt('return', apiResponse);\n\n case 16:\n context$2$0.prev = 16;\n context$2$0.t0 = context$2$0['catch'](0);\n\n this._cache.clean();\n\n this.emit(this.events.loginError, context$2$0.t0);\n\n throw context$2$0.t0;\n\n case 21:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 16]]);\n };\n\n /**\n * @returns {Promise}\n */\n\n Platform.prototype.refresh = function refresh() {\n var res, json;\n return regeneratorRuntime.async(function refresh$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n\n this.emit(this.events.beforeRefresh);\n\n if (!this._queue.isPaused()) {\n context$2$0.next = 9;\n break;\n }\n\n context$2$0.next = 5;\n return regeneratorRuntime.awrap(this._queue.poll());\n\n case 5:\n if (this._isAccessTokenValid()) {\n context$2$0.next = 7;\n break;\n }\n\n throw new Error('Automatic authentification timeout');\n\n case 7:\n\n this.emit(this.events.refreshSuccess, null);\n\n return context$2$0.abrupt('return', null);\n\n case 9:\n\n this._queue.pause();\n\n // Make sure all existing AJAX calls had a chance to reach the server\n context$2$0.next = 12;\n return regeneratorRuntime.awrap(_coreUtils.delay(Platform._refreshDelayMs));\n\n case 12:\n if (this._auth.refreshToken()) {\n context$2$0.next = 14;\n break;\n }\n\n throw new Error('Refresh token is missing');\n\n case 14:\n if (this._auth.refreshTokenValid()) {\n context$2$0.next = 16;\n break;\n }\n\n throw new Error('Refresh token has expired');\n\n case 16:\n if (this._queue.isPaused()) {\n context$2$0.next = 18;\n break;\n }\n\n throw new Error('Queue was resumed before refresh call');\n\n case 18:\n context$2$0.next = 20;\n return regeneratorRuntime.awrap(this._tokenRequest(Platform._tokenEndpoint, {\n \"grant_type\": \"refresh_token\",\n \"refresh_token\": this._auth.refreshToken(),\n \"access_token_ttl\": Platform._accessTokenTtl,\n \"refresh_token_ttl\": this._auth.remember() ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl\n }));\n\n case 20:\n res = context$2$0.sent;\n json = res.json();\n\n if (json.access_token) {\n context$2$0.next = 24;\n break;\n }\n\n throw this._client.makeError(new Error('Malformed OAuth response'), res);\n\n case 24:\n\n this._auth.setData(json);\n this._queue.resume();\n\n this.emit(this.events.refreshSuccess, res);\n\n return context$2$0.abrupt('return', res);\n\n case 30:\n context$2$0.prev = 30;\n context$2$0.t0 = context$2$0['catch'](0);\n\n context$2$0.t0 = this._client.makeError(context$2$0.t0);\n\n if (Platform._clearCacheOnRefreshError) {\n this._cache.clean();\n }\n\n this.emit(this.events.refreshError, context$2$0.t0);\n\n throw context$2$0.t0;\n\n case 36:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 30]]);\n };\n\n /**\n * @returns {Promise}\n */\n\n Platform.prototype.logout = function logout() {\n var res;\n return regeneratorRuntime.async(function logout$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n\n this.emit(this.events.beforeLogout);\n\n this._queue.pause();\n\n context$2$0.next = 5;\n return regeneratorRuntime.awrap(this._tokenRequest(Platform._revokeEndpoint, {\n token: this._auth.accessToken()\n }));\n\n case 5:\n res = context$2$0.sent;\n\n this._queue.resume();\n this._cache.clean();\n\n this.emit(this.events.logoutSuccess, res);\n\n return context$2$0.abrupt('return', res);\n\n case 12:\n context$2$0.prev = 12;\n context$2$0.t0 = context$2$0['catch'](0);\n\n this._queue.resume();\n\n this.emit(this.events.logoutError, context$2$0.t0);\n\n throw context$2$0.t0;\n\n case 17:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 12]]);\n };\n\n /**\n * @param {Request} request\n * @param {object} [options]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n\n Platform.prototype.inflateRequest = function inflateRequest(request, options) {\n return regeneratorRuntime.async(function inflateRequest$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n\n options = options || {};\n\n if (!options.skipAuthCheck) {\n context$2$0.next = 3;\n break;\n }\n\n return context$2$0.abrupt('return', request);\n\n case 3:\n context$2$0.next = 5;\n return regeneratorRuntime.awrap(this._ensureAuthentication());\n\n case 5:\n\n request.headers.set('Authorization', this._authHeader());\n //request.url = this.createUrl(request.url, {addServer: true}); //FIXME Spec prevents this...\n\n //TODO Add User-Agent here\n\n return context$2$0.abrupt('return', request);\n\n case 7:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n /**\n * @param {Request} request\n * @param {object} [options]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n\n Platform.prototype.sendRequest = function sendRequest(request, options) {\n return regeneratorRuntime.async(function sendRequest$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n context$2$0.next = 3;\n return regeneratorRuntime.awrap(this.inflateRequest(request, options));\n\n case 3:\n request = context$2$0.sent;\n context$2$0.next = 6;\n return regeneratorRuntime.awrap(this._client.sendRequest(request));\n\n case 6:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 9:\n context$2$0.prev = 9;\n context$2$0.t0 = context$2$0['catch'](0);\n\n if (!(!context$2$0.t0.apiResponse || !context$2$0.t0.apiResponse.response() || context$2$0.t0.apiResponse.response().status != 401)) {\n context$2$0.next = 13;\n break;\n }\n\n throw context$2$0.t0;\n\n case 13:\n\n this._auth.cancelAccessToken();\n\n context$2$0.next = 16;\n return regeneratorRuntime.awrap(this.sendRequest(request, options));\n\n case 16:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 17:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 9]]);\n };\n\n /**\n * General purpose function to send anything to server\n * @param {object} [options.body]\n * @param {string} [options.url]\n * @param {string} [options.method]\n * @param {object} [options.query]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n\n Platform.prototype.send = function send() {\n var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n return regeneratorRuntime.async(function send$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n\n //FIXME https://github.com/bitinn/node-fetch/issues/43\n options.url = this.createUrl(options.url, { addServer: true });\n\n context$2$0.next = 3;\n return regeneratorRuntime.awrap(this.sendRequest(this._client.createRequest(options), options));\n\n case 3:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 4:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n /**\n * @param {string} url\n * @param {object} query\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n\n Platform.prototype.get = function get(url, query, options) {\n return regeneratorRuntime.async(function get$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n options = options || {};\n options.method = 'GET';\n options.url = url;\n options.query = query;\n context$2$0.next = 6;\n return regeneratorRuntime.awrap(this.send(options));\n\n case 6:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 7:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n /**\n * @param {string} url\n * @param {object} body\n * @param {object} query\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n\n Platform.prototype.post = function post(url, body, query, options) {\n return regeneratorRuntime.async(function post$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n options = options || {};\n options.method = 'POST';\n options.url = url;\n options.query = query;\n options.body = body;\n context$2$0.next = 7;\n return regeneratorRuntime.awrap(this.send(options));\n\n case 7:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 8:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n /**\n * @param {string} url\n * @param {object} body\n * @param {object} query\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n\n Platform.prototype.put = function put(url, body, query, options) {\n return regeneratorRuntime.async(function put$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n options = options || {};\n options.method = 'PUT';\n options.url = url;\n options.query = query;\n options.body = body;\n context$2$0.next = 7;\n return regeneratorRuntime.awrap(this.send(options));\n\n case 7:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 8:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n /**\n * @param {string} url\n * @param {string} query\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n\n Platform.prototype['delete'] = function _delete(url, query, options) {\n return regeneratorRuntime.async(function _delete$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n options = options || {};\n options.method = 'DELETE';\n options.url = url;\n options.query = query;\n context$2$0.next = 6;\n return regeneratorRuntime.awrap(this.send(options));\n\n case 6:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 7:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n Platform.prototype._tokenRequest = function _tokenRequest(path, body) {\n return regeneratorRuntime.async(function _tokenRequest$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.next = 2;\n return regeneratorRuntime.awrap(this.send({\n url: path,\n skipAuthCheck: true,\n body: body,\n method: 'POST',\n headers: {\n 'Authorization': 'Basic ' + this._apiKey(),\n 'Content-Type': 'application/x-www-form-urlencoded'\n }\n }));\n\n case 2:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 3:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n Platform.prototype._ensureAuthentication = function _ensureAuthentication() {\n return regeneratorRuntime.async(function _ensureAuthentication$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n if (!this._isAccessTokenValid()) {\n context$2$0.next = 2;\n break;\n }\n\n return context$2$0.abrupt('return', null);\n\n case 2:\n context$2$0.next = 4;\n return regeneratorRuntime.awrap(this.refresh());\n\n case 4:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 5:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n Platform.prototype._isAccessTokenValid = function _isAccessTokenValid() {\n\n return this._auth.accessTokenValid() && !this._queue.isPaused();\n };\n\n Platform.prototype._apiKey = function _apiKey() {\n var apiKey = this._appKey + ':' + this._appSecret;\n return typeof btoa == 'function' ? btoa(apiKey) : new Buffer(apiKey).toString('base64');\n };\n\n Platform.prototype._authHeader = function _authHeader() {\n var token = this._auth.accessToken();\n return this._auth.tokenType() + (token ? ' ' + token : '');\n };\n\n return Platform;\n})(_coreObservable2['default']);\n\nexports['default'] = Platform;\nmodule.exports = exports['default'];\n\n// Perform sanity checks\n\n/** @type {ApiResponse} */\n\n// Guard is for errors that come from polling\n\n/***/ },\n/* 20 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _coreExternals = __webpack_require__(3);\n\nvar _coreUtils = __webpack_require__(2);\n\nvar Queue = (function () {\n _createClass(Queue, null, [{\n key: '_pollInterval',\n value: 250,\n enumerable: true\n }, {\n key: '_releaseTimeout',\n value: 5000,\n enumerable: true\n }]);\n\n function Queue(cache, cacheId) {\n _classCallCheck(this, Queue);\n\n this._cache = cache;\n this._cacheId = cacheId;\n this._promise = null;\n }\n\n Queue.prototype.isPaused = function isPaused() {\n\n var storage = this._cache,\n cacheId = this._cacheId,\n time = storage.getItem(cacheId);\n\n return !!time && Date.now() - parseInt(time) < Queue._releaseTimeout;\n };\n\n Queue.prototype.pause = function pause() {\n this._cache.setItem(this._cacheId, Date.now());\n return this;\n };\n\n Queue.prototype.resume = function resume() {\n this._cache.removeItem(this._cacheId);\n return this;\n };\n\n Queue.prototype.poll = function poll() {\n var _this = this;\n\n if (this._promise) return this._promise;\n\n this._promise = new _coreExternals.Promise(function (resolve, reject) {\n\n _coreUtils.poll(function (next) {\n\n if (_this.isPaused()) return next();\n\n _this._promise = null;\n\n _this.resume(); // this is actually not needed but why not\n\n resolve(null);\n }, Queue._pollInterval);\n });\n\n return this._promise;\n };\n\n return Queue;\n})();\n\nexports['default'] = Queue;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 21 */\n/***/ function(module, exports) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar Auth = (function () {\n _createClass(Auth, null, [{\n key: 'refreshHandicapMs',\n value: 60 * 1000,\n // 1 minute\n enumerable: true\n }, {\n key: 'forcedTokenType',\n value: 'forced',\n enumerable: true\n }]);\n\n function Auth(cache, cacheId) {\n _classCallCheck(this, Auth);\n\n /** @type {Cache} */\n this._cache = cache;\n this._cacheId = cacheId;\n }\n\n //export interface IAuthData {\n // remember?:boolean;\n // token_type?:string;\n // access_token?:string;\n // expires_in?:number; // actually it's string\n // expire_time?:number;\n // refresh_token?:string;\n // refresh_token_expires_in?:number; // actually it's string\n // refresh_token_expire_time?:number;\n // scope?:string;\n //}\n\n Auth.prototype.accessToken = function accessToken() {\n return this.data().access_token;\n };\n\n Auth.prototype.refreshToken = function refreshToken() {\n return this.data().refresh_token;\n };\n\n Auth.prototype.tokenType = function tokenType() {\n return this.data().token_type;\n };\n\n /**\n * @return {{token_type: string, access_token: string, expires_in: number, refresh_token: string, refresh_token_expires_in: number}}\n */\n\n Auth.prototype.data = function data() {\n\n return this._cache.getItem(this._cacheId) || {\n token_type: '',\n access_token: '',\n expires_in: 0,\n refresh_token: '',\n refresh_token_expires_in: 0\n };\n };\n\n /**\n * @param {object} newData\n * @return {Auth}\n */\n\n Auth.prototype.setData = function setData(newData) {\n\n newData = newData || {};\n\n var data = this.data();\n\n Object.keys(newData).forEach(function (key) {\n data[key] = newData[key];\n });\n\n data.expire_time = Date.now() + data.expires_in * 1000;\n data.refresh_token_expire_time = Date.now() + data.refresh_token_expires_in * 1000;\n\n this._cache.setItem(this._cacheId, data);\n\n return this;\n };\n\n /**\n * Check if there is a valid (not expired) access token\n * @return {boolean}\n */\n\n Auth.prototype.accessTokenValid = function accessTokenValid() {\n\n var authData = this.data();\n return authData.token_type === Auth.forcedTokenType || authData.expire_time - Auth.refreshHandicapMs > Date.now();\n };\n\n /**\n * Check if there is a valid (not expired) access token\n * @return {boolean}\n */\n\n Auth.prototype.refreshTokenValid = function refreshTokenValid() {\n\n return this.data().refresh_token_expire_time > Date.now();\n };\n\n /**\n * @return {Auth}\n */\n\n Auth.prototype.cancelAccessToken = function cancelAccessToken() {\n\n return this.setData({\n access_token: '',\n expires_in: 0\n });\n };\n\n /**\n * This method sets a special authentication mode used in Service Web\n * @return {Auth}\n */\n\n Auth.prototype.forceAuthentication = function forceAuthentication() {\n\n this.setData({\n token_type: Auth.forcedTokenType,\n access_token: '',\n expires_in: 0,\n refresh_token: '',\n refresh_token_expires_in: 0\n });\n\n return this;\n };\n\n /**\n * @param remember\n * @return {Auth}\n */\n\n Auth.prototype.setRemember = function setRemember(remember) {\n\n return this.setData({ remember: remember });\n };\n\n /**\n * @return {boolean}\n */\n\n Auth.prototype.remember = function remember() {\n\n return !!this.data().remember;\n };\n\n return Auth;\n})();\n\nexports['default'] = Auth;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 22 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _PubnubMockJs = __webpack_require__(23);\n\nvar _PubnubMockJs2 = _interopRequireDefault(_PubnubMockJs);\n\nvar _coreExternals = __webpack_require__(3);\n\nvar PubnubMockFactory = (function () {\n function PubnubMockFactory() {\n _classCallCheck(this, PubnubMockFactory);\n\n this.crypto_obj = _coreExternals.PUBNUB.crypto_obj;\n }\n\n PubnubMockFactory.prototype.init = function init(options) {\n return new _PubnubMockJs2['default'](options);\n };\n\n return PubnubMockFactory;\n})();\n\nexports['default'] = PubnubMockFactory;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 23 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _coreObservable = __webpack_require__(12);\n\nvar _coreObservable2 = _interopRequireDefault(_coreObservable);\n\nvar _coreExternals = __webpack_require__(3);\n\nvar PubnubMock = (function (_Observable) {\n _inherits(PubnubMock, _Observable);\n\n function PubnubMock(options) {\n _classCallCheck(this, PubnubMock);\n\n _Observable.call(this);\n this.options = options;\n this.crypto_obj = _coreExternals.PUBNUB.crypto_obj;\n }\n\n PubnubMock.prototype.ready = function ready() {};\n\n PubnubMock.prototype.subscribe = function subscribe(options) {\n this.on('message-' + options.channel, options.message);\n };\n\n PubnubMock.prototype.unsubscribe = function unsubscribe(options) {\n this.off('message-' + options.channel);\n };\n\n PubnubMock.prototype.receiveMessage = function receiveMessage(msg, channel) {\n this.emit('message-' + channel, msg, 'env', channel);\n };\n\n return PubnubMock;\n})(_coreObservable2['default']);\n\nexports['default'] = PubnubMock;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 24 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _coreObservable = __webpack_require__(12);\n\nvar _coreObservable2 = _interopRequireDefault(_coreObservable);\n\nvar _httpClient = __webpack_require__(13);\n\nvar _httpClient2 = _interopRequireDefault(_httpClient);\n\nvar _coreUtils = __webpack_require__(2);\n\nvar Subscription = (function (_Observable) {\n _inherits(Subscription, _Observable);\n\n _createClass(Subscription, null, [{\n key: '_renewHandicapMs',\n value: 2 * 60 * 1000,\n enumerable: true\n }, {\n key: '_pollInterval',\n value: 10 * 1000,\n enumerable: true\n }]);\n\n function Subscription(pubnubFactory, platform, cache) {\n _classCallCheck(this, Subscription);\n\n _Observable.call(this);\n\n this.events = {\n notification: 'notification',\n removeSuccess: 'removeSuccess',\n removeError: 'removeError',\n renewSuccess: 'renewSuccess',\n renewError: 'renewError',\n subscribeSuccess: 'subscribeSuccess',\n subscribeError: 'subscribeError'\n };\n this._pubnubFactory = pubnubFactory;\n this._platform = platform;\n this._cache = cache;\n this._pubnub = null;\n this._timeout = null;\n this._subscription = {};\n }\n\n //export interface ISubscription {\n // id?:string;\n // uri?: string;\n // eventFilters?:string[];\n // expirationTime?:string; // 2014-03-12T19:54:35.613Z\n // expiresIn?:number;\n // deliveryMode?: {\n // transportType?:string;\n // encryption?:boolean;\n // address?:string;\n // subscriberKey?:string;\n // encryptionKey?:string;\n // secretKey?:string;\n // };\n // creationTime?:string; // 2014-03-12T19:54:35.613Z\n // status?:string; // Active\n //}\n\n /**\n * @return {boolean}\n */\n\n Subscription.prototype.alive = function alive() {\n\n return !!(this._subscription.id && this._subscription.deliveryMode && this._subscription.deliveryMode.subscriberKey && this._subscription.deliveryMode.address && Date.now() < this.expirationTime());\n };\n\n Subscription.prototype.expirationTime = function expirationTime() {\n return new Date(this._subscription.expirationTime || 0).getTime() - Subscription._renewHandicapMs;\n };\n\n Subscription.prototype.setSubscription = function setSubscription(subscription) {\n\n subscription = subscription || {};\n\n this._clearTimeout();\n\n this._subscription = subscription;\n\n if (!this._pubnub) this._subscribeAtPubnub();\n\n this._setTimeout();\n\n return this;\n };\n\n Subscription.prototype.subscription = function subscription() {\n return this._subscription;\n };\n\n /**\n * Creates or updates subscription if there is an active one\n * @param {{events?:string[]}} [options] New array of events\n * @returns {Promise}\n */\n\n Subscription.prototype.register = function register(options) {\n return regeneratorRuntime.async(function register$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n if (!this.alive()) {\n context$2$0.next = 6;\n break;\n }\n\n context$2$0.next = 3;\n return regeneratorRuntime.awrap(this.renew(options));\n\n case 3:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 6:\n context$2$0.next = 8;\n return regeneratorRuntime.awrap(this.subscribe(options));\n\n case 8:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 9:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n Subscription.prototype.eventFilters = function eventFilters() {\n return this._subscription.eventFilters || [];\n };\n\n /**\n * @param {string[]} events\n * @return {Subscription}\n */\n\n Subscription.prototype.addEventFilters = function addEventFilters(events) {\n this.setEventFilters(this.eventFilters().concat(events));\n return this;\n };\n\n /**\n * @param {string[]} events\n * @return {Subscription}\n */\n\n Subscription.prototype.setEventFilters = function setEventFilters(events) {\n this._subscription.eventFilters = events;\n return this;\n };\n\n /**\n * @param {{events?:string[]}} [options] New array of events\n * @returns {Promise}\n */\n\n Subscription.prototype.subscribe = function subscribe(options) {\n var response, json;\n return regeneratorRuntime.async(function subscribe$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n\n options = options || {};\n\n if (options.events) this.setEventFilters(options.events);\n\n this._clearTimeout();\n\n if (this.eventFilters().length) {\n context$2$0.next = 6;\n break;\n }\n\n throw new Error('Events are undefined');\n\n case 6:\n context$2$0.next = 8;\n return regeneratorRuntime.awrap(this._platform.post('/restapi/v1.0/subscription', {\n eventFilters: this._getFullEventFilters(),\n deliveryMode: {\n transportType: 'PubNub'\n }\n }));\n\n case 8:\n response = context$2$0.sent;\n json = response.json();\n\n this.setSubscription(json).emit(this.events.subscribeSuccess, response);\n\n return context$2$0.abrupt('return', response);\n\n case 14:\n context$2$0.prev = 14;\n context$2$0.t0 = context$2$0['catch'](0);\n\n context$2$0.t0 = this._platform.client().makeError(context$2$0.t0);\n\n this.reset().emit(this.events.subscribeError, context$2$0.t0);\n\n throw context$2$0.t0;\n\n case 19:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 14]]);\n };\n\n /**\n * @param {{events?:string[]}} [options] New array of events\n * @returns {Promise}\n */\n\n Subscription.prototype.renew = function renew(options) {\n var response, json;\n return regeneratorRuntime.async(function renew$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n\n options = options || {};\n\n if (options.events) this.setEventFilters(options.events);\n\n this._clearTimeout();\n\n if (this.alive()) {\n context$2$0.next = 6;\n break;\n }\n\n throw new Error('Subscription is not alive');\n\n case 6:\n if (this.eventFilters().length) {\n context$2$0.next = 8;\n break;\n }\n\n throw new Error('Events are undefined');\n\n case 8:\n context$2$0.next = 10;\n return regeneratorRuntime.awrap(this._platform.put('/restapi/v1.0/subscription/' + this._subscription.id, {\n eventFilters: this._getFullEventFilters()\n }));\n\n case 10:\n response = context$2$0.sent;\n json = response.json();\n\n this.setSubscription(json).emit(this.events.renewSuccess, response);\n\n return context$2$0.abrupt('return', response);\n\n case 16:\n context$2$0.prev = 16;\n context$2$0.t0 = context$2$0['catch'](0);\n\n context$2$0.t0 = this._platform.client().makeError(context$2$0.t0);\n\n this.reset().emit(this.events.renewError, context$2$0.t0);\n\n throw context$2$0.t0;\n\n case 21:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 16]]);\n };\n\n /**\n * @returns {Promise}\n */\n\n Subscription.prototype.remove = function remove() {\n var response;\n return regeneratorRuntime.async(function remove$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n\n if (this.alive()) {\n context$2$0.next = 3;\n break;\n }\n\n throw new Error('Subscription is not alive');\n\n case 3:\n context$2$0.next = 5;\n return regeneratorRuntime.awrap(this._platform['delete']('/restapi/v1.0/subscription/' + this._subscription.id));\n\n case 5:\n response = context$2$0.sent;\n\n this.reset().emit(this.events.removeSuccess, response);\n\n return context$2$0.abrupt('return', response);\n\n case 10:\n context$2$0.prev = 10;\n context$2$0.t0 = context$2$0['catch'](0);\n\n context$2$0.t0 = this._platform.client().makeError(context$2$0.t0);\n\n this.emit(this.events.removeError, context$2$0.t0);\n\n throw context$2$0.t0;\n\n case 15:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 10]]);\n };\n\n /**\n * Remove subscription and disconnect from PUBNUB\n * This method resets subscription at client side but backend is not notified\n */\n\n Subscription.prototype.reset = function reset() {\n this._clearTimeout();\n if (this.alive() && this._pubnub) this._pubnub.unsubscribe({ channel: this._subscription.deliveryMode.address });\n this._subscription = {};\n return this;\n };\n\n /**\n *\n * @param {string} cacheKey\n * @param {string[]} events\n * @return {Subscription}\n */\n\n Subscription.prototype.restoreFromCache = function restoreFromCache(cacheKey, events) {\n var _this = this;\n\n this.on([this.events.subscribeSuccess, this.events.renewSuccess], function () {\n\n _this._cache.setItem(cacheKey, _this.subscription());\n });\n\n this.on(this.events.renewError, function () {\n\n _this.reset().setEventFilters(events).register();\n });\n\n var cachedSubscriptionData = this._cache.getItem(cacheKey);\n\n if (cachedSubscriptionData) {\n try {\n this.setSubscription(cachedSubscriptionData);\n } catch (e) {}\n } else {\n this.setEventFilters(events);\n }\n\n return this;\n };\n\n Subscription.prototype._getFullEventFilters = function _getFullEventFilters() {\n var _this2 = this;\n\n return this.eventFilters().map(function (event) {\n return _this2._platform.createUrl(event);\n });\n };\n\n Subscription.prototype._setTimeout = function _setTimeout() {\n var _this3 = this;\n\n this._clearTimeout();\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n _coreUtils.poll(function (next) {\n\n if (_this3.alive()) return next();\n\n _this3.renew();\n }, Subscription._pollInterval, this._timeout);\n\n return this;\n };\n\n Subscription.prototype._clearTimeout = function _clearTimeout() {\n\n _coreUtils.stopPolling(this._timeout);\n\n return this;\n };\n\n Subscription.prototype._decrypt = function _decrypt(message) {\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n if (this._subscription.deliveryMode.encryptionKey) {\n\n var PUBNUB = this._pubnubFactory;\n\n message = PUBNUB.crypto_obj.decrypt(message, this._subscription.deliveryMode.encryptionKey, {\n encryptKey: false,\n keyEncoding: 'base64',\n keyLength: 128,\n mode: 'ecb'\n });\n }\n\n return message;\n };\n\n Subscription.prototype._notify = function _notify(message) {\n\n this.emit(this.events.notification, this._decrypt(message));\n\n return this;\n };\n\n Subscription.prototype._subscribeAtPubnub = function _subscribeAtPubnub() {\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n var PUBNUB = this._pubnubFactory;\n\n this._pubnub = PUBNUB.init({\n ssl: true,\n subscribe_key: this._subscription.deliveryMode.subscriberKey\n });\n\n this._pubnub.ready();\n\n this._pubnub.subscribe({\n channel: this._subscription.deliveryMode.address,\n message: this._notify.bind(this),\n connect: function connect() {}\n });\n\n return this;\n };\n\n return Subscription;\n})(_coreObservable2['default']);\n\nexports['default'] = Subscription;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 25 */\n/***/ function(module, exports) {\n\n/* WEBPACK VAR INJECTION */(function(global) {/**\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 // This invoke function is written in a style that assumes some\n // calling function (or Promise) will handle exceptions.\n function invoke(method, arg) {\n var result = generator[method](arg);\n var value = result.value;\n return value instanceof AwaitArgument\n ? Promise.resolve(value.arg).then(invokeNext, invokeThrow)\n : 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 return result;\n });\n }\n\n if (typeof process === \"object\" && process.domain) {\n invoke = process.domain.bind(invoke);\n }\n\n var invokeNext = invoke.bind(generator, \"next\");\n var invokeThrow = invoke.bind(generator, \"throw\");\n var invokeReturn = invoke.bind(generator, \"return\");\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return invoke(method, arg);\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 ) : new Promise(function (resolve) {\n resolve(callInvokeWithMethodAndArg());\n });\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/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ }\n/******/ ])\n});\n;\n//# sourceMappingURL=ringcentral-bundle.js.map"," \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 = \"/build/\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap ab5bb5a6cdbb0cfc49a3\n **/","import * as Utils from './core/Utils';\nimport Cache from './core/Cache';\nimport * as Externals from './core/Externals';\nimport Observable from './core/Observable';\n\nimport Client from './http/Client';\nimport ApiResponse from './http/ApiResponse';\nimport * as HttpUtils from './http/Utils';\n\nimport {default as ClientMock} from './mocks/ClientMock';\nimport Mock from './mocks/Mock';\nimport Registry from './mocks/Registry';\n\nimport Platform from './platform/Platform';\nimport Auth from './platform/Auth';\nimport Queue from './platform/Queue';\n\nimport PubnubMockFactory from './pubnub/PubnubFactory';\n\nimport Subscription from './subscription/Subscription';\n\nrequire(\"regenerator/runtime\");\n\nexport default class SDK {\n\n static version = '2.0.0';\n\n static server = {\n sandbox: 'https://platform.devtest.ringcentral.com',\n production: 'https://platform.ringcentral.com'\n };\n\n /**\n * @constructor\n * @param {object} [options]\n * @param {string} [options.server]\n * @param {string} [options.cachePrefix]\n * @param {string} [options.appSecret]\n * @param {string} [options.appKey]\n * @param {string} [options.appName]\n * @param {string} [options.appVersion]\n * @param {string} [options.pubnubFactory]\n * @param {string} [options.client]\n */\n constructor(options) {\n\n options = options || {};\n\n this._cache = new Cache(Externals.localStorage, options.cachePrefix);\n\n this._client = options.client || new Client();\n\n this._platform = new Platform(this._client, this._cache, options.server, options.appKey, options.appSecret);\n\n this._pubnubFactory = options.pubnubFactory || Externals.PUBNUB;\n\n }\n\n /**\n * @return {Platform}\n */\n platform() {\n return this._platform;\n }\n\n /**\n * @return {Subscription}\n */\n createSubscription() {\n return new Subscription(this._pubnubFactory, this._platform, this._cache);\n }\n\n /**\n * @return {Cache}\n */\n cache() {\n return this._cache;\n }\n\n static core = {\n Cache: Cache,\n Observable: Observable,\n Utils: Utils,\n Externals: Externals\n };\n\n static http = {\n Client: Client,\n ApiResponse: ApiResponse,\n Utils: HttpUtils\n };\n\n static platform = {\n Auth: Auth,\n Platform: Platform,\n Queue: Queue\n };\n\n static subscription = {\n Subscription: Subscription\n };\n\n static mocks = {\n Client: ClientMock,\n Registry: Registry,\n Mock: Mock\n };\n\n static pubnub = {\n PubnubMockFactory: PubnubMockFactory\n };\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/SDK.js\n **/","import {Promise} from './Externals.js';\n\n/**\n * TODO Replace with something better\n * @see https://github.com/joyent/node/blob/master/lib/querystring.js\n * @param {object} parameters\n * @returns {string}\n */\nexport function queryStringify(parameters) {\n\n var array = [];\n\n parameters = parameters || {};\n\n Object.keys(parameters).forEach((k) => {\n\n var v = parameters[k];\n\n if (isArray(v)) {\n v.forEach((vv) => {\n array.push(encodeURIComponent(k) + '=' + encodeURIComponent(vv));\n });\n } else {\n array.push(encodeURIComponent(k) + '=' + encodeURIComponent(v));\n }\n\n });\n\n return array.join('&');\n\n}\n\n/**\n * TODO Replace with something better\n * @see https://github.com/joyent/node/blob/master/lib/querystring.js\n * @param {string} queryString\n * @returns {object}\n */\nexport function parseQueryString(queryString) {\n\n var argsParsed = {};\n\n queryString.split('&').forEach((arg) => {\n\n arg = decodeURIComponent(arg);\n\n if (arg.indexOf('=') == -1) {\n\n argsParsed[arg.trim()] = true;\n\n } else {\n\n var pair = arg.split('='),\n key = pair[0].trim(),\n value = pair[1].trim();\n\n if (key in argsParsed) {\n if (key in argsParsed && !isArray(argsParsed[key])) argsParsed[key] = [argsParsed[key]];\n argsParsed[key].push(value);\n } else {\n argsParsed[key] = value;\n }\n\n }\n\n });\n\n return argsParsed;\n\n}\n\n/**\n * @param obj\n * @return {boolean}\n */\nexport function isFunction(obj) {\n return typeof obj === \"function\";\n}\n\n/**\n * @param obj\n * @return {boolean}\n */\nexport function isArray(obj) {\n return Array.isArray ? Array.isArray(obj) : typeof obj === \"array\";\n}\n\n/**\n * @param fn\n * @param interval\n * @param timeout\n */\nexport function poll(fn, interval, timeout) { //NodeJS.Timer|number\n\n module.exports.stopPolling(timeout);\n\n interval = interval || 1000;\n\n var next = (delay) => {\n\n delay = delay || interval;\n\n interval = delay;\n\n return setTimeout(() => {\n\n fn(next, delay);\n\n }, delay);\n\n };\n\n return next();\n\n}\n\nexport function stopPolling(timeout) {\n if (timeout) clearTimeout(timeout);\n}\n\nexport function isNodeJS() {\n return (typeof process !== 'undefined');\n}\n\nexport function isBrowser() {\n return (typeof window !== 'undefined');\n}\n\nexport function delay(timeout) {\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n resolve(null);\n }, timeout);\n });\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Utils.js\n **/","import ES6Promise from 'es6-promise';\nimport nodeFetch from 'node-fetch';\nimport pubnub from 'pubnub';\n\nexport var Promise = (ES6Promise && ES6Promise.Promise) || window.Promise;\n\nexport var fetch = nodeFetch || window.fetch;\nexport var Request = fetch.Request || window.Request;\nexport var Response = fetch.Response || window.Response;\nexport var Headers = fetch.Headers || window.Headers;\n\nexport var PUBNUB = pubnub || window.PUBNUB;\n\nexport var localStorage = (typeof window !== 'undefined' &&\n typeof window.localStorage !== 'undefined') ? window.localStorage : {};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Externals.js\n **/","/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license Licensed under MIT license\n * See https://raw.githubusercontent.com/jakearchibald/es6-promise/master/LICENSE\n * @version 2.2.0\n */\n\n(function() {\n \"use strict\";\n function lib$es6$promise$utils$$objectOrFunction(x) {\n return typeof x === 'function' || (typeof x === 'object' && x !== null);\n }\n\n function lib$es6$promise$utils$$isFunction(x) {\n return typeof x === 'function';\n }\n\n function lib$es6$promise$utils$$isMaybeThenable(x) {\n return typeof x === 'object' && x !== null;\n }\n\n var lib$es6$promise$utils$$_isArray;\n if (!Array.isArray) {\n lib$es6$promise$utils$$_isArray = function (x) {\n return Object.prototype.toString.call(x) === '[object Array]';\n };\n } else {\n lib$es6$promise$utils$$_isArray = Array.isArray;\n }\n\n var lib$es6$promise$utils$$isArray = lib$es6$promise$utils$$_isArray;\n var lib$es6$promise$asap$$len = 0;\n var lib$es6$promise$asap$$toString = {}.toString;\n var lib$es6$promise$asap$$vertxNext;\n var lib$es6$promise$asap$$customSchedulerFn;\n\n function lib$es6$promise$asap$$asap(callback, arg) {\n lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len] = callback;\n lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len + 1] = arg;\n lib$es6$promise$asap$$len += 2;\n if (lib$es6$promise$asap$$len === 2) {\n // If len is 2, 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 if (lib$es6$promise$asap$$customSchedulerFn) {\n lib$es6$promise$asap$$customSchedulerFn(lib$es6$promise$asap$$flush);\n } else {\n lib$es6$promise$asap$$scheduleFlush();\n }\n }\n }\n\n var lib$es6$promise$asap$$default = lib$es6$promise$asap$$asap;\n function lib$es6$promise$asap$$setScheduler(scheduleFn) {\n lib$es6$promise$asap$$customSchedulerFn = scheduleFn;\n }\n\n var lib$es6$promise$asap$$browserWindow = (typeof window !== 'undefined') ? window : undefined;\n var lib$es6$promise$asap$$browserGlobal = lib$es6$promise$asap$$browserWindow || {};\n var lib$es6$promise$asap$$BrowserMutationObserver = lib$es6$promise$asap$$browserGlobal.MutationObserver || lib$es6$promise$asap$$browserGlobal.WebKitMutationObserver;\n var lib$es6$promise$asap$$isNode = typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n // test for web worker but not in IE10\n var lib$es6$promise$asap$$isWorker = typeof Uint8ClampedArray !== 'undefined' &&\n typeof importScripts !== 'undefined' &&\n typeof MessageChannel !== 'undefined';\n\n // node\n function lib$es6$promise$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$es6$promise$asap$$flush);\n };\n }\n\n // vertx\n function lib$es6$promise$asap$$useVertxTimer() {\n return function() {\n lib$es6$promise$asap$$vertxNext(lib$es6$promise$asap$$flush);\n };\n }\n\n function lib$es6$promise$asap$$useMutationObserver() {\n var iterations = 0;\n var observer = new lib$es6$promise$asap$$BrowserMutationObserver(lib$es6$promise$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$es6$promise$asap$$useMessageChannel() {\n var channel = new MessageChannel();\n channel.port1.onmessage = lib$es6$promise$asap$$flush;\n return function () {\n channel.port2.postMessage(0);\n };\n }\n\n function lib$es6$promise$asap$$useSetTimeout() {\n return function() {\n setTimeout(lib$es6$promise$asap$$flush, 1);\n };\n }\n\n var lib$es6$promise$asap$$queue = new Array(1000);\n function lib$es6$promise$asap$$flush() {\n for (var i = 0; i < lib$es6$promise$asap$$len; i+=2) {\n var callback = lib$es6$promise$asap$$queue[i];\n var arg = lib$es6$promise$asap$$queue[i+1];\n\n callback(arg);\n\n lib$es6$promise$asap$$queue[i] = undefined;\n lib$es6$promise$asap$$queue[i+1] = undefined;\n }\n\n lib$es6$promise$asap$$len = 0;\n }\n\n function lib$es6$promise$asap$$attemptVertex() {\n try {\n var r = require;\n var vertx = r('vertx');\n lib$es6$promise$asap$$vertxNext = vertx.runOnLoop || vertx.runOnContext;\n return lib$es6$promise$asap$$useVertxTimer();\n } catch(e) {\n return lib$es6$promise$asap$$useSetTimeout();\n }\n }\n\n var lib$es6$promise$asap$$scheduleFlush;\n // Decide what async method to use to triggering processing of queued callbacks:\n if (lib$es6$promise$asap$$isNode) {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useNextTick();\n } else if (lib$es6$promise$asap$$BrowserMutationObserver) {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMutationObserver();\n } else if (lib$es6$promise$asap$$isWorker) {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMessageChannel();\n } else if (lib$es6$promise$asap$$browserWindow === undefined && typeof require === 'function') {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$attemptVertex();\n } else {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useSetTimeout();\n }\n\n function lib$es6$promise$$internal$$noop() {}\n\n var lib$es6$promise$$internal$$PENDING = void 0;\n var lib$es6$promise$$internal$$FULFILLED = 1;\n var lib$es6$promise$$internal$$REJECTED = 2;\n\n var lib$es6$promise$$internal$$GET_THEN_ERROR = new lib$es6$promise$$internal$$ErrorObject();\n\n function lib$es6$promise$$internal$$selfFullfillment() {\n return new TypeError(\"You cannot resolve a promise with itself\");\n }\n\n function lib$es6$promise$$internal$$cannotReturnOwn() {\n return new TypeError('A promises callback cannot return that same promise.');\n }\n\n function lib$es6$promise$$internal$$getThen(promise) {\n try {\n return promise.then;\n } catch(error) {\n lib$es6$promise$$internal$$GET_THEN_ERROR.error = error;\n return lib$es6$promise$$internal$$GET_THEN_ERROR;\n }\n }\n\n function lib$es6$promise$$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$es6$promise$$internal$$handleForeignThenable(promise, thenable, then) {\n lib$es6$promise$asap$$default(function(promise) {\n var sealed = false;\n var error = lib$es6$promise$$internal$$tryThen(then, thenable, function(value) {\n if (sealed) { return; }\n sealed = true;\n if (thenable !== value) {\n lib$es6$promise$$internal$$resolve(promise, value);\n } else {\n lib$es6$promise$$internal$$fulfill(promise, value);\n }\n }, function(reason) {\n if (sealed) { return; }\n sealed = true;\n\n lib$es6$promise$$internal$$reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && error) {\n sealed = true;\n lib$es6$promise$$internal$$reject(promise, error);\n }\n }, promise);\n }\n\n function lib$es6$promise$$internal$$handleOwnThenable(promise, thenable) {\n if (thenable._state === lib$es6$promise$$internal$$FULFILLED) {\n lib$es6$promise$$internal$$fulfill(promise, thenable._result);\n } else if (thenable._state === lib$es6$promise$$internal$$REJECTED) {\n lib$es6$promise$$internal$$reject(promise, thenable._result);\n } else {\n lib$es6$promise$$internal$$subscribe(thenable, undefined, function(value) {\n lib$es6$promise$$internal$$resolve(promise, value);\n }, function(reason) {\n lib$es6$promise$$internal$$reject(promise, reason);\n });\n }\n }\n\n function lib$es6$promise$$internal$$handleMaybeThenable(promise, maybeThenable) {\n if (maybeThenable.constructor === promise.constructor) {\n lib$es6$promise$$internal$$handleOwnThenable(promise, maybeThenable);\n } else {\n var then = lib$es6$promise$$internal$$getThen(maybeThenable);\n\n if (then === lib$es6$promise$$internal$$GET_THEN_ERROR) {\n lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$GET_THEN_ERROR.error);\n } else if (then === undefined) {\n lib$es6$promise$$internal$$fulfill(promise, maybeThenable);\n } else if (lib$es6$promise$utils$$isFunction(then)) {\n lib$es6$promise$$internal$$handleForeignThenable(promise, maybeThenable, then);\n } else {\n lib$es6$promise$$internal$$fulfill(promise, maybeThenable);\n }\n }\n }\n\n function lib$es6$promise$$internal$$resolve(promise, value) {\n if (promise === value) {\n lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$selfFullfillment());\n } else if (lib$es6$promise$utils$$objectOrFunction(value)) {\n lib$es6$promise$$internal$$handleMaybeThenable(promise, value);\n } else {\n lib$es6$promise$$internal$$fulfill(promise, value);\n }\n }\n\n function lib$es6$promise$$internal$$publishRejection(promise) {\n if (promise._onerror) {\n promise._onerror(promise._result);\n }\n\n lib$es6$promise$$internal$$publish(promise);\n }\n\n function lib$es6$promise$$internal$$fulfill(promise, value) {\n if (promise._state !== lib$es6$promise$$internal$$PENDING) { return; }\n\n promise._result = value;\n promise._state = lib$es6$promise$$internal$$FULFILLED;\n\n if (promise._subscribers.length !== 0) {\n lib$es6$promise$asap$$default(lib$es6$promise$$internal$$publish, promise);\n }\n }\n\n function lib$es6$promise$$internal$$reject(promise, reason) {\n if (promise._state !== lib$es6$promise$$internal$$PENDING) { return; }\n promise._state = lib$es6$promise$$internal$$REJECTED;\n promise._result = reason;\n\n lib$es6$promise$asap$$default(lib$es6$promise$$internal$$publishRejection, promise);\n }\n\n function lib$es6$promise$$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$es6$promise$$internal$$FULFILLED] = onFulfillment;\n subscribers[length + lib$es6$promise$$internal$$REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n lib$es6$promise$asap$$default(lib$es6$promise$$internal$$publish, parent);\n }\n }\n\n function lib$es6$promise$$internal$$publish(promise) {\n var subscribers = promise._subscribers;\n var settled = promise._state;\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$es6$promise$$internal$$invokeCallback(settled, child, callback, detail);\n } else {\n callback(detail);\n }\n }\n\n promise._subscribers.length = 0;\n }\n\n function lib$es6$promise$$internal$$ErrorObject() {\n this.error = null;\n }\n\n var lib$es6$promise$$internal$$TRY_CATCH_ERROR = new lib$es6$promise$$internal$$ErrorObject();\n\n function lib$es6$promise$$internal$$tryCatch(callback, detail) {\n try {\n return callback(detail);\n } catch(e) {\n lib$es6$promise$$internal$$TRY_CATCH_ERROR.error = e;\n return lib$es6$promise$$internal$$TRY_CATCH_ERROR;\n }\n }\n\n function lib$es6$promise$$internal$$invokeCallback(settled, promise, callback, detail) {\n var hasCallback = lib$es6$promise$utils$$isFunction(callback),\n value, error, succeeded, failed;\n\n if (hasCallback) {\n value = lib$es6$promise$$internal$$tryCatch(callback, detail);\n\n if (value === lib$es6$promise$$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$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$cannotReturnOwn());\n return;\n }\n\n } else {\n value = detail;\n succeeded = true;\n }\n\n if (promise._state !== lib$es6$promise$$internal$$PENDING) {\n // noop\n } else if (hasCallback && succeeded) {\n lib$es6$promise$$internal$$resolve(promise, value);\n } else if (failed) {\n lib$es6$promise$$internal$$reject(promise, error);\n } else if (settled === lib$es6$promise$$internal$$FULFILLED) {\n lib$es6$promise$$internal$$fulfill(promise, value);\n } else if (settled === lib$es6$promise$$internal$$REJECTED) {\n lib$es6$promise$$internal$$reject(promise, value);\n }\n }\n\n function lib$es6$promise$$internal$$initializePromise(promise, resolver) {\n try {\n resolver(function resolvePromise(value){\n lib$es6$promise$$internal$$resolve(promise, value);\n }, function rejectPromise(reason) {\n lib$es6$promise$$internal$$reject(promise, reason);\n });\n } catch(e) {\n lib$es6$promise$$internal$$reject(promise, e);\n }\n }\n\n function lib$es6$promise$enumerator$$Enumerator(Constructor, input) {\n var enumerator = this;\n\n enumerator._instanceConstructor = Constructor;\n enumerator.promise = new Constructor(lib$es6$promise$$internal$$noop);\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$es6$promise$$internal$$fulfill(enumerator.promise, enumerator._result);\n } else {\n enumerator.length = enumerator.length || 0;\n enumerator._enumerate();\n if (enumerator._remaining === 0) {\n lib$es6$promise$$internal$$fulfill(enumerator.promise, enumerator._result);\n }\n }\n } else {\n lib$es6$promise$$internal$$reject(enumerator.promise, enumerator._validationError());\n }\n }\n\n lib$es6$promise$enumerator$$Enumerator.prototype._validateInput = function(input) {\n return lib$es6$promise$utils$$isArray(input);\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._validationError = function() {\n return new Error('Array Methods must be provided an Array');\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._init = function() {\n this._result = new Array(this.length);\n };\n\n var lib$es6$promise$enumerator$$default = lib$es6$promise$enumerator$$Enumerator;\n\n lib$es6$promise$enumerator$$Enumerator.prototype._enumerate = function() {\n var enumerator = this;\n\n var length = enumerator.length;\n var promise = enumerator.promise;\n var input = enumerator._input;\n\n for (var i = 0; promise._state === lib$es6$promise$$internal$$PENDING && i < length; i++) {\n enumerator._eachEntry(input[i], i);\n }\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._eachEntry = function(entry, i) {\n var enumerator = this;\n var c = enumerator._instanceConstructor;\n\n if (lib$es6$promise$utils$$isMaybeThenable(entry)) {\n if (entry.constructor === c && entry._state !== lib$es6$promise$$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] = entry;\n }\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._settledAt = function(state, i, value) {\n var enumerator = this;\n var promise = enumerator.promise;\n\n if (promise._state === lib$es6$promise$$internal$$PENDING) {\n enumerator._remaining--;\n\n if (state === lib$es6$promise$$internal$$REJECTED) {\n lib$es6$promise$$internal$$reject(promise, value);\n } else {\n enumerator._result[i] = value;\n }\n }\n\n if (enumerator._remaining === 0) {\n lib$es6$promise$$internal$$fulfill(promise, enumerator._result);\n }\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._willSettleAt = function(promise, i) {\n var enumerator = this;\n\n lib$es6$promise$$internal$$subscribe(promise, undefined, function(value) {\n enumerator._settledAt(lib$es6$promise$$internal$$FULFILLED, i, value);\n }, function(reason) {\n enumerator._settledAt(lib$es6$promise$$internal$$REJECTED, i, reason);\n });\n };\n function lib$es6$promise$promise$all$$all(entries) {\n return new lib$es6$promise$enumerator$$default(this, entries).promise;\n }\n var lib$es6$promise$promise$all$$default = lib$es6$promise$promise$all$$all;\n function lib$es6$promise$promise$race$$race(entries) {\n /*jshint validthis:true */\n var Constructor = this;\n\n var promise = new Constructor(lib$es6$promise$$internal$$noop);\n\n if (!lib$es6$promise$utils$$isArray(entries)) {\n lib$es6$promise$$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$es6$promise$$internal$$resolve(promise, value);\n }\n\n function onRejection(reason) {\n lib$es6$promise$$internal$$reject(promise, reason);\n }\n\n for (var i = 0; promise._state === lib$es6$promise$$internal$$PENDING && i < length; i++) {\n lib$es6$promise$$internal$$subscribe(Constructor.resolve(entries[i]), undefined, onFulfillment, onRejection);\n }\n\n return promise;\n }\n var lib$es6$promise$promise$race$$default = lib$es6$promise$promise$race$$race;\n function lib$es6$promise$promise$resolve$$resolve(object) {\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$es6$promise$$internal$$noop);\n lib$es6$promise$$internal$$resolve(promise, object);\n return promise;\n }\n var lib$es6$promise$promise$resolve$$default = lib$es6$promise$promise$resolve$$resolve;\n function lib$es6$promise$promise$reject$$reject(reason) {\n /*jshint validthis:true */\n var Constructor = this;\n var promise = new Constructor(lib$es6$promise$$internal$$noop);\n lib$es6$promise$$internal$$reject(promise, reason);\n return promise;\n }\n var lib$es6$promise$promise$reject$$default = lib$es6$promise$promise$reject$$reject;\n\n var lib$es6$promise$promise$$counter = 0;\n\n function lib$es6$promise$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$es6$promise$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 var lib$es6$promise$promise$$default = lib$es6$promise$promise$$Promise;\n /**\n Promise objects represent the eventual result of an asynchronous operation. The\n primary way of interacting with a promise is through its `then` method, which\n registers callbacks to receive either a promise’s eventual value or the reason\n why the promise cannot be fulfilled.\n\n Terminology\n -----------\n\n - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n - `thenable` is an object or function that defines a `then` method.\n - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n - `exception` is a value that is thrown using the throw statement.\n - `reason` is a value that indicates why a promise was rejected.\n - `settled` the final resting state of a promise, fulfilled or rejected.\n\n A promise can be in one of three states: pending, fulfilled, or rejected.\n\n Promises that are fulfilled have a fulfillment value and are in the fulfilled\n state. Promises that are rejected have a rejection reason and are in the\n rejected state. A fulfillment value is never a thenable.\n\n Promises can also be said to *resolve* a value. If this value is also a\n promise, then the original promise's settled state will match the value's\n settled state. So a promise that *resolves* a promise that rejects will\n itself reject, and a promise that *resolves* a promise that fulfills will\n itself fulfill.\n\n\n Basic Usage:\n ------------\n\n ```js\n var promise = new Promise(function(resolve, reject) {\n // on success\n resolve(value);\n\n // on failure\n reject(reason);\n });\n\n promise.then(function(value) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Advanced Usage:\n ---------------\n\n Promises shine when abstracting away asynchronous interactions such as\n `XMLHttpRequest`s.\n\n ```js\n function getJSON(url) {\n return new Promise(function(resolve, reject){\n var xhr = new XMLHttpRequest();\n\n xhr.open('GET', url);\n xhr.onreadystatechange = handler;\n xhr.responseType = 'json';\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send();\n\n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200) {\n resolve(this.response);\n } else {\n reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n }\n }\n };\n });\n }\n\n getJSON('/posts.json').then(function(json) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Unlike callbacks, promises are great composable primitives.\n\n ```js\n Promise.all([\n getJSON('/posts'),\n getJSON('/comments')\n ]).then(function(values){\n values[0] // => postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class Promise\n @param {function} resolver\n Useful for tooling.\n @constructor\n */\n function lib$es6$promise$promise$$Promise(resolver) {\n this._id = lib$es6$promise$promise$$counter++;\n this._state = undefined;\n this._result = undefined;\n this._subscribers = [];\n\n if (lib$es6$promise$$internal$$noop !== resolver) {\n if (!lib$es6$promise$utils$$isFunction(resolver)) {\n lib$es6$promise$promise$$needsResolver();\n }\n\n if (!(this instanceof lib$es6$promise$promise$$Promise)) {\n lib$es6$promise$promise$$needsNew();\n }\n\n lib$es6$promise$$internal$$initializePromise(this, resolver);\n }\n }\n\n lib$es6$promise$promise$$Promise.all = lib$es6$promise$promise$all$$default;\n lib$es6$promise$promise$$Promise.race = lib$es6$promise$promise$race$$default;\n lib$es6$promise$promise$$Promise.resolve = lib$es6$promise$promise$resolve$$default;\n lib$es6$promise$promise$$Promise.reject = lib$es6$promise$promise$reject$$default;\n lib$es6$promise$promise$$Promise._setScheduler = lib$es6$promise$asap$$setScheduler;\n lib$es6$promise$promise$$Promise._asap = lib$es6$promise$asap$$default;\n\n lib$es6$promise$promise$$Promise.prototype = {\n constructor: lib$es6$promise$promise$$Promise,\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 Useful for tooling.\n @return {Promise}\n */\n then: function(onFulfillment, onRejection) {\n var parent = this;\n var state = parent._state;\n\n if (state === lib$es6$promise$$internal$$FULFILLED && !onFulfillment || state === lib$es6$promise$$internal$$REJECTED && !onRejection) {\n return this;\n }\n\n var child = new this.constructor(lib$es6$promise$$internal$$noop);\n var result = parent._result;\n\n if (state) {\n var callback = arguments[state - 1];\n lib$es6$promise$asap$$default(function(){\n lib$es6$promise$$internal$$invokeCallback(state, child, callback, result);\n });\n } else {\n lib$es6$promise$$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 Useful for tooling.\n @return {Promise}\n */\n 'catch': function(onRejection) {\n return this.then(null, onRejection);\n }\n };\n function lib$es6$promise$polyfill$$polyfill() {\n var local;\n\n if (typeof global !== 'undefined') {\n local = global;\n } else if (typeof self !== 'undefined') {\n local = self;\n } else {\n try {\n local = Function('return this')();\n } catch (e) {\n throw new Error('polyfill failed because global object is unavailable in this environment');\n }\n }\n\n var P = local.Promise;\n\n if (P && Object.prototype.toString.call(P.resolve()) === '[object Promise]' && !P.cast) {\n return;\n }\n\n local.Promise = lib$es6$promise$promise$$default;\n }\n var lib$es6$promise$polyfill$$default = lib$es6$promise$polyfill$$polyfill;\n\n var lib$es6$promise$umd$$ES6Promise = {\n 'Promise': lib$es6$promise$promise$$default,\n 'polyfill': lib$es6$promise$polyfill$$default\n };\n\n /* global define:true module:true window: true */\n if (typeof define === 'function' && define['amd']) {\n define(function() { return lib$es6$promise$umd$$ES6Promise; });\n } else if (typeof module !== 'undefined' && module['exports']) {\n module['exports'] = lib$es6$promise$umd$$ES6Promise;\n } else if (typeof this !== 'undefined') {\n this['ES6Promise'] = lib$es6$promise$umd$$ES6Promise;\n }\n\n lib$es6$promise$polyfill$$default();\n}).call(this);\n\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./bower_components/es6-promise/promise.js\n ** module id = 4\n ** module chunks = 0\n **/","var nextTick = require('process/browser.js').nextTick;\nvar apply = Function.prototype.apply;\nvar slice = Array.prototype.slice;\nvar immediateIds = {};\nvar nextImmediateId = 0;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n return new Timeout(apply.call(setInterval, window, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) { timeout.close(); };\n\nfunction Timeout(id, clearFn) {\n this._id = id;\n this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n this._clearFn.call(window, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n clearTimeout(item._idleTimeoutId);\n\n var msecs = item._idleTimeout;\n if (msecs >= 0) {\n item._idleTimeoutId = setTimeout(function onTimeout() {\n if (item._onTimeout)\n item._onTimeout();\n }, msecs);\n }\n};\n\n// That's not how node.js implements it but the exposed api is the same.\nexports.setImmediate = typeof setImmediate === \"function\" ? setImmediate : function(fn) {\n var id = nextImmediateId++;\n var args = arguments.length < 2 ? false : slice.call(arguments, 1);\n\n immediateIds[id] = true;\n\n nextTick(function onNextTick() {\n if (immediateIds[id]) {\n // fn.call() is faster so we optimize for the common use-case\n // @see http://jsperf.com/call-apply-segu\n if (args) {\n fn.apply(null, args);\n } else {\n fn.call(null);\n }\n // Prevent ids from leaking\n exports.clearImmediate(id);\n }\n });\n\n return id;\n};\n\nexports.clearImmediate = typeof clearImmediate === \"function\" ? clearImmediate : function(id) {\n delete immediateIds[id];\n};\n\n\n/*****************\n ** WEBPACK FOOTER\n ** (webpack)/~/node-libs-browser/~/timers-browserify/main.js\n ** module id = 5\n ** module chunks = 0\n **/","// shim for using process in browser\n\nvar process = module.exports = {};\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = setTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n clearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n setTimeout(drainQueue, 0);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** (webpack)/~/node-libs-browser/~/process/browser.js\n ** module id = 6\n ** module chunks = 0\n **/","module.exports = function(module) {\r\n\tif(!module.webpackPolyfill) {\r\n\t\tmodule.deprecate = function() {};\r\n\t\tmodule.paths = [];\r\n\t\t// module.parent = undefined by default\r\n\t\tmodule.children = [];\r\n\t\tmodule.webpackPolyfill = 1;\r\n\t}\r\n\treturn module;\r\n}\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** (webpack)/buildin/module.js\n ** module id = 7\n ** module chunks = 0\n **/","module.exports = function() { throw new Error(\"define cannot be used indirect\"); };\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** (webpack)/buildin/amd-define.js\n ** module id = 8\n ** module chunks = 0\n **/","(function() {\n 'use strict';\n\n if (self.fetch) {\n return\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n }\n\n function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var list = this.map[name]\n if (!list) {\n list = []\n this.map[name] = list\n }\n list.push(value)\n }\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n }\n\n Headers.prototype.get = function(name) {\n var values = this.map[normalizeName(name)]\n return values ? values[0] : null\n }\n\n Headers.prototype.getAll = function(name) {\n return this.map[normalizeName(name)] || []\n }\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n }\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = [normalizeValue(value)]\n }\n\n Headers.prototype.forEach = function(callback, thisArg) {\n Object.getOwnPropertyNames(this.map).forEach(function(name) {\n this.map[name].forEach(function(value) {\n callback.call(thisArg, value, name, this)\n }, this)\n }, this)\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n reader.readAsArrayBuffer(blob)\n return fileReaderReady(reader)\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader()\n reader.readAsText(blob)\n return fileReaderReady(reader)\n }\n\n var support = {\n blob: 'FileReader' in self && 'Blob' in self && (function() {\n try {\n new Blob();\n return true\n } catch(e) {\n return false\n }\n })(),\n formData: 'FormData' in self\n }\n\n function Body() {\n this.bodyUsed = false\n\n\n this._initBody = function(body) {\n this._bodyInit = body\n if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (!body) {\n this._bodyText = ''\n } else {\n throw new Error('unsupported BodyInit type')\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n } else {\n this.text = function() {\n var rejected = consumed(this)\n return rejected ? rejected : Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return (methods.indexOf(upcased) > -1) ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {}\n var body = options.body\n if (Request.prototype.isPrototypeOf(input)) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n if (!body) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n } else {\n this.url = input\n }\n\n this.credentials = options.credentials || this.credentials || 'omit'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n }\n\n function decode(body) {\n var form = new FormData()\n body.trim().split('&').forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n }\n\n function headers(xhr) {\n var head = new Headers()\n var pairs = xhr.getAllResponseHeaders().trim().split('\\n')\n pairs.forEach(function(header) {\n var split = header.trim().split(':')\n var key = split.shift().trim()\n var value = split.join(':').trim()\n head.append(key, value)\n })\n return head\n }\n\n Body.call(Request.prototype)\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {}\n }\n\n this._initBody(bodyInit)\n this.type = 'default'\n this.url = null\n this.status = options.status\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = options.statusText\n this.headers = options.headers instanceof Headers ? options.headers : new Headers(options.headers)\n this.url = options.url || ''\n }\n\n Body.call(Response.prototype)\n\n self.Headers = Headers;\n self.Request = Request;\n self.Response = Response;\n\n self.fetch = function(input, init) {\n var request\n if (Request.prototype.isPrototypeOf(input) && !init) {\n request = input\n } else {\n request = new Request(input, init)\n }\n\n return new Promise(function(resolve, reject) {\n var xhr = new XMLHttpRequest()\n\n function responseURL() {\n if ('responseURL' in xhr) {\n return xhr.responseURL\n }\n\n // Avoid security warnings on getResponseHeader when not allowed by CORS\n if (/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())) {\n return xhr.getResponseHeader('X-Request-URL')\n }\n\n return;\n }\n\n xhr.onload = function() {\n var status = (xhr.status === 1223) ? 204 : xhr.status\n if (status < 100 || status > 599) {\n reject(new TypeError('Network request failed'))\n return\n }\n var options = {\n status: status,\n statusText: xhr.statusText,\n headers: headers(xhr),\n url: responseURL()\n }\n var body = 'response' in xhr ? xhr.response : xhr.responseText;\n resolve(new Response(body, options))\n }\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.open(request.method, request.url, true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob'\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n }\n self.fetch.polyfill = true\n})();\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./bower_components/fetch/fetch.js\n ** module id = 9\n ** module chunks = 0\n **/","// Version: 3.7.14\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n/* =-========================= JSON =============================-= */\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n\n(window['JSON'] && window['JSON']['stringify']) || (function () {\n window['JSON'] || (window['JSON'] = {});\n\n function toJSON(key) {\n try { return this.valueOf() }\n catch(e) { return null }\n }\n\n var cx = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n escapable = /[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n gap,\n indent,\n meta = { // table of character substitutions\n '\\b': '\\\\b',\n '\\t': '\\\\t',\n '\\n': '\\\\n',\n '\\f': '\\\\f',\n '\\r': '\\\\r',\n '\"' : '\\\\\"',\n '\\\\': '\\\\\\\\'\n },\n rep;\n\n function quote(string) {\n escapable.lastIndex = 0;\n return escapable.test(string) ?\n '\"' + string.replace(escapable, function (a) {\n var c = meta[a];\n return typeof c === 'string' ? c :\n '\\\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n }) + '\"' :\n '\"' + string + '\"';\n }\n\n function str(key, holder) {\n var i, // The loop counter.\n k, // The member key.\n v, // The member value.\n length,\n partial,\n mind = gap,\n value = holder[key];\n\n if (value && typeof value === 'object') {\n value = toJSON.call( value, key );\n }\n\n if (typeof rep === 'function') {\n value = rep.call(holder, key, value);\n }\n\n switch (typeof value) {\n case 'string':\n return quote(value);\n\n case 'number':\n return isFinite(value) ? String(value) : 'null';\n\n case 'boolean':\n case 'null':\n return String(value);\n\n case 'object':\n\n if (!value) {\n return 'null';\n }\n\n gap += indent;\n partial = [];\n\n if (Object.prototype.toString.apply(value) === '[object Array]') {\n\n length = value.length;\n for (i = 0; i < length; i += 1) {\n partial[i] = str(i, value) || 'null';\n }\n\n v = partial.length === 0 ? '[]' :\n gap ? '[\\n' + gap +\n partial.join(',\\n' + gap) + '\\n' +\n mind + ']' :\n '[' + partial.join(',') + ']';\n gap = mind;\n return v;\n }\n if (rep && typeof rep === 'object') {\n length = rep.length;\n for (i = 0; i < length; i += 1) {\n k = rep[i];\n if (typeof k === 'string') {\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? ': ' : ':') + v);\n }\n }\n }\n } else {\n for (k in value) {\n if (Object.hasOwnProperty.call(value, k)) {\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? ': ' : ':') + v);\n }\n }\n }\n }\n\n v = partial.length === 0 ? '{}' :\n gap ? '{\\n' + gap + partial.join(',\\n' + gap) + '\\n' +\n mind + '}' : '{' + partial.join(',') + '}';\n gap = mind;\n return v;\n }\n }\n\n if (typeof JSON['stringify'] !== 'function') {\n JSON['stringify'] = function (value, replacer, space) {\n var i;\n gap = '';\n indent = '';\n\n if (typeof space === 'number') {\n for (i = 0; i < space; i += 1) {\n indent += ' ';\n }\n } else if (typeof space === 'string') {\n indent = space;\n }\n rep = replacer;\n if (replacer && typeof replacer !== 'function' &&\n (typeof replacer !== 'object' ||\n typeof replacer.length !== 'number')) {\n throw new Error('JSON.stringify');\n }\n return str('', {'': value});\n };\n }\n\n if (typeof JSON['parse'] !== 'function') {\n // JSON is parsed on the server for security.\n JSON['parse'] = function (text) {return eval('('+text+')')};\n }\n}());\nvar NOW = 1\n, READY = false\n, READY_BUFFER = []\n, PRESENCE_SUFFIX = '-pnpres'\n, DEF_WINDOWING = 10 // MILLISECONDS.\n, DEF_TIMEOUT = 10000 // MILLISECONDS.\n, DEF_SUB_TIMEOUT = 310 // SECONDS.\n, DEF_KEEPALIVE = 60 // SECONDS (FOR TIMESYNC).\n, SECOND = 1000 // A THOUSAND MILLISECONDS.\n, URLBIT = '/'\n, PARAMSBIT = '&'\n, PRESENCE_HB_THRESHOLD = 5\n, PRESENCE_HB_DEFAULT = 30\n, SDK_VER = '3.7.14'\n, REPL = /{([\\w\\-]+)}/g;\n\n/**\n * UTILITIES\n */\nfunction unique() { return'x'+ ++NOW+''+(+new Date) }\nfunction rnow() { return+new Date }\n\n/**\n * NEXTORIGIN\n * ==========\n * var next_origin = nextorigin();\n */\nvar nextorigin = (function() {\n var max = 20\n , ori = Math.floor(Math.random() * max);\n return function( origin, failover ) {\n return origin.indexOf('pubsub.') > 0\n && origin.replace(\n 'pubsub', 'ps' + (\n failover ? generate_uuid().split('-')[0] :\n (++ori < max? ori : ori=1)\n ) ) || origin;\n }\n})();\n\n\n/**\n * Build Url\n * =======\n *\n */\nfunction build_url( url_components, url_params ) {\n var url = url_components.join(URLBIT)\n , params = [];\n\n if (!url_params) return url;\n\n each( url_params, function( key, value ) {\n var value_str = (typeof value == 'object')?JSON['stringify'](value):value;\n (typeof value != 'undefined' &&\n value != null && encode(value_str).length > 0\n ) && params.push(key + \"=\" + encode(value_str));\n } );\n\n url += \"?\" + params.join(PARAMSBIT);\n return url;\n}\n\n/**\n * UPDATER\n * =======\n * var timestamp = unique();\n */\nfunction updater( fun, rate ) {\n var timeout\n , last = 0\n , runnit = function() {\n if (last + rate > rnow()) {\n clearTimeout(timeout);\n timeout = setTimeout( runnit, rate );\n }\n else {\n last = rnow();\n fun();\n }\n };\n\n return runnit;\n}\n\n/**\n * GREP\n * ====\n * var list = grep( [1,2,3], function(item) { return item % 2 } )\n */\nfunction grep( list, fun ) {\n var fin = [];\n each( list || [], function(l) { fun(l) && fin.push(l) } );\n return fin\n}\n\n/**\n * SUPPLANT\n * ========\n * var text = supplant( 'Hello {name}!', { name : 'John' } )\n */\nfunction supplant( str, values ) {\n return str.replace( REPL, function( _, match ) {\n return values[match] || _\n } );\n}\n\n/**\n * timeout\n * =======\n * timeout( function(){}, 100 );\n */\nfunction timeout( fun, wait ) {\n return setTimeout( fun, wait );\n}\n\n/**\n * uuid\n * ====\n * var my_uuid = generate_uuid();\n */\nfunction generate_uuid(callback) {\n var u = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,\n function(c) {\n var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);\n return v.toString(16);\n });\n if (callback) callback(u);\n return u;\n}\n\nfunction isArray(arg) {\n return !!arg && typeof arg !== 'string' && (Array.isArray && Array.isArray(arg) || typeof(arg.length) === \"number\")\n //return !!arg && (Array.isArray && Array.isArray(arg) || typeof(arg.length) === \"number\")\n}\n\n/**\n * EACH\n * ====\n * each( [1,2,3], function(item) { } )\n */\nfunction each( o, f) {\n if ( !o || !f ) return;\n\n if ( isArray(o) )\n for ( var i = 0, l = o.length; i < l; )\n f.call( o[i], o[i], i++ );\n else\n for ( var i in o )\n o.hasOwnProperty &&\n o.hasOwnProperty(i) &&\n f.call( o[i], i, o[i] );\n}\n\n/**\n * MAP\n * ===\n * var list = map( [1,2,3], function(item) { return item + 1 } )\n */\nfunction map( list, fun ) {\n var fin = [];\n each( list || [], function( k, v ) { fin.push(fun( k, v )) } );\n return fin;\n}\n\n\nfunction pam_encode(str) {\n return encodeURIComponent(str).replace(/[!'()*~]/g, function(c) {\n return '%' + c.charCodeAt(0).toString(16).toUpperCase();\n });\n}\n\n/**\n * ENCODE\n * ======\n * var encoded_data = encode('path');\n */\nfunction encode(path) { return encodeURIComponent(path) }\n\n/**\n * Generate Subscription Channel List\n * ==================================\n * generate_channel_list(channels_object);\n */\nfunction generate_channel_list(channels, nopresence) {\n var list = [];\n each( channels, function( channel, status ) {\n if (nopresence) {\n if(channel.search('-pnpres') < 0) {\n if (status.subscribed) list.push(channel);\n }\n } else {\n if (status.subscribed) list.push(channel);\n }\n });\n return list.sort();\n}\n\n/**\n * Generate Subscription Channel Groups List\n * ==================================\n * generate_channel_group_list(channels_groups object);\n */\nfunction generate_channel_group_list(channel_groups, nopresence) {\n var list = [];\n each(channel_groups, function( channel_group, status ) {\n if (nopresence) {\n if(channel_group.search('-pnpres') < 0) {\n if (status.subscribed) list.push(channel_group);\n }\n } else {\n if (status.subscribed) list.push(channel_group);\n }\n });\n return list.sort();\n}\n\n// PUBNUB READY TO CONNECT\nfunction ready() { timeout( function() {\n if (READY) return;\n READY = 1;\n each( READY_BUFFER, function(connect) { connect() } );\n}, SECOND ); }\n\nfunction PNmessage(args) {\n msg = args || {'apns' : {}},\n msg['getPubnubMessage'] = function() {\n var m = {};\n\n if (Object.keys(msg['apns']).length) {\n m['pn_apns'] = {\n 'aps' : {\n 'alert' : msg['apns']['alert'] ,\n 'badge' : msg['apns']['badge']\n }\n }\n for (var k in msg['apns']) {\n m['pn_apns'][k] = msg['apns'][k];\n }\n var exclude1 = ['badge','alert'];\n for (var k in exclude1) {\n delete m['pn_apns'][exclude1[k]];\n }\n }\n\n\n\n if (msg['gcm']) {\n m['pn_gcm'] = {\n 'data' : msg['gcm']\n }\n }\n\n for (var k in msg) {\n m[k] = msg[k];\n }\n var exclude = ['apns','gcm','publish', 'channel','callback','error'];\n for (var k in exclude) {\n delete m[exclude[k]];\n }\n\n return m;\n };\n msg['publish'] = function() {\n\n var m = msg.getPubnubMessage();\n\n if (msg['pubnub'] && msg['channel']) {\n msg['pubnub'].publish({\n 'message' : m,\n 'channel' : msg['channel'],\n 'callback' : msg['callback'],\n 'error' : msg['error']\n })\n }\n };\n return msg;\n}\n\nfunction PN_API(setup) {\n var SUB_WINDOWING = +setup['windowing'] || DEF_WINDOWING\n , SUB_TIMEOUT = (+setup['timeout'] || DEF_SUB_TIMEOUT) * SECOND\n , KEEPALIVE = (+setup['keepalive'] || DEF_KEEPALIVE) * SECOND\n , TIME_CHECK = setup['timecheck'] || 0\n , NOLEAVE = setup['noleave'] || 0\n , PUBLISH_KEY = setup['publish_key']\n , SUBSCRIBE_KEY = setup['subscribe_key']\n , AUTH_KEY = setup['auth_key'] || ''\n , SECRET_KEY = setup['secret_key'] || ''\n , hmac_SHA256 = setup['hmac_SHA256']\n , SSL = setup['ssl'] ? 's' : ''\n , ORIGIN = 'http'+SSL+'://'+(setup['origin']||'pubsub.pubnub.com')\n , STD_ORIGIN = nextorigin(ORIGIN)\n , SUB_ORIGIN = nextorigin(ORIGIN)\n , CONNECT = function(){}\n , PUB_QUEUE = []\n , CLOAK = true\n , TIME_DRIFT = 0\n , SUB_CALLBACK = 0\n , SUB_CHANNEL = 0\n , SUB_RECEIVER = 0\n , SUB_RESTORE = setup['restore'] || 0\n , SUB_BUFF_WAIT = 0\n , TIMETOKEN = 0\n , RESUMED = false\n , CHANNELS = {}\n , CHANNEL_GROUPS = {}\n , SUB_ERROR = function(){}\n , STATE = {}\n , PRESENCE_HB_TIMEOUT = null\n , PRESENCE_HB = validate_presence_heartbeat(\n setup['heartbeat'] || setup['pnexpires'] || 0, setup['error']\n )\n , PRESENCE_HB_INTERVAL = setup['heartbeat_interval'] || (PRESENCE_HB / 2) -1\n , PRESENCE_HB_RUNNING = false\n , NO_WAIT_FOR_PENDING = setup['no_wait_for_pending']\n , COMPATIBLE_35 = setup['compatible_3.5'] || false\n , xdr = setup['xdr']\n , params = setup['params'] || {}\n , error = setup['error'] || function() {}\n , _is_online = setup['_is_online'] || function() { return 1 }\n , jsonp_cb = setup['jsonp_cb'] || function() { return 0 }\n , db = setup['db'] || {'get': function(){}, 'set': function(){}}\n , CIPHER_KEY = setup['cipher_key']\n , UUID = setup['uuid'] || ( !setup['unique_uuid'] && db && db['get'](SUBSCRIBE_KEY+'uuid') || '')\n , USE_INSTANCEID = setup['instance_id'] || false\n , INSTANCEID = ''\n , shutdown = setup['shutdown']\n , use_send_beacon = (typeof setup['use_send_beacon'] != 'undefined')?setup['use_send_beacon']:true\n , sendBeacon = (use_send_beacon)?setup['sendBeacon']:null\n , _poll_timer\n , _poll_timer2;\n\n if (PRESENCE_HB === 2) PRESENCE_HB_INTERVAL = 1;\n\n var crypto_obj = setup['crypto_obj'] ||\n {\n 'encrypt' : function(a,key){ return a},\n 'decrypt' : function(b,key){return b}\n };\n\n function _get_url_params(data) {\n if (!data) data = {};\n each( params , function( key, value ) {\n if (!(key in data)) data[key] = value;\n });\n return data;\n }\n\n function _object_to_key_list(o) {\n var l = []\n each( o , function( key, value ) {\n l.push(key);\n });\n return l;\n }\n function _object_to_key_list_sorted(o) {\n return _object_to_key_list(o).sort();\n }\n\n function _get_pam_sign_input_from_params(params) {\n var si = \"\";\n var l = _object_to_key_list_sorted(params);\n\n for (var i in l) {\n var k = l[i]\n si += k + \"=\" + pam_encode(params[k]) ;\n if (i != l.length - 1) si += \"&\"\n }\n return si;\n }\n\n function validate_presence_heartbeat(heartbeat, cur_heartbeat, error) {\n var err = false;\n\n if (typeof heartbeat === 'undefined') {\n return cur_heartbeat;\n }\n\n if (typeof heartbeat === 'number') {\n if (heartbeat > PRESENCE_HB_THRESHOLD || heartbeat == 0)\n err = false;\n else\n err = true;\n } else if(typeof heartbeat === 'boolean'){\n if (!heartbeat) {\n return 0;\n } else {\n return PRESENCE_HB_DEFAULT;\n }\n } else {\n err = true;\n }\n\n if (err) {\n error && error(\"Presence Heartbeat value invalid. Valid range ( x > \" + PRESENCE_HB_THRESHOLD + \" or x = 0). Current Value : \" + (cur_heartbeat || PRESENCE_HB_THRESHOLD));\n return cur_heartbeat || PRESENCE_HB_THRESHOLD;\n } else return heartbeat;\n }\n\n function encrypt(input, key) {\n return crypto_obj['encrypt'](input, key || CIPHER_KEY) || input;\n }\n function decrypt(input, key) {\n return crypto_obj['decrypt'](input, key || CIPHER_KEY) ||\n crypto_obj['decrypt'](input, CIPHER_KEY) ||\n input;\n }\n\n function error_common(message, callback) {\n callback && callback({ 'error' : message || \"error occurred\"});\n error && error(message);\n }\n function _presence_heartbeat() {\n\n clearTimeout(PRESENCE_HB_TIMEOUT);\n\n if (!PRESENCE_HB_INTERVAL || PRESENCE_HB_INTERVAL >= 500 ||\n PRESENCE_HB_INTERVAL < 1 ||\n (!generate_channel_list(CHANNELS,true).length && !generate_channel_group_list(CHANNEL_GROUPS, true).length ) )\n {\n PRESENCE_HB_RUNNING = false;\n return;\n }\n\n PRESENCE_HB_RUNNING = true;\n SELF['presence_heartbeat']({\n 'callback' : function(r) {\n PRESENCE_HB_TIMEOUT = timeout( _presence_heartbeat, (PRESENCE_HB_INTERVAL) * SECOND );\n },\n 'error' : function(e) {\n error && error(\"Presence Heartbeat unable to reach Pubnub servers.\" + JSON.stringify(e));\n PRESENCE_HB_TIMEOUT = timeout( _presence_heartbeat, (PRESENCE_HB_INTERVAL) * SECOND );\n }\n });\n }\n\n function start_presence_heartbeat() {\n !PRESENCE_HB_RUNNING && _presence_heartbeat();\n }\n\n function publish(next) {\n\n if (NO_WAIT_FOR_PENDING) {\n if (!PUB_QUEUE.length) return;\n } else {\n if (next) PUB_QUEUE.sending = 0;\n if ( PUB_QUEUE.sending || !PUB_QUEUE.length ) return;\n PUB_QUEUE.sending = 1;\n }\n\n xdr(PUB_QUEUE.shift());\n }\n function each_channel_group(callback) {\n var count = 0;\n\n each( generate_channel_group_list(CHANNEL_GROUPS), function(channel_group) {\n var chang = CHANNEL_GROUPS[channel_group];\n\n if (!chang) return;\n\n count++;\n (callback||function(){})(chang);\n } );\n\n return count;\n }\n\n function each_channel(callback) {\n var count = 0;\n\n each( generate_channel_list(CHANNELS), function(channel) {\n var chan = CHANNELS[channel];\n\n if (!chan) return;\n\n count++;\n (callback||function(){})(chan);\n } );\n\n return count;\n }\n function _invoke_callback(response, callback, err) {\n if (typeof response == 'object') {\n if (response['error']) {\n var callback_data = {};\n\n if (response['message']) {\n callback_data['message'] = response['message'];\n }\n\n if (response['payload']) {\n callback_data['payload'] = response['payload'];\n }\n\n err && err(callback_data);\n return;\n\n }\n if (response['payload']) {\n if (response['next_page'])\n callback && callback(response['payload'], response['next_page']);\n else\n callback && callback(response['payload']);\n return;\n }\n }\n callback && callback(response);\n }\n\n function _invoke_error(response,err) {\n\n if (typeof response == 'object' && response['error']) {\n var callback_data = {};\n\n if (response['message']) {\n callback_data['message'] = response['message'];\n }\n\n if (response['payload']) {\n callback_data['payload'] = response['payload'];\n }\n \n err && err(callback_data);\n return;\n } else {\n err && err(response);\n }\n }\n function CR(args, callback, url1, data) {\n var callback = args['callback'] || callback\n , err = args['error'] || error\n , jsonp = jsonp_cb();\n\n data = data || {};\n \n if (!data['auth']) {\n data['auth'] = args['auth_key'] || AUTH_KEY;\n }\n \n var url = [\n STD_ORIGIN, 'v1', 'channel-registration',\n 'sub-key', SUBSCRIBE_KEY\n ];\n\n url.push.apply(url,url1);\n \n if (jsonp) data['callback'] = jsonp;\n \n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : url\n });\n\n }\n\n // Announce Leave Event\n var SELF = {\n 'LEAVE' : function( channel, blocking, auth_key, callback, error ) {\n\n var data = { 'uuid' : UUID, 'auth' : auth_key || AUTH_KEY }\n , origin = nextorigin(ORIGIN)\n , callback = callback || function(){}\n , err = error || function(){}\n , url\n , jsonp = jsonp_cb();\n\n\n\n // Prevent Leaving a Presence Channel\n if (channel.indexOf(PRESENCE_SUFFIX) > 0) return true;\n\n\n\n\n if (COMPATIBLE_35) {\n if (!SSL) return false;\n if (jsonp == '0') return false;\n }\n\n if (NOLEAVE) return false;\n\n if (jsonp != '0') data['callback'] = jsonp;\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n url = [\n origin, 'v2', 'presence', 'sub_key',\n SUBSCRIBE_KEY, 'channel', encode(channel), 'leave'\n ];\n\n params = _get_url_params(data);\n\n\n if (sendBeacon) {\n url_string = build_url(url, params);\n if (sendBeacon(url_string)) {\n callback && callback({\"status\": 200, \"action\": \"leave\", \"message\": \"OK\", \"service\": \"Presence\"});\n return true;\n }\n }\n\n\n xdr({\n blocking : blocking || SSL,\n timeout : 2000,\n callback : jsonp,\n data : params,\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : url\n });\n return true;\n },\n 'LEAVE_GROUP' : function( channel_group, blocking, auth_key, callback, error ) {\n\n var data = { 'uuid' : UUID, 'auth' : auth_key || AUTH_KEY }\n , origin = nextorigin(ORIGIN)\n , callback = callback || function(){}\n , err = error || function(){}\n , jsonp = jsonp_cb();\n\n // Prevent Leaving a Presence Channel Group\n if (channel_group.indexOf(PRESENCE_SUFFIX) > 0) return true;\n\n if (COMPATIBLE_35) {\n if (!SSL) return false;\n if (jsonp == '0') return false;\n }\n\n if (NOLEAVE) return false;\n\n if (jsonp != '0') data['callback'] = jsonp;\n\n if (channel_group && channel_group.length > 0) data['channel-group'] = channel_group;\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n blocking : blocking || SSL,\n timeout : 5000,\n callback : jsonp,\n data : _get_url_params(data),\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : [\n origin, 'v2', 'presence', 'sub_key',\n SUBSCRIBE_KEY, 'channel', encode(','), 'leave'\n ]\n });\n return true;\n },\n 'set_resumed' : function(resumed) {\n RESUMED = resumed;\n },\n 'get_cipher_key' : function() {\n return CIPHER_KEY;\n },\n 'set_cipher_key' : function(key) {\n CIPHER_KEY = key;\n },\n 'raw_encrypt' : function(input, key) {\n return encrypt(input, key);\n },\n 'raw_decrypt' : function(input, key) {\n return decrypt(input, key);\n },\n 'get_heartbeat' : function() {\n return PRESENCE_HB;\n },\n \n 'set_heartbeat' : function(heartbeat, heartbeat_interval) {\n PRESENCE_HB = validate_presence_heartbeat(heartbeat, PRESENCE_HB, error);\n PRESENCE_HB_INTERVAL = heartbeat_interval || (PRESENCE_HB / 2) - 1;\n if (PRESENCE_HB == 2) {\n PRESENCE_HB_INTERVAL = 1;\n }\n CONNECT();\n _presence_heartbeat();\n },\n \n 'get_heartbeat_interval' : function() {\n return PRESENCE_HB_INTERVAL;\n },\n \n 'set_heartbeat_interval' : function(heartbeat_interval) {\n PRESENCE_HB_INTERVAL = heartbeat_interval;\n _presence_heartbeat();\n },\n \n 'get_version' : function() {\n return SDK_VER;\n },\n 'getGcmMessageObject' : function(obj) {\n return {\n 'data' : obj\n }\n },\n 'getApnsMessageObject' : function(obj) {\n var x = {\n 'aps' : { 'badge' : 1, 'alert' : ''}\n }\n for (k in obj) {\n k[x] = obj[k];\n }\n return x;\n },\n 'newPnMessage' : function() {\n var x = {};\n if (gcm) x['pn_gcm'] = gcm;\n if (apns) x['pn_apns'] = apns;\n for ( k in n ) {\n x[k] = n[k];\n }\n return x;\n },\n\n '_add_param' : function(key,val) {\n params[key] = val;\n },\n\n 'channel_group' : function(args, callback) {\n var ns_ch = args['channel_group']\n , callback = callback || args['callback']\n , channels = args['channels'] || args['channel']\n , cloak = args['cloak']\n , namespace\n , channel_group\n , url = []\n , data = {}\n , mode = args['mode'] || 'add';\n\n\n if (ns_ch) {\n var ns_ch_a = ns_ch.split(':');\n\n if (ns_ch_a.length > 1) {\n namespace = (ns_ch_a[0] === '*')?null:ns_ch_a[0];\n\n channel_group = ns_ch_a[1];\n } else {\n channel_group = ns_ch_a[0];\n }\n }\n\n namespace && url.push('namespace') && url.push(encode(namespace));\n\n url.push('channel-group');\n\n if (channel_group && channel_group !== '*') {\n url.push(channel_group);\n }\n\n if (channels ) {\n if (isArray(channels)) {\n channels = channels.join(',');\n }\n data[mode] = channels;\n data['cloak'] = (CLOAK)?'true':'false';\n } else {\n if (mode === 'remove') url.push('remove');\n }\n\n if (typeof cloak != 'undefined') data['cloak'] = (cloak)?'true':'false';\n\n CR(args, callback, url, data);\n },\n\n 'channel_group_list_groups' : function(args, callback) {\n var namespace;\n\n namespace = args['namespace'] || args['ns'] || args['channel_group'] || null;\n if (namespace) {\n args[\"channel_group\"] = namespace + \":*\";\n }\n\n SELF['channel_group'](args, callback);\n },\n\n 'channel_group_list_channels' : function(args, callback) {\n if (!args['channel_group']) return error('Missing Channel Group');\n SELF['channel_group'](args, callback);\n },\n\n 'channel_group_remove_channel' : function(args, callback) {\n if (!args['channel_group']) return error('Missing Channel Group');\n if (!args['channel'] && !args['channels'] ) return error('Missing Channel');\n\n args['mode'] = 'remove';\n SELF['channel_group'](args,callback);\n },\n\n 'channel_group_remove_group' : function(args, callback) {\n if (!args['channel_group']) return error('Missing Channel Group');\n if (args['channel']) return error('Use channel_group_remove_channel if you want to remove a channel from a group.');\n\n args['mode'] = 'remove';\n SELF['channel_group'](args,callback);\n },\n\n 'channel_group_add_channel' : function(args, callback) {\n if (!args['channel_group']) return error('Missing Channel Group');\n if (!args['channel'] && !args['channels'] ) return error('Missing Channel');\n SELF['channel_group'](args,callback);\n },\n\n 'channel_group_cloak' : function(args, callback) {\n if (typeof args['cloak'] == 'undefined') {\n callback(CLOAK);\n return;\n }\n CLOAK = args['cloak'];\n SELF['channel_group'](args,callback);\n },\n\n 'channel_group_list_namespaces' : function(args, callback) {\n var url = ['namespace'];\n CR(args, callback, url);\n },\n 'channel_group_remove_namespace' : function(args, callback) {\n var url = ['namespace',args['namespace'],'remove'];\n CR(args, callback, url);\n },\n\n /*\n PUBNUB.history({\n channel : 'my_chat_channel',\n limit : 100,\n callback : function(history) { }\n });\n */\n 'history' : function( args, callback ) {\n var callback = args['callback'] || callback\n , count = args['count'] || args['limit'] || 100\n , reverse = args['reverse'] || \"false\"\n , err = args['error'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , cipher_key = args['cipher_key']\n , channel = args['channel']\n , channel_group = args['channel_group']\n , start = args['start']\n , end = args['end']\n , include_token = args['include_token']\n , string_msg_token = args['string_message_token'] || false\n , params = {}\n , jsonp = jsonp_cb();\n\n // Make sure we have a Channel\n if (!channel && !channel_group) return error('Missing Channel');\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n params['stringtoken'] = 'true';\n params['count'] = count;\n params['reverse'] = reverse;\n params['auth'] = auth_key;\n\n if (channel_group) {\n params['channel-group'] = channel_group;\n if (!channel) {\n channel = ','; \n }\n }\n if (jsonp) params['callback'] = jsonp;\n if (start) params['start'] = start;\n if (end) params['end'] = end;\n if (include_token) params['include_token'] = 'true';\n if (string_msg_token) params['string_message_token'] = 'true';\n\n // Send Message\n xdr({\n callback : jsonp,\n data : _get_url_params(params),\n success : function(response) {\n if (typeof response == 'object' && response['error']) {\n err({'message' : response['message'], 'payload' : response['payload']});\n return;\n }\n var messages = response[0];\n var decrypted_messages = [];\n for (var a = 0; a < messages.length; a++) {\n var new_message = decrypt(messages[a],cipher_key);\n try {\n decrypted_messages['push'](JSON['parse'](new_message));\n } catch (e) {\n decrypted_messages['push']((new_message));\n }\n }\n callback([decrypted_messages, response[1], response[2]]);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : [\n STD_ORIGIN, 'v2', 'history', 'sub-key',\n SUBSCRIBE_KEY, 'channel', encode(channel)\n ]\n });\n },\n\n /*\n PUBNUB.replay({\n source : 'my_channel',\n destination : 'new_channel'\n });\n */\n 'replay' : function(args, callback) {\n var callback = callback || args['callback'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , source = args['source']\n , destination = args['destination']\n , stop = args['stop']\n , start = args['start']\n , end = args['end']\n , reverse = args['reverse']\n , limit = args['limit']\n , jsonp = jsonp_cb()\n , data = {}\n , url;\n\n // Check User Input\n if (!source) return error('Missing Source Channel');\n if (!destination) return error('Missing Destination Channel');\n if (!PUBLISH_KEY) return error('Missing Publish Key');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n // Setup URL Params\n if (jsonp != '0') data['callback'] = jsonp;\n if (stop) data['stop'] = 'all';\n if (reverse) data['reverse'] = 'true';\n if (start) data['start'] = start;\n if (end) data['end'] = end;\n if (limit) data['count'] = limit;\n\n data['auth'] = auth_key;\n\n // Compose URL Parts\n url = [\n STD_ORIGIN, 'v1', 'replay',\n PUBLISH_KEY, SUBSCRIBE_KEY,\n source, destination\n ];\n\n // Start (or Stop) Replay!\n xdr({\n callback : jsonp,\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function() { callback([ 0, 'Disconnected' ]) },\n url : url,\n data : _get_url_params(data)\n });\n },\n\n /*\n PUBNUB.auth('AJFLKAJSDKLA');\n */\n 'auth' : function(auth) {\n AUTH_KEY = auth;\n CONNECT();\n },\n\n /*\n PUBNUB.time(function(time){ });\n */\n 'time' : function(callback) {\n var jsonp = jsonp_cb();\n\n var data = { 'uuid' : UUID, 'auth' : AUTH_KEY }\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n timeout : SECOND * 5,\n url : [STD_ORIGIN, 'time', jsonp],\n success : function(response) { callback(response[0]) },\n fail : function() { callback(0) }\n });\n },\n\n /*\n PUBNUB.publish({\n channel : 'my_chat_channel',\n message : 'hello!'\n });\n */\n 'publish' : function( args, callback ) {\n var msg = args['message'];\n if (!msg) return error('Missing Message');\n\n var callback = callback || args['callback'] || msg['callback'] || function(){}\n , channel = args['channel'] || msg['channel']\n , auth_key = args['auth_key'] || AUTH_KEY\n , cipher_key = args['cipher_key']\n , err = args['error'] || msg['error'] || function() {}\n , post = args['post'] || false\n , store = ('store_in_history' in args) ? args['store_in_history']: true\n , jsonp = jsonp_cb()\n , add_msg = 'push'\n , params\n , url;\n\n if (args['prepend']) add_msg = 'unshift'\n\n if (!channel) return error('Missing Channel');\n if (!PUBLISH_KEY) return error('Missing Publish Key');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n if (msg['getPubnubMessage']) {\n msg = msg['getPubnubMessage']();\n }\n\n // If trying to send Object\n msg = JSON['stringify'](encrypt(msg, cipher_key));\n\n // Create URL\n url = [\n STD_ORIGIN, 'publish',\n PUBLISH_KEY, SUBSCRIBE_KEY,\n 0, encode(channel),\n jsonp, encode(msg)\n ];\n\n params = { 'uuid' : UUID, 'auth' : auth_key }\n\n if (!store) params['store'] =\"0\"\n\n if (USE_INSTANCEID) params['instanceid'] = INSTANCEID;\n\n // Queue Message Send\n PUB_QUEUE[add_msg]({\n callback : jsonp,\n timeout : SECOND * 5,\n url : url,\n data : _get_url_params(params),\n fail : function(response){\n _invoke_error(response, err);\n publish(1);\n },\n success : function(response) {\n _invoke_callback(response, callback, err);\n publish(1);\n },\n mode : (post)?'POST':'GET'\n });\n\n // Send Message\n publish();\n },\n\n /*\n PUBNUB.unsubscribe({ channel : 'my_chat' });\n */\n 'unsubscribe' : function(args, callback) {\n var channel = args['channel']\n , channel_group = args['channel_group']\n , auth_key = args['auth_key'] || AUTH_KEY\n , callback = callback || args['callback'] || function(){}\n , err = args['error'] || function(){};\n\n TIMETOKEN = 0;\n //SUB_RESTORE = 1; REVISIT !!!!\n\n if (channel) {\n // Prepare Channel(s)\n channel = map( (\n channel.join ? channel.join(',') : ''+channel\n ).split(','), function(channel) {\n if (!CHANNELS[channel]) return;\n return channel + ',' + channel + PRESENCE_SUFFIX;\n } ).join(',');\n\n // Iterate over Channels\n each( channel.split(','), function(ch) {\n var CB_CALLED = true;\n if (!ch) return;\n CHANNELS[ch] = 0;\n if (ch in STATE) delete STATE[ch];\n if (READY) {\n CB_CALLED = SELF['LEAVE']( ch, 0 , auth_key, callback, err);\n }\n if (!CB_CALLED) callback({action : \"leave\"});\n\n \n } );\n }\n\n if (channel_group) {\n // Prepare channel group(s)\n channel_group = map( (\n channel_group.join ? channel_group.join(',') : ''+channel_group\n ).split(','), function(channel_group) {\n if (!CHANNEL_GROUPS[channel_group]) return;\n return channel_group + ',' + channel_group + PRESENCE_SUFFIX;\n } ).join(',');\n\n // Iterate over channel groups\n each( channel_group.split(','), function(chg) {\n var CB_CALLED = true;\n if (!chg) return;\n CHANNEL_GROUPS[chg] = 0;\n if (chg in STATE) delete STATE[chg];\n if (READY) {\n CB_CALLED = SELF['LEAVE_GROUP']( chg, 0 , auth_key, callback, err);\n }\n if (!CB_CALLED) callback({action : \"leave\"});\n\n } );\n }\n\n // Reset Connection if Count Less\n CONNECT();\n },\n\n /*\n PUBNUB.subscribe({\n channel : 'my_chat'\n callback : function(message) { }\n });\n */\n 'subscribe' : function( args, callback ) {\n var channel = args['channel']\n , channel_group = args['channel_group']\n , callback = callback || args['callback']\n , callback = callback || args['message']\n , connect = args['connect'] || function(){}\n , reconnect = args['reconnect'] || function(){}\n , disconnect = args['disconnect'] || function(){}\n , SUB_ERROR = args['error'] || SUB_ERROR || function(){}\n , idlecb = args['idle'] || function(){}\n , presence = args['presence'] || 0\n , noheresync = args['noheresync'] || 0\n , backfill = args['backfill'] || 0\n , timetoken = args['timetoken'] || 0\n , sub_timeout = args['timeout'] || SUB_TIMEOUT\n , windowing = args['windowing'] || SUB_WINDOWING\n , state = args['state']\n , heartbeat = args['heartbeat'] || args['pnexpires']\n , heartbeat_interval = args['heartbeat_interval']\n , restore = args['restore'] || SUB_RESTORE;\n\n AUTH_KEY = args['auth_key'] || AUTH_KEY;\n\n // Restore Enabled?\n SUB_RESTORE = restore;\n\n // Always Reset the TT\n TIMETOKEN = timetoken;\n\n // Make sure we have a Channel\n if (!channel && !channel_group) {\n return error('Missing Channel');\n }\n\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n if (heartbeat || heartbeat === 0 || heartbeat_interval || heartbeat_interval === 0) {\n SELF['set_heartbeat'](heartbeat, heartbeat_interval);\n }\n\n // Setup Channel(s)\n if (channel) {\n each( (channel.join ? channel.join(',') : ''+channel).split(','),\n function(channel) {\n var settings = CHANNELS[channel] || {};\n\n // Store Channel State\n CHANNELS[SUB_CHANNEL = channel] = {\n name : channel,\n connected : settings.connected,\n disconnected : settings.disconnected,\n subscribed : 1,\n callback : SUB_CALLBACK = callback,\n 'cipher_key' : args['cipher_key'],\n connect : connect,\n disconnect : disconnect,\n reconnect : reconnect\n };\n\n if (state) {\n if (channel in state) {\n STATE[channel] = state[channel];\n } else {\n STATE[channel] = state;\n }\n }\n\n // Presence Enabled?\n if (!presence) return;\n\n // Subscribe Presence Channel\n SELF['subscribe']({\n 'channel' : channel + PRESENCE_SUFFIX,\n 'callback' : presence,\n 'restore' : restore\n });\n\n // Presence Subscribed?\n if (settings.subscribed) return;\n\n // See Who's Here Now?\n if (noheresync) return;\n SELF['here_now']({\n 'channel' : channel,\n 'data' : _get_url_params({ 'uuid' : UUID, 'auth' : AUTH_KEY }),\n 'callback' : function(here) {\n each( 'uuids' in here ? here['uuids'] : [],\n function(uid) { presence( {\n 'action' : 'join',\n 'uuid' : uid,\n 'timestamp' : Math.floor(rnow() / 1000),\n 'occupancy' : here['occupancy'] || 1\n }, here, channel ); } );\n }\n });\n } );\n }\n\n // Setup Channel Groups\n if (channel_group) {\n each( (channel_group.join ? channel_group.join(',') : ''+channel_group).split(','),\n function(channel_group) {\n var settings = CHANNEL_GROUPS[channel_group] || {};\n\n CHANNEL_GROUPS[channel_group] = {\n name : channel_group,\n connected : settings.connected,\n disconnected : settings.disconnected,\n subscribed : 1,\n callback : SUB_CALLBACK = callback,\n 'cipher_key' : args['cipher_key'],\n connect : connect,\n disconnect : disconnect,\n reconnect : reconnect\n };\n\n // Presence Enabled?\n if (!presence) return;\n\n // Subscribe Presence Channel\n SELF['subscribe']({\n 'channel_group' : channel_group + PRESENCE_SUFFIX,\n 'callback' : presence,\n 'restore' : restore,\n 'auth_key' : AUTH_KEY\n });\n\n // Presence Subscribed?\n if (settings.subscribed) return;\n\n // See Who's Here Now?\n if (noheresync) return;\n SELF['here_now']({\n 'channel_group' : channel_group,\n 'data' : _get_url_params({ 'uuid' : UUID, 'auth' : AUTH_KEY }),\n 'callback' : function(here) {\n each( 'uuids' in here ? here['uuids'] : [],\n function(uid) { presence( {\n 'action' : 'join',\n 'uuid' : uid,\n 'timestamp' : Math.floor(rnow() / 1000),\n 'occupancy' : here['occupancy'] || 1\n }, here, channel_group ); } );\n }\n });\n } );\n }\n\n\n // Test Network Connection\n function _test_connection(success) {\n if (success) {\n // Begin Next Socket Connection\n timeout( CONNECT, windowing);\n }\n else {\n // New Origin on Failed Connection\n STD_ORIGIN = nextorigin( ORIGIN, 1 );\n SUB_ORIGIN = nextorigin( ORIGIN, 1 );\n\n // Re-test Connection\n timeout( function() {\n SELF['time'](_test_connection);\n }, SECOND );\n }\n\n // Disconnect & Reconnect\n each_channel(function(channel){\n // Reconnect\n if (success && channel.disconnected) {\n channel.disconnected = 0;\n return channel.reconnect(channel.name);\n }\n\n // Disconnect\n if (!success && !channel.disconnected) {\n channel.disconnected = 1;\n channel.disconnect(channel.name);\n }\n });\n \n // Disconnect & Reconnect for channel groups\n each_channel_group(function(channel_group){\n // Reconnect\n if (success && channel_group.disconnected) {\n channel_group.disconnected = 0;\n return channel_group.reconnect(channel_group.name);\n }\n\n // Disconnect\n if (!success && !channel_group.disconnected) {\n channel_group.disconnected = 1;\n channel_group.disconnect(channel_group.name);\n }\n });\n }\n\n // Evented Subscribe\n function _connect() {\n var jsonp = jsonp_cb()\n , channels = generate_channel_list(CHANNELS).join(',')\n , channel_groups = generate_channel_group_list(CHANNEL_GROUPS).join(',');\n\n // Stop Connection\n if (!channels && !channel_groups) return;\n\n if (!channels) channels = ',';\n\n // Connect to PubNub Subscribe Servers\n _reset_offline();\n\n var data = _get_url_params({ 'uuid' : UUID, 'auth' : AUTH_KEY });\n\n if (channel_groups) {\n data['channel-group'] = channel_groups;\n }\n\n\n var st = JSON.stringify(STATE);\n if (st.length > 2) data['state'] = JSON.stringify(STATE);\n\n if (PRESENCE_HB) data['heartbeat'] = PRESENCE_HB;\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n start_presence_heartbeat();\n SUB_RECEIVER = xdr({\n timeout : sub_timeout,\n callback : jsonp,\n fail : function(response) {\n if (response && response['error'] && response['service']) {\n _invoke_error(response, SUB_ERROR);\n _test_connection(1);\n } else {\n SELF['time'](function(success){\n !success && ( _invoke_error(response, SUB_ERROR));\n _test_connection(success);\n });\n }\n },\n data : _get_url_params(data),\n url : [\n SUB_ORIGIN, 'subscribe',\n SUBSCRIBE_KEY, encode(channels),\n jsonp, TIMETOKEN\n ],\n success : function(messages) {\n\n // Check for Errors\n if (!messages || (\n typeof messages == 'object' &&\n 'error' in messages &&\n messages['error']\n )) {\n SUB_ERROR(messages['error']);\n return timeout( CONNECT, SECOND );\n }\n\n // User Idle Callback\n idlecb(messages[1]);\n\n // Restore Previous Connection Point if Needed\n TIMETOKEN = !TIMETOKEN &&\n SUB_RESTORE &&\n db['get'](SUBSCRIBE_KEY) || messages[1];\n\n /*\n // Connect\n each_channel_registry(function(registry){\n if (registry.connected) return;\n registry.connected = 1;\n registry.connect(channel.name);\n });\n */\n\n // Connect\n each_channel(function(channel){\n if (channel.connected) return;\n channel.connected = 1;\n channel.connect(channel.name);\n });\n\n // Connect for channel groups\n each_channel_group(function(channel_group){\n if (channel_group.connected) return;\n channel_group.connected = 1;\n channel_group.connect(channel_group.name);\n });\n\n if (RESUMED && !SUB_RESTORE) {\n TIMETOKEN = 0;\n RESUMED = false;\n // Update Saved Timetoken\n db['set']( SUBSCRIBE_KEY, 0 );\n timeout( _connect, windowing );\n return;\n }\n\n // Invoke Memory Catchup and Receive Up to 100\n // Previous Messages from the Queue.\n if (backfill) {\n TIMETOKEN = 10000;\n backfill = 0;\n }\n\n // Update Saved Timetoken\n db['set']( SUBSCRIBE_KEY, messages[1] );\n\n // Route Channel <---> Callback for Message\n var next_callback = (function() {\n var channels = '';\n var channels2 = '';\n\n if (messages.length > 3) {\n channels = messages[3];\n channels2 = messages[2];\n } else if (messages.length > 2) {\n channels = messages[2];\n } else {\n channels = map(\n generate_channel_list(CHANNELS), function(chan) { return map(\n Array(messages[0].length)\n .join(',').split(','),\n function() { return chan; }\n ) }).join(',')\n }\n\n var list = channels.split(',');\n var list2 = (channels2)?channels2.split(','):[];\n\n return function() {\n var channel = list.shift()||SUB_CHANNEL;\n var channel2 = list2.shift();\n\n var chobj = {};\n\n if (channel2) {\n if (channel && channel.indexOf('-pnpres') >= 0 \n && channel2.indexOf('-pnpres') < 0) {\n channel2 += '-pnpres';\n }\n chobj = CHANNEL_GROUPS[channel2] || CHANNELS[channel2] || {'callback' : function(){}};\n } else {\n chobj = CHANNELS[channel];\n }\n\n var r = [\n chobj\n .callback||SUB_CALLBACK,\n channel.split(PRESENCE_SUFFIX)[0]\n ];\n channel2 && r.push(channel2.split(PRESENCE_SUFFIX)[0]);\n return r;\n };\n })();\n\n var latency = detect_latency(+messages[1]);\n each( messages[0], function(msg) {\n var next = next_callback();\n var decrypted_msg = decrypt(msg,\n (CHANNELS[next[1]])?CHANNELS[next[1]]['cipher_key']:null);\n next[0] && next[0]( decrypted_msg, messages, next[2] || next[1], latency, next[1]);\n });\n\n timeout( _connect, windowing );\n }\n });\n }\n\n CONNECT = function() {\n _reset_offline();\n timeout( _connect, windowing );\n };\n\n // Reduce Status Flicker\n if (!READY) return READY_BUFFER.push(CONNECT);\n\n // Connect Now\n CONNECT();\n },\n\n /*\n PUBNUB.here_now({ channel : 'my_chat', callback : fun });\n */\n 'here_now' : function( args, callback ) {\n var callback = args['callback'] || callback\n , err = args['error'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , channel = args['channel']\n , channel_group = args['channel_group']\n , jsonp = jsonp_cb()\n , uuids = ('uuids' in args) ? args['uuids'] : true\n , state = args['state']\n , data = { 'uuid' : UUID, 'auth' : auth_key };\n\n if (!uuids) data['disable_uuids'] = 1;\n if (state) data['state'] = 1;\n\n // Make sure we have a Channel\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n var url = [\n STD_ORIGIN, 'v2', 'presence',\n 'sub_key', SUBSCRIBE_KEY\n ];\n\n channel && url.push('channel') && url.push(encode(channel));\n\n if (jsonp != '0') { data['callback'] = jsonp; }\n\n if (channel_group) {\n data['channel-group'] = channel_group;\n !channel && url.push('channel') && url.push(','); \n }\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : url\n });\n },\n\n /*\n PUBNUB.current_channels_by_uuid({ channel : 'my_chat', callback : fun });\n */\n 'where_now' : function( args, callback ) {\n var callback = args['callback'] || callback\n , err = args['error'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , jsonp = jsonp_cb()\n , uuid = args['uuid'] || UUID\n , data = { 'auth' : auth_key };\n\n // Make sure we have a Channel\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n if (jsonp != '0') { data['callback'] = jsonp; }\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : [\n STD_ORIGIN, 'v2', 'presence',\n 'sub_key', SUBSCRIBE_KEY,\n 'uuid', encode(uuid)\n ]\n });\n },\n\n 'state' : function(args, callback) {\n var callback = args['callback'] || callback || function(r) {}\n , err = args['error'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , jsonp = jsonp_cb()\n , state = args['state']\n , uuid = args['uuid'] || UUID\n , channel = args['channel']\n , channel_group = args['channel_group']\n , url\n , data = _get_url_params({ 'auth' : auth_key });\n\n // Make sure we have a Channel\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n if (!uuid) return error('Missing UUID');\n if (!channel && !channel_group) return error('Missing Channel');\n\n if (jsonp != '0') { data['callback'] = jsonp; }\n\n if (typeof channel != 'undefined'\n && CHANNELS[channel] && CHANNELS[channel].subscribed ) {\n if (state) STATE[channel] = state;\n }\n\n if (typeof channel_group != 'undefined'\n && CHANNEL_GROUPS[channel_group]\n && CHANNEL_GROUPS[channel_group].subscribed\n ) {\n if (state) STATE[channel_group] = state;\n data['channel-group'] = channel_group;\n\n if (!channel) {\n channel = ',';\n }\n }\n\n data['state'] = JSON.stringify(state);\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n if (state) {\n url = [\n STD_ORIGIN, 'v2', 'presence',\n 'sub-key', SUBSCRIBE_KEY,\n 'channel', channel,\n 'uuid', uuid, 'data'\n ]\n } else {\n url = [\n STD_ORIGIN, 'v2', 'presence',\n 'sub-key', SUBSCRIBE_KEY,\n 'channel', channel,\n 'uuid', encode(uuid)\n ]\n }\n\n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : url\n\n });\n\n },\n\n /*\n PUBNUB.grant({\n channel : 'my_chat',\n callback : fun,\n error : fun,\n ttl : 24 * 60, // Minutes\n read : true,\n write : true,\n auth_key : '3y8uiajdklytowsj'\n });\n */\n 'grant' : function( args, callback ) {\n var callback = args['callback'] || callback\n , err = args['error'] || function(){}\n , channel = args['channel'] || args['channels']\n , channel_group = args['channel_group']\n , jsonp = jsonp_cb()\n , ttl = args['ttl']\n , r = (args['read'] )?\"1\":\"0\"\n , w = (args['write'])?\"1\":\"0\"\n , m = (args['manage'])?\"1\":\"0\"\n , auth_key = args['auth_key'] || args['auth_keys'];\n\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n if (!PUBLISH_KEY) return error('Missing Publish Key');\n if (!SECRET_KEY) return error('Missing Secret Key');\n\n var timestamp = Math.floor(new Date().getTime() / 1000)\n , sign_input = SUBSCRIBE_KEY + \"\\n\" + PUBLISH_KEY + \"\\n\"\n + \"grant\" + \"\\n\";\n\n var data = {\n 'w' : w,\n 'r' : r,\n 'timestamp' : timestamp\n };\n if (args['manage']) {\n data['m'] = m;\n }\n if (isArray(channel)) {\n channel = channel['join'](',');\n }\n if (isArray(auth_key)) {\n auth_key = auth_key['join'](',');\n }\n if (typeof channel != 'undefined' && channel != null && channel.length > 0) data['channel'] = channel;\n if (typeof channel_group != 'undefined' && channel_group != null && channel_group.length > 0) {\n data['channel-group'] = channel_group;\n }\n if (jsonp != '0') { data['callback'] = jsonp; }\n if (ttl || ttl === 0) data['ttl'] = ttl;\n\n if (auth_key) data['auth'] = auth_key;\n\n data = _get_url_params(data)\n\n if (!auth_key) delete data['auth'];\n\n sign_input += _get_pam_sign_input_from_params(data);\n\n var signature = hmac_SHA256( sign_input, SECRET_KEY );\n\n signature = signature.replace( /\\+/g, \"-\" );\n signature = signature.replace( /\\//g, \"_\" );\n\n data['signature'] = signature;\n\n xdr({\n callback : jsonp,\n data : data,\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : [\n STD_ORIGIN, 'v1', 'auth', 'grant' ,\n 'sub-key', SUBSCRIBE_KEY\n ]\n });\n },\n\n /*\n PUBNUB.mobile_gw_provision ({\n device_id: 'A655FBA9931AB',\n op : 'add' | 'remove',\n gw_type : 'apns' | 'gcm',\n channel : 'my_chat',\n callback : fun,\n error : fun,\n });\n */\n\n 'mobile_gw_provision' : function( args ) {\n\n var callback = args['callback'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , err = args['error'] || function() {}\n , jsonp = jsonp_cb()\n , channel = args['channel']\n , op = args['op']\n , gw_type = args['gw_type']\n , device_id = args['device_id']\n , params\n , url;\n\n if (!device_id) return error('Missing Device ID (device_id)');\n if (!gw_type) return error('Missing GW Type (gw_type: gcm or apns)');\n if (!op) return error('Missing GW Operation (op: add or remove)');\n if (!channel) return error('Missing gw destination Channel (channel)');\n if (!PUBLISH_KEY) return error('Missing Publish Key');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n // Create URL\n url = [\n STD_ORIGIN, 'v1/push/sub-key',\n SUBSCRIBE_KEY, 'devices', device_id\n ];\n\n params = { 'uuid' : UUID, 'auth' : auth_key, 'type': gw_type};\n\n if (op == \"add\") {\n params['add'] = channel;\n } else if (op == \"remove\") {\n params['remove'] = channel;\n }\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n callback : jsonp,\n data : params,\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : url\n });\n\n },\n\n /*\n PUBNUB.audit({\n channel : 'my_chat',\n callback : fun,\n error : fun,\n read : true,\n write : true,\n auth_key : '3y8uiajdklytowsj'\n });\n */\n 'audit' : function( args, callback ) {\n var callback = args['callback'] || callback\n , err = args['error'] || function(){}\n , channel = args['channel']\n , channel_group = args['channel_group']\n , auth_key = args['auth_key']\n , jsonp = jsonp_cb();\n\n // Make sure we have a Channel\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n if (!PUBLISH_KEY) return error('Missing Publish Key');\n if (!SECRET_KEY) return error('Missing Secret Key');\n\n var timestamp = Math.floor(new Date().getTime() / 1000)\n , sign_input = SUBSCRIBE_KEY + \"\\n\"\n + PUBLISH_KEY + \"\\n\"\n + \"audit\" + \"\\n\";\n\n var data = {'timestamp' : timestamp };\n if (jsonp != '0') { data['callback'] = jsonp; }\n if (typeof channel != 'undefined' && channel != null && channel.length > 0) data['channel'] = channel;\n if (typeof channel_group != 'undefined' && channel_group != null && channel_group.length > 0) {\n data['channel-group'] = channel_group;\n }\n if (auth_key) data['auth'] = auth_key;\n\n data = _get_url_params(data);\n\n if (!auth_key) delete data['auth'];\n\n sign_input += _get_pam_sign_input_from_params(data);\n\n var signature = hmac_SHA256( sign_input, SECRET_KEY );\n\n signature = signature.replace( /\\+/g, \"-\" );\n signature = signature.replace( /\\//g, \"_\" );\n\n data['signature'] = signature;\n xdr({\n callback : jsonp,\n data : data,\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : [\n STD_ORIGIN, 'v1', 'auth', 'audit' ,\n 'sub-key', SUBSCRIBE_KEY\n ]\n });\n },\n\n /*\n PUBNUB.revoke({\n channel : 'my_chat',\n callback : fun,\n error : fun,\n auth_key : '3y8uiajdklytowsj'\n });\n */\n 'revoke' : function( args, callback ) {\n args['read'] = false;\n args['write'] = false;\n SELF['grant']( args, callback );\n },\n 'set_uuid' : function(uuid) {\n UUID = uuid;\n CONNECT();\n },\n 'get_uuid' : function() {\n return UUID;\n },\n 'isArray' : function(arg) {\n return isArray(arg);\n },\n 'get_subscibed_channels' : function() {\n return generate_channel_list(CHANNELS, true);\n },\n 'presence_heartbeat' : function(args) {\n var callback = args['callback'] || function() {}\n var err = args['error'] || function() {}\n var jsonp = jsonp_cb();\n var data = { 'uuid' : UUID, 'auth' : AUTH_KEY };\n\n var st = JSON['stringify'](STATE);\n if (st.length > 2) data['state'] = JSON['stringify'](STATE);\n\n if (PRESENCE_HB > 0 && PRESENCE_HB < 320) data['heartbeat'] = PRESENCE_HB;\n\n if (jsonp != '0') { data['callback'] = jsonp; }\n\n var channels = encode(generate_channel_list(CHANNELS, true)['join'](','));\n var channel_groups = generate_channel_group_list(CHANNEL_GROUPS, true)['join'](',');\n\n if (!channels) channels = ',';\n if (channel_groups) data['channel-group'] = channel_groups;\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n timeout : SECOND * 5,\n url : [\n STD_ORIGIN, 'v2', 'presence',\n 'sub-key', SUBSCRIBE_KEY,\n 'channel' , channels,\n 'heartbeat'\n ],\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) { _invoke_error(response, err); }\n });\n },\n 'stop_timers': function () {\n clearTimeout(_poll_timer);\n clearTimeout(_poll_timer2);\n clearTimeout(PRESENCE_HB_TIMEOUT);\n },\n 'shutdown': function () {\n SELF['stop_timers']();\n shutdown && shutdown();\n },\n\n // Expose PUBNUB Functions\n 'xdr' : xdr,\n 'ready' : ready,\n 'db' : db,\n 'uuid' : generate_uuid,\n 'map' : map,\n 'each' : each,\n 'each-channel' : each_channel,\n 'grep' : grep,\n 'offline' : function(){ _reset_offline(\n 1, { \"message\" : \"Offline. Please check your network settings.\" })\n },\n 'supplant' : supplant,\n 'now' : rnow,\n 'unique' : unique,\n 'updater' : updater\n };\n\n function _poll_online() {\n _is_online() || _reset_offline( 1, {\n \"error\" : \"Offline. Please check your network settings. \"\n });\n _poll_timer && clearTimeout(_poll_timer);\n _poll_timer = timeout( _poll_online, SECOND );\n }\n\n function _poll_online2() {\n if (!TIME_CHECK) return;\n SELF['time'](function(success){\n detect_time_detla( function(){}, success );\n success || _reset_offline( 1, {\n \"error\" : \"Heartbeat failed to connect to Pubnub Servers.\" +\n \"Please check your network settings.\"\n });\n _poll_timer2 && clearTimeout(_poll_timer2);\n _poll_timer2 = timeout( _poll_online2, KEEPALIVE );\n });\n }\n\n function _reset_offline(err, msg) {\n SUB_RECEIVER && SUB_RECEIVER(err, msg);\n SUB_RECEIVER = null;\n\n clearTimeout(_poll_timer);\n clearTimeout(_poll_timer2);\n }\n \n if (!UUID) UUID = SELF['uuid']();\n if (!INSTANCEID) INSTANCEID = SELF['uuid']();\n db['set']( SUBSCRIBE_KEY + 'uuid', UUID );\n\n _poll_timer = timeout( _poll_online, SECOND );\n _poll_timer2 = timeout( _poll_online2, KEEPALIVE );\n PRESENCE_HB_TIMEOUT = timeout(\n start_presence_heartbeat,\n ( PRESENCE_HB_INTERVAL - 3 ) * SECOND\n );\n\n // Detect Age of Message\n function detect_latency(tt) {\n var adjusted_time = rnow() - TIME_DRIFT;\n return adjusted_time - tt / 10000;\n }\n\n detect_time_detla();\n function detect_time_detla( cb, time ) {\n var stime = rnow();\n\n time && calculate(time) || SELF['time'](calculate);\n\n function calculate(time) {\n if (!time) return;\n var ptime = time / 10000\n , latency = (rnow() - stime) / 2;\n TIME_DRIFT = rnow() - (ptime + latency);\n cb && cb(TIME_DRIFT);\n }\n }\n\n return SELF;\n}\nfunction crypto_obj() {\n\n function SHA256(s) {\n return CryptoJS['SHA256'](s)['toString'](CryptoJS['enc']['Hex']);\n }\n\n var iv = \"0123456789012345\";\n\n var allowedKeyEncodings = ['hex', 'utf8', 'base64', 'binary'];\n var allowedKeyLengths = [128, 256];\n var allowedModes = ['ecb', 'cbc'];\n\n var defaultOptions = {\n 'encryptKey': true,\n 'keyEncoding': 'utf8',\n 'keyLength': 256,\n 'mode': 'cbc'\n };\n\n function parse_options(options) {\n\n // Defaults\n options = options || {};\n if (!options['hasOwnProperty']('encryptKey')) options['encryptKey'] = defaultOptions['encryptKey'];\n if (!options['hasOwnProperty']('keyEncoding')) options['keyEncoding'] = defaultOptions['keyEncoding'];\n if (!options['hasOwnProperty']('keyLength')) options['keyLength'] = defaultOptions['keyLength'];\n if (!options['hasOwnProperty']('mode')) options['mode'] = defaultOptions['mode'];\n\n // Validation\n if (allowedKeyEncodings['indexOf'](options['keyEncoding']['toLowerCase']()) == -1) options['keyEncoding'] = defaultOptions['keyEncoding'];\n if (allowedKeyLengths['indexOf'](parseInt(options['keyLength'], 10)) == -1) options['keyLength'] = defaultOptions['keyLength'];\n if (allowedModes['indexOf'](options['mode']['toLowerCase']()) == -1) options['mode'] = defaultOptions['mode'];\n\n return options;\n\n }\n\n function decode_key(key, options) {\n if (options['keyEncoding'] == 'base64') {\n return CryptoJS['enc']['Base64']['parse'](key);\n } else if (options['keyEncoding'] == 'hex') {\n return CryptoJS['enc']['Hex']['parse'](key);\n } else {\n return key;\n }\n }\n\n function get_padded_key(key, options) {\n key = decode_key(key, options);\n if (options['encryptKey']) {\n return CryptoJS['enc']['Utf8']['parse'](SHA256(key)['slice'](0, 32));\n } else {\n return key;\n }\n }\n\n function get_mode(options) {\n if (options['mode'] == 'ecb') {\n return CryptoJS['mode']['ECB'];\n } else {\n return CryptoJS['mode']['CBC'];\n }\n }\n\n function get_iv(options) {\n return (options['mode'] == 'cbc') ? CryptoJS['enc']['Utf8']['parse'](iv) : null;\n }\n\n return {\n\n 'encrypt': function(data, key, options) {\n if (!key) return data;\n options = parse_options(options);\n var iv = get_iv(options);\n var mode = get_mode(options);\n var cipher_key = get_padded_key(key, options);\n var hex_message = JSON['stringify'](data);\n var encryptedHexArray = CryptoJS['AES']['encrypt'](hex_message, cipher_key, {'iv': iv, 'mode': mode})['ciphertext'];\n var base_64_encrypted = encryptedHexArray['toString'](CryptoJS['enc']['Base64']);\n return base_64_encrypted || data;\n },\n\n 'decrypt': function(data, key, options) {\n if (!key) return data;\n options = parse_options(options);\n var iv = get_iv(options);\n var mode = get_mode(options);\n var cipher_key = get_padded_key(key, options);\n try {\n var binary_enc = CryptoJS['enc']['Base64']['parse'](data);\n var json_plain = CryptoJS['AES']['decrypt']({'ciphertext': binary_enc}, cipher_key, {'iv': iv, 'mode': mode})['toString'](CryptoJS['enc']['Utf8']);\n var plaintext = JSON['parse'](json_plain);\n return plaintext;\n }\n catch (e) {\n return undefined;\n }\n }\n };\n}\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n/* =-========================= UTIL =============================-= */\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n\nwindow['PUBNUB'] || (function() {\n\n/**\n * UTIL LOCALS\n */\n\nvar SWF = 'https://pubnub.a.ssl.fastly.net/pubnub.swf'\n, ASYNC = 'async'\n, UA = navigator.userAgent\n, PNSDK = 'PubNub-JS-' + 'Web' + '/' + '3.7.14'\n, XORIGN = UA.indexOf('MSIE 6') == -1;\n\n/**\n * CONSOLE COMPATIBILITY\n */\nwindow.console || (window.console=window.console||{});\nconsole.log || (\n console.log =\n console.error =\n ((window.opera||{}).postError||function(){})\n);\n\n/**\n * LOCAL STORAGE OR COOKIE\n */\nvar db = (function(){\n var store = {};\n var ls = false;\n try {\n ls = window['localStorage'];\n } catch (e) { }\n var cookieGet = function(key) {\n if (document.cookie.indexOf(key) == -1) return null;\n return ((document.cookie||'').match(\n RegExp(key+'=([^;]+)')\n )||[])[1] || null;\n };\n var cookieSet = function( key, value ) {\n document.cookie = key + '=' + value +\n '; expires=Thu, 1 Aug 2030 20:00:00 UTC; path=/';\n };\n var cookieTest = (function() {\n try {\n cookieSet('pnctest', '1');\n return cookieGet('pnctest') === '1';\n } catch (e) {\n return false;\n }\n }());\n return {\n 'get' : function(key) {\n try {\n if (ls) return ls.getItem(key);\n if (cookieTest) return cookieGet(key);\n return store[key];\n } catch(e) {\n return store[key];\n }\n },\n 'set' : function( key, value ) {\n try {\n if (ls) return ls.setItem( key, value ) && 0;\n if (cookieTest) cookieSet( key, value );\n store[key] = value;\n } catch(e) {\n store[key] = value;\n }\n }\n };\n})();\n\nfunction get_hmac_SHA256(data,key) {\n var hash = CryptoJS['HmacSHA256'](data, key);\n return hash.toString(CryptoJS['enc']['Base64']);\n}\n\n/**\n * $\n * =\n * var div = $('divid');\n */\nfunction $(id) { return document.getElementById(id) }\n\n/**\n * ERROR\n * =====\n * error('message');\n */\nfunction error(message) { console['error'](message) }\n\n/**\n * SEARCH\n * ======\n * var elements = search('a div span');\n */\nfunction search( elements, start) {\n var list = [];\n each( elements.split(/\\s+/), function(el) {\n each( (start || document).getElementsByTagName(el), function(node) {\n list.push(node);\n } );\n });\n return list;\n}\n\n/**\n * BIND\n * ====\n * bind( 'keydown', search('a')[0], function(element) {\n * ...\n * } );\n */\nfunction bind( type, el, fun ) {\n each( type.split(','), function(etype) {\n var rapfun = function(e) {\n if (!e) e = window.event;\n if (!fun(e)) {\n e.cancelBubble = true;\n e.preventDefault && e.preventDefault();\n e.stopPropagation && e.stopPropagation();\n }\n };\n\n if ( el.addEventListener ) el.addEventListener( etype, rapfun, false );\n else if ( el.attachEvent ) el.attachEvent( 'on' + etype, rapfun );\n else el[ 'on' + etype ] = rapfun;\n } );\n}\n\n/**\n * UNBIND\n * ======\n * unbind( 'keydown', search('a')[0] );\n */\nfunction unbind( type, el, fun ) {\n if ( el.removeEventListener ) el.removeEventListener( type, false );\n else if ( el.detachEvent ) el.detachEvent( 'on' + type, false );\n else el[ 'on' + type ] = null;\n}\n\n/**\n * HEAD\n * ====\n * head().appendChild(elm);\n */\nfunction head() { return search('head')[0] }\n\n/**\n * ATTR\n * ====\n * var attribute = attr( node, 'attribute' );\n */\nfunction attr( node, attribute, value ) {\n if (value) node.setAttribute( attribute, value );\n else return node && node.getAttribute && node.getAttribute(attribute);\n}\n\n/**\n * CSS\n * ===\n * var obj = create('div');\n */\nfunction css( element, styles ) {\n for (var style in styles) if (styles.hasOwnProperty(style))\n try {element.style[style] = styles[style] + (\n '|width|height|top|left|'.indexOf(style) > 0 &&\n typeof styles[style] == 'number'\n ? 'px' : ''\n )}catch(e){}\n}\n\n/**\n * CREATE\n * ======\n * var obj = create('div');\n */\nfunction create(element) { return document.createElement(element) }\n\n\n/**\n * jsonp_cb\n * ========\n * var callback = jsonp_cb();\n */\nfunction jsonp_cb() { return XORIGN || FDomainRequest() ? 0 : unique() }\n\n\n\n/**\n * EVENTS\n * ======\n * PUBNUB.events.bind( 'you-stepped-on-flower', function(message) {\n * // Do Stuff with message\n * } );\n *\n * PUBNUB.events.fire( 'you-stepped-on-flower', \"message-data\" );\n * PUBNUB.events.fire( 'you-stepped-on-flower', {message:\"data\"} );\n * PUBNUB.events.fire( 'you-stepped-on-flower', [1,2,3] );\n *\n */\nvar events = {\n 'list' : {},\n 'unbind' : function( name ) { events.list[name] = [] },\n 'bind' : function( name, fun ) {\n (events.list[name] = events.list[name] || []).push(fun);\n },\n 'fire' : function( name, data ) {\n each(\n events.list[name] || [],\n function(fun) { fun(data) }\n );\n }\n};\n\n/**\n * XDR Cross Domain Request\n * ========================\n * xdr({\n * url : ['http://www.blah.com/url'],\n * success : function(response) {},\n * fail : function() {}\n * });\n */\nfunction xdr( setup ) {\n if (XORIGN || FDomainRequest()) return ajax(setup);\n\n var script = create('script')\n , callback = setup.callback\n , id = unique()\n , finished = 0\n , xhrtme = setup.timeout || DEF_TIMEOUT\n , timer = timeout( function(){done(1, {\"message\" : \"timeout\"})}, xhrtme )\n , fail = setup.fail || function(){}\n , data = setup.data || {}\n , success = setup.success || function(){}\n , append = function() { head().appendChild(script) }\n , done = function( failed, response ) {\n if (finished) return;\n finished = 1;\n\n script.onerror = null;\n clearTimeout(timer);\n\n (failed || !response) || success(response);\n\n timeout( function() {\n failed && fail();\n var s = $(id)\n , p = s && s.parentNode;\n p && p.removeChild(s);\n }, SECOND );\n };\n\n window[callback] = function(response) {\n done( 0, response );\n };\n\n if (!setup.blocking) script[ASYNC] = ASYNC;\n\n script.onerror = function() { done(1) };\n script.src = build_url( setup.url, data );\n\n attr( script, 'id', id );\n\n append();\n return done;\n}\n\n/**\n * CORS XHR Request\n * ================\n * xdr({\n * url : ['http://www.blah.com/url'],\n * success : function(response) {},\n * fail : function() {}\n * });\n */\nfunction ajax( setup ) {\n var xhr, response\n , finished = function() {\n if (loaded) return;\n loaded = 1;\n\n clearTimeout(timer);\n\n try { response = JSON['parse'](xhr.responseText); }\n catch (r) { return done(1); }\n\n complete = 1;\n success(response);\n }\n , complete = 0\n , loaded = 0\n , xhrtme = setup.timeout || DEF_TIMEOUT\n , timer = timeout( function(){done(1, {\"message\" : \"timeout\"})}, xhrtme )\n , fail = setup.fail || function(){}\n , data = setup.data || {}\n , success = setup.success || function(){}\n , async = !(setup.blocking)\n , done = function(failed,response) {\n if (complete) return;\n complete = 1;\n\n clearTimeout(timer);\n\n if (xhr) {\n xhr.onerror = xhr.onload = null;\n xhr.abort && xhr.abort();\n xhr = null;\n }\n\n failed && fail(response);\n };\n\n // Send\n try {\n xhr = FDomainRequest() ||\n window.XDomainRequest &&\n new XDomainRequest() ||\n new XMLHttpRequest();\n\n xhr.onerror = xhr.onabort = function(e){ done(\n 1, e || (xhr && xhr.responseText) || { \"error\" : \"Network Connection Error\"}\n ) };\n xhr.onload = xhr.onloadend = finished;\n xhr.onreadystatechange = function() {\n if (xhr && xhr.readyState == 4) {\n switch(xhr.status) {\n case 200:\n break;\n default:\n try {\n response = JSON['parse'](xhr.responseText);\n done(1,response);\n }\n catch (r) { return done(1, {status : xhr.status, payload : null, message : xhr.responseText}); }\n return;\n }\n }\n }\n\n var url = build_url(setup.url,data);\n\n xhr.open( 'GET', url, async );\n if (async) xhr.timeout = xhrtme;\n xhr.send();\n }\n catch(eee) {\n done(0);\n XORIGN = 0;\n return xdr(setup);\n }\n\n // Return 'done'\n return done;\n}\n\n// Test Connection State\nfunction _is_online() {\n if (!('onLine' in navigator)) return 1;\n try { return navigator['onLine'] }\n catch (e) { return true }\n}\n\n\nfunction sendBeacon(url) {\n if (!('sendBeacon' in navigator)) return false;\n\n return navigator['sendBeacon'](url);\n}\n\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n/* =-========================= PUBNUB ===========================-= */\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n\nvar PDIV = $('pubnub') || 0\n, CREATE_PUBNUB = function(setup) {\n\n // Force JSONP if requested from user.\n if (setup['jsonp']) XORIGN = 0;\n else XORIGN = UA.indexOf('MSIE 6') == -1;\n\n var SUBSCRIBE_KEY = setup['subscribe_key'] || ''\n , KEEPALIVE = (+setup['keepalive'] || DEF_KEEPALIVE) * SECOND\n , UUID = setup['uuid'] || db['get'](SUBSCRIBE_KEY+'uuid')||'';\n\n var leave_on_unload = setup['leave_on_unload'] || 0;\n\n setup['xdr'] = xdr;\n setup['db'] = db;\n setup['error'] = setup['error'] || error;\n setup['_is_online'] = _is_online;\n setup['jsonp_cb'] = jsonp_cb;\n setup['hmac_SHA256']= get_hmac_SHA256;\n setup['crypto_obj'] = crypto_obj();\n setup['sendBeacon'] = sendBeacon;\n setup['params'] = { 'pnsdk' : PNSDK }\n\n var SELF = function(setup) {\n return CREATE_PUBNUB(setup);\n };\n\n var PN = PN_API(setup);\n\n for (var prop in PN) {\n if (PN.hasOwnProperty(prop)) {\n SELF[prop] = PN[prop];\n }\n }\n SELF['css'] = css;\n SELF['$'] = $;\n SELF['create'] = create;\n SELF['bind'] = bind;\n SELF['head'] = head;\n SELF['search'] = search;\n SELF['attr'] = attr;\n SELF['events'] = events;\n SELF['init'] = SELF;\n SELF['secure'] = SELF;\n SELF['crypto_obj'] = crypto_obj(); // export to instance\n\n\n // Add Leave Functions\n bind( 'beforeunload', window, function() {\n if (leave_on_unload) SELF['each-channel'](function(ch){ SELF['LEAVE']( ch.name, 0 ) });\n return true;\n } );\n\n // Return without Testing\n if (setup['notest']) return SELF;\n\n bind( 'offline', window, SELF['offline'] );\n bind( 'offline', document, SELF['offline'] );\n\n // Return PUBNUB Socket Object\n return SELF;\n};\nCREATE_PUBNUB['init'] = CREATE_PUBNUB;\nCREATE_PUBNUB['secure'] = CREATE_PUBNUB;\nCREATE_PUBNUB['crypto_obj'] = crypto_obj(); // export to constructor\n\n// Bind for PUBNUB Readiness to Subscribe\nif (document.readyState === 'complete') {\n timeout( ready, 0 );\n}\nelse {\n bind( 'load', window, function(){ timeout( ready, 0 ) } );\n}\n\nvar pdiv = PDIV || {};\n\n// CREATE A PUBNUB GLOBAL OBJECT\nPUBNUB = CREATE_PUBNUB({\n 'notest' : 1,\n 'publish_key' : attr( pdiv, 'pub-key' ),\n 'subscribe_key' : attr( pdiv, 'sub-key' ),\n 'ssl' : !document.location.href.indexOf('https') ||\n attr( pdiv, 'ssl' ) == 'on',\n 'origin' : attr( pdiv, 'origin' ),\n 'uuid' : attr( pdiv, 'uuid' )\n});\n\n// jQuery Interface\nwindow['jQuery'] && (window['jQuery']['PUBNUB'] = CREATE_PUBNUB);\n\n// For Modern JS + Testling.js - http://testling.com/\ntypeof(module) !== 'undefined' && (module['exports'] = PUBNUB) && ready();\n\nvar pubnubs = $('pubnubs') || 0;\n\n// LEAVE NOW IF NO PDIV.\nif (!PDIV) return;\n\n// PUBNUB Flash Socket\ncss( PDIV, { 'position' : 'absolute', 'top' : -SECOND } );\n\nif ('opera' in window || attr( PDIV, 'flash' )) PDIV['innerHTML'] =\n '';\n\n// Create Interface for Opera Flash\nPUBNUB['rdx'] = function( id, data ) {\n if (!data) return FDomainRequest[id]['onerror']();\n FDomainRequest[id]['responseText'] = unescape(data);\n FDomainRequest[id]['onload']();\n};\n\nfunction FDomainRequest() {\n if (!pubnubs || !pubnubs['get']) return 0;\n\n var fdomainrequest = {\n 'id' : FDomainRequest['id']++,\n 'send' : function() {},\n 'abort' : function() { fdomainrequest['id'] = {} },\n 'open' : function( method, url ) {\n FDomainRequest[fdomainrequest['id']] = fdomainrequest;\n pubnubs['get']( fdomainrequest['id'], url );\n }\n };\n\n return fdomainrequest;\n}\nFDomainRequest['id'] = SECOND;\n\n})();\n(function(){\n\n// ---------------------------------------------------------------------------\n// WEBSOCKET INTERFACE\n// ---------------------------------------------------------------------------\nvar WS = PUBNUB['ws'] = function( url, protocols ) {\n if (!(this instanceof WS)) return new WS( url, protocols );\n\n var self = this\n , url = self.url = url || ''\n , protocol = self.protocol = protocols || 'Sec-WebSocket-Protocol'\n , bits = url.split('/')\n , setup = {\n 'ssl' : bits[0] === 'wss:'\n ,'origin' : bits[2]\n ,'publish_key' : bits[3]\n ,'subscribe_key' : bits[4]\n ,'channel' : bits[5]\n };\n\n // READY STATES\n self['CONNECTING'] = 0; // The connection is not yet open.\n self['OPEN'] = 1; // The connection is open and ready to communicate.\n self['CLOSING'] = 2; // The connection is in the process of closing.\n self['CLOSED'] = 3; // The connection is closed or couldn't be opened.\n\n // CLOSE STATES\n self['CLOSE_NORMAL'] = 1000; // Normal Intended Close; completed.\n self['CLOSE_GOING_AWAY'] = 1001; // Closed Unexpecttedly.\n self['CLOSE_PROTOCOL_ERROR'] = 1002; // Server: Not Supported.\n self['CLOSE_UNSUPPORTED'] = 1003; // Server: Unsupported Protocol.\n self['CLOSE_TOO_LARGE'] = 1004; // Server: Too Much Data.\n self['CLOSE_NO_STATUS'] = 1005; // Server: No reason.\n self['CLOSE_ABNORMAL'] = 1006; // Abnormal Disconnect.\n\n // Events Default\n self['onclose'] = self['onerror'] =\n self['onmessage'] = self['onopen'] =\n self['onsend'] = function(){};\n\n // Attributes\n self['binaryType'] = '';\n self['extensions'] = '';\n self['bufferedAmount'] = 0;\n self['trasnmitting'] = false;\n self['buffer'] = [];\n self['readyState'] = self['CONNECTING'];\n\n // Close if no setup.\n if (!url) {\n self['readyState'] = self['CLOSED'];\n self['onclose']({\n 'code' : self['CLOSE_ABNORMAL'],\n 'reason' : 'Missing URL',\n 'wasClean' : true\n });\n return self;\n }\n\n // PubNub WebSocket Emulation\n self.pubnub = PUBNUB['init'](setup);\n self.pubnub.setup = setup;\n self.setup = setup;\n\n self.pubnub['subscribe']({\n 'restore' : false,\n 'channel' : setup['channel'],\n 'disconnect' : self['onerror'],\n 'reconnect' : self['onopen'],\n 'error' : function() {\n self['onclose']({\n 'code' : self['CLOSE_ABNORMAL'],\n 'reason' : 'Missing URL',\n 'wasClean' : false\n });\n },\n 'callback' : function(message) {\n self['onmessage']({ 'data' : message });\n },\n 'connect' : function() {\n self['readyState'] = self['OPEN'];\n self['onopen']();\n }\n });\n};\n\n// ---------------------------------------------------------------------------\n// WEBSOCKET SEND\n// ---------------------------------------------------------------------------\nWS.prototype.send = function(data) {\n var self = this;\n self.pubnub['publish']({\n 'channel' : self.pubnub.setup['channel'],\n 'message' : data,\n 'callback' : function(response) {\n self['onsend']({ 'data' : response });\n }\n });\n};\n\n// ---------------------------------------------------------------------------\n// WEBSOCKET CLOSE\n// ---------------------------------------------------------------------------\nWS.prototype.close = function() {\n var self = this;\n self.pubnub['unsubscribe']({ 'channel' : self.pubnub.setup['channel'] });\n self['readyState'] = self['CLOSED'];\n self['onclose']({});\n};\n\n})();\n/*\nCryptoJS v3.1.2\ncode.google.com/p/crypto-js\n(c) 2009-2013 by Jeff Mott. All rights reserved.\ncode.google.com/p/crypto-js/wiki/License\n*/\nvar CryptoJS=CryptoJS||function(h,s){var f={},g=f.lib={},q=function(){},m=g.Base={extend:function(a){q.prototype=this;var c=new q;a&&c.mixIn(a);c.hasOwnProperty(\"init\")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty(\"toString\")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},\nr=g.WordArray=m.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=s?c:4*a.length},toString:function(a){return(a||k).stringify(this)},concat:function(a){var c=this.words,d=a.words,b=this.sigBytes;a=a.sigBytes;this.clamp();if(b%4)for(var e=0;e>>2]|=(d[e>>>2]>>>24-8*(e%4)&255)<<24-8*((b+e)%4);else if(65535>>2]=d[e>>>2];else c.push.apply(c,d);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<\n32-8*(c%4);a.length=h.ceil(c/4)},clone:function(){var a=m.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],d=0;d>>2]>>>24-8*(b%4)&255;d.push((e>>>4).toString(16));d.push((e&15).toString(16))}return d.join(\"\")},parse:function(a){for(var c=a.length,d=[],b=0;b>>3]|=parseInt(a.substr(b,\n2),16)<<24-4*(b%8);return new r.init(d,c/2)}},n=l.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var d=[],b=0;b>>2]>>>24-8*(b%4)&255));return d.join(\"\")},parse:function(a){for(var c=a.length,d=[],b=0;b>>2]|=(a.charCodeAt(b)&255)<<24-8*(b%4);return new r.init(d,c)}},j=l.Utf8={stringify:function(a){try{return decodeURIComponent(escape(n.stringify(a)))}catch(c){throw Error(\"Malformed UTF-8 data\");}},parse:function(a){return n.parse(unescape(encodeURIComponent(a)))}},\nu=g.BufferedBlockAlgorithm=m.extend({reset:function(){this._data=new r.init;this._nDataBytes=0},_append:function(a){\"string\"==typeof a&&(a=j.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,d=c.words,b=c.sigBytes,e=this.blockSize,f=b/(4*e),f=a?h.ceil(f):h.max((f|0)-this._minBufferSize,0);a=f*e;b=h.min(4*a,b);if(a){for(var g=0;gn;){var j;a:{j=k;for(var u=h.sqrt(j),t=2;t<=u;t++)if(!(j%t)){j=!1;break a}j=!0}j&&(8>n&&(m[n]=l(h.pow(k,0.5))),r[n]=l(h.pow(k,1/3)),n++);k++}var a=[],f=f.SHA256=q.extend({_doReset:function(){this._hash=new g.init(m.slice(0))},_doProcessBlock:function(c,d){for(var b=this._hash.words,e=b[0],f=b[1],g=b[2],j=b[3],h=b[4],m=b[5],n=b[6],q=b[7],p=0;64>p;p++){if(16>p)a[p]=\nc[d+p]|0;else{var k=a[p-15],l=a[p-2];a[p]=((k<<25|k>>>7)^(k<<14|k>>>18)^k>>>3)+a[p-7]+((l<<15|l>>>17)^(l<<13|l>>>19)^l>>>10)+a[p-16]}k=q+((h<<26|h>>>6)^(h<<21|h>>>11)^(h<<7|h>>>25))+(h&m^~h&n)+r[p]+a[p];l=((e<<30|e>>>2)^(e<<19|e>>>13)^(e<<10|e>>>22))+(e&f^e&g^f&g);q=n;n=m;m=h;h=j+k|0;j=g;g=f;f=e;e=k+l|0}b[0]=b[0]+e|0;b[1]=b[1]+f|0;b[2]=b[2]+g|0;b[3]=b[3]+j|0;b[4]=b[4]+h|0;b[5]=b[5]+m|0;b[6]=b[6]+n|0;b[7]=b[7]+q|0},_doFinalize:function(){var a=this._data,d=a.words,b=8*this._nDataBytes,e=8*a.sigBytes;\nd[e>>>5]|=128<<24-e%32;d[(e+64>>>9<<4)+14]=h.floor(b/4294967296);d[(e+64>>>9<<4)+15]=b;a.sigBytes=4*d.length;this._process();return this._hash},clone:function(){var a=q.clone.call(this);a._hash=this._hash.clone();return a}});s.SHA256=q._createHelper(f);s.HmacSHA256=q._createHmacHelper(f)})(Math);\n\n// HMAC SHA256\n(function(){var h=CryptoJS,s=h.enc.Utf8;h.algo.HMAC=h.lib.Base.extend({init:function(f,g){f=this._hasher=new f.init;\"string\"==typeof g&&(g=s.parse(g));var h=f.blockSize,m=4*h;g.sigBytes>m&&(g=f.finalize(g));g.clamp();for(var r=this._oKey=g.clone(),l=this._iKey=g.clone(),k=r.words,n=l.words,j=0;j>>2]>>>24-8*(r%4)&255)<<16|(l[r+1>>>2]>>>24-8*((r+1)%4)&255)<<8|l[r+2>>>2]>>>24-8*((r+2)%4)&255,v=0;4>v&&r+0.75*v>>6*(3-v)&63));if(l=t.charAt(64))for(;d.length%4;)d.push(l);return d.join(\"\")},parse:function(d){var l=d.length,s=this._map,t=s.charAt(64);t&&(t=d.indexOf(t),-1!=t&&(l=t));for(var t=[],r=0,w=0;w<\nl;w++)if(w%4){var v=s.indexOf(d.charAt(w-1))<<2*(w%4),b=s.indexOf(d.charAt(w))>>>6-2*(w%4);t[r>>>2]|=(v|b)<<24-8*(r%4);r++}return p.create(t,r)},_map:\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\"}})();\n\n// BlockCipher\n(function(u){function p(b,n,a,c,e,j,k){b=b+(n&a|~n&c)+e+k;return(b<>>32-j)+n}function d(b,n,a,c,e,j,k){b=b+(n&c|a&~c)+e+k;return(b<>>32-j)+n}function l(b,n,a,c,e,j,k){b=b+(n^a^c)+e+k;return(b<>>32-j)+n}function s(b,n,a,c,e,j,k){b=b+(a^(n|~c))+e+k;return(b<>>32-j)+n}for(var t=CryptoJS,r=t.lib,w=r.WordArray,v=r.Hasher,r=t.algo,b=[],x=0;64>x;x++)b[x]=4294967296*u.abs(u.sin(x+1))|0;r=r.MD5=v.extend({_doReset:function(){this._hash=new w.init([1732584193,4023233417,2562383102,271733878])},\n_doProcessBlock:function(q,n){for(var a=0;16>a;a++){var c=n+a,e=q[c];q[c]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360}var a=this._hash.words,c=q[n+0],e=q[n+1],j=q[n+2],k=q[n+3],z=q[n+4],r=q[n+5],t=q[n+6],w=q[n+7],v=q[n+8],A=q[n+9],B=q[n+10],C=q[n+11],u=q[n+12],D=q[n+13],E=q[n+14],x=q[n+15],f=a[0],m=a[1],g=a[2],h=a[3],f=p(f,m,g,h,c,7,b[0]),h=p(h,f,m,g,e,12,b[1]),g=p(g,h,f,m,j,17,b[2]),m=p(m,g,h,f,k,22,b[3]),f=p(f,m,g,h,z,7,b[4]),h=p(h,f,m,g,r,12,b[5]),g=p(g,h,f,m,t,17,b[6]),m=p(m,g,h,f,w,22,b[7]),\nf=p(f,m,g,h,v,7,b[8]),h=p(h,f,m,g,A,12,b[9]),g=p(g,h,f,m,B,17,b[10]),m=p(m,g,h,f,C,22,b[11]),f=p(f,m,g,h,u,7,b[12]),h=p(h,f,m,g,D,12,b[13]),g=p(g,h,f,m,E,17,b[14]),m=p(m,g,h,f,x,22,b[15]),f=d(f,m,g,h,e,5,b[16]),h=d(h,f,m,g,t,9,b[17]),g=d(g,h,f,m,C,14,b[18]),m=d(m,g,h,f,c,20,b[19]),f=d(f,m,g,h,r,5,b[20]),h=d(h,f,m,g,B,9,b[21]),g=d(g,h,f,m,x,14,b[22]),m=d(m,g,h,f,z,20,b[23]),f=d(f,m,g,h,A,5,b[24]),h=d(h,f,m,g,E,9,b[25]),g=d(g,h,f,m,k,14,b[26]),m=d(m,g,h,f,v,20,b[27]),f=d(f,m,g,h,D,5,b[28]),h=d(h,f,\nm,g,j,9,b[29]),g=d(g,h,f,m,w,14,b[30]),m=d(m,g,h,f,u,20,b[31]),f=l(f,m,g,h,r,4,b[32]),h=l(h,f,m,g,v,11,b[33]),g=l(g,h,f,m,C,16,b[34]),m=l(m,g,h,f,E,23,b[35]),f=l(f,m,g,h,e,4,b[36]),h=l(h,f,m,g,z,11,b[37]),g=l(g,h,f,m,w,16,b[38]),m=l(m,g,h,f,B,23,b[39]),f=l(f,m,g,h,D,4,b[40]),h=l(h,f,m,g,c,11,b[41]),g=l(g,h,f,m,k,16,b[42]),m=l(m,g,h,f,t,23,b[43]),f=l(f,m,g,h,A,4,b[44]),h=l(h,f,m,g,u,11,b[45]),g=l(g,h,f,m,x,16,b[46]),m=l(m,g,h,f,j,23,b[47]),f=s(f,m,g,h,c,6,b[48]),h=s(h,f,m,g,w,10,b[49]),g=s(g,h,f,m,\nE,15,b[50]),m=s(m,g,h,f,r,21,b[51]),f=s(f,m,g,h,u,6,b[52]),h=s(h,f,m,g,k,10,b[53]),g=s(g,h,f,m,B,15,b[54]),m=s(m,g,h,f,e,21,b[55]),f=s(f,m,g,h,v,6,b[56]),h=s(h,f,m,g,x,10,b[57]),g=s(g,h,f,m,t,15,b[58]),m=s(m,g,h,f,D,21,b[59]),f=s(f,m,g,h,z,6,b[60]),h=s(h,f,m,g,C,10,b[61]),g=s(g,h,f,m,j,15,b[62]),m=s(m,g,h,f,A,21,b[63]);a[0]=a[0]+f|0;a[1]=a[1]+m|0;a[2]=a[2]+g|0;a[3]=a[3]+h|0},_doFinalize:function(){var b=this._data,n=b.words,a=8*this._nDataBytes,c=8*b.sigBytes;n[c>>>5]|=128<<24-c%32;var e=u.floor(a/\n4294967296);n[(c+64>>>9<<4)+15]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360;n[(c+64>>>9<<4)+14]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;b.sigBytes=4*(n.length+1);this._process();b=this._hash;n=b.words;for(a=0;4>a;a++)c=n[a],n[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return b},clone:function(){var b=v.clone.call(this);b._hash=this._hash.clone();return b}});t.MD5=v._createHelper(r);t.HmacMD5=v._createHmacHelper(r)})(Math);\n(function(){var u=CryptoJS,p=u.lib,d=p.Base,l=p.WordArray,p=u.algo,s=p.EvpKDF=d.extend({cfg:d.extend({keySize:4,hasher:p.MD5,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(d,r){for(var p=this.cfg,s=p.hasher.create(),b=l.create(),u=b.words,q=p.keySize,p=p.iterations;u.length>>2]&255}};d.BlockCipher=v.extend({cfg:v.cfg.extend({mode:b,padding:q}),reset:function(){v.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;this._mode=c.call(a,\nthis,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var n=d.CipherParams=l.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),b=(p.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;return(a?s.create([1398893684,\n1701076831]).concat(a).concat(b):b).toString(r)},parse:function(a){a=r.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=s.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return n.create({ciphertext:a,salt:c})}},a=d.SerializableCipher=l.extend({cfg:l.extend({format:b}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var l=a.createEncryptor(c,d);b=l.finalize(b);l=l.cfg;return n.create({ciphertext:b,key:c,iv:l.iv,algorithm:a,mode:l.mode,padding:l.padding,blockSize:a.blockSize,formatter:d.format})},\ndecrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return\"string\"==typeof a?b.parse(a,this):a}}),p=(p.kdf={}).OpenSSL={execute:function(a,b,c,d){d||(d=s.random(8));a=w.create({keySize:b+c}).compute(a,d);c=s.create(a.words.slice(b),4*c);a.sigBytes=4*b;return n.create({key:a,iv:c,salt:d})}},c=d.PasswordBasedCipher=a.extend({cfg:a.cfg.extend({kdf:p}),encrypt:function(b,c,d,l){l=this.cfg.extend(l);d=l.kdf.execute(d,\nb.keySize,b.ivSize);l.iv=d.iv;b=a.encrypt.call(this,b,c,d.key,l);b.mixIn(d);return b},decrypt:function(b,c,d,l){l=this.cfg.extend(l);c=this._parse(c,l.format);d=l.kdf.execute(d,b.keySize,b.ivSize,c.salt);l.iv=d.iv;return a.decrypt.call(this,b,c,d.key,l)}})}();\n\n// AES\n(function(){for(var u=CryptoJS,p=u.lib.BlockCipher,d=u.algo,l=[],s=[],t=[],r=[],w=[],v=[],b=[],x=[],q=[],n=[],a=[],c=0;256>c;c++)a[c]=128>c?c<<1:c<<1^283;for(var e=0,j=0,c=0;256>c;c++){var k=j^j<<1^j<<2^j<<3^j<<4,k=k>>>8^k&255^99;l[e]=k;s[k]=e;var z=a[e],F=a[z],G=a[F],y=257*a[k]^16843008*k;t[e]=y<<24|y>>>8;r[e]=y<<16|y>>>16;w[e]=y<<8|y>>>24;v[e]=y;y=16843009*G^65537*F^257*z^16843008*e;b[k]=y<<24|y>>>8;x[k]=y<<16|y>>>16;q[k]=y<<8|y>>>24;n[k]=y;e?(e=z^a[a[a[G^z]]],j^=a[a[j]]):e=j=1}var H=[0,1,2,4,8,\n16,32,64,128,27,54],d=d.AES=p.extend({_doReset:function(){for(var a=this._key,c=a.words,d=a.sigBytes/4,a=4*((this._nRounds=d+6)+1),e=this._keySchedule=[],j=0;j>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255]):(k=k<<8|k>>>24,k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255],k^=H[j/d|0]<<24);e[j]=e[j-d]^k}c=this._invKeySchedule=[];for(d=0;dd||4>=j?k:b[l[k>>>24]]^x[l[k>>>16&255]]^q[l[k>>>\n8&255]]^n[l[k&255]]},encryptBlock:function(a,b){this._doCryptBlock(a,b,this._keySchedule,t,r,w,v,l)},decryptBlock:function(a,c){var d=a[c+1];a[c+1]=a[c+3];a[c+3]=d;this._doCryptBlock(a,c,this._invKeySchedule,b,x,q,n,s);d=a[c+1];a[c+1]=a[c+3];a[c+3]=d},_doCryptBlock:function(a,b,c,d,e,j,l,f){for(var m=this._nRounds,g=a[b]^c[0],h=a[b+1]^c[1],k=a[b+2]^c[2],n=a[b+3]^c[3],p=4,r=1;r>>24]^e[h>>>16&255]^j[k>>>8&255]^l[n&255]^c[p++],s=d[h>>>24]^e[k>>>16&255]^j[n>>>8&255]^l[g&255]^c[p++],t=\nd[k>>>24]^e[n>>>16&255]^j[g>>>8&255]^l[h&255]^c[p++],n=d[n>>>24]^e[g>>>16&255]^j[h>>>8&255]^l[k&255]^c[p++],g=q,h=s,k=t;q=(f[g>>>24]<<24|f[h>>>16&255]<<16|f[k>>>8&255]<<8|f[n&255])^c[p++];s=(f[h>>>24]<<24|f[k>>>16&255]<<16|f[n>>>8&255]<<8|f[g&255])^c[p++];t=(f[k>>>24]<<24|f[n>>>16&255]<<16|f[g>>>8&255]<<8|f[h&255])^c[p++];n=(f[n>>>24]<<24|f[g>>>16&255]<<16|f[h>>>8&255]<<8|f[k&255])^c[p++];a[b]=q;a[b+1]=s;a[b+2]=t;a[b+3]=n},keySize:8});u.AES=p._createHelper(d)})();\n\n// Mode ECB\nCryptoJS.mode.ECB = (function () {\n var ECB = CryptoJS.lib.BlockCipherMode.extend();\n\n ECB.Encryptor = ECB.extend({\n processBlock: function (words, offset) {\n this._cipher.encryptBlock(words, offset);\n }\n });\n\n ECB.Decryptor = ECB.extend({\n processBlock: function (words, offset) {\n this._cipher.decryptBlock(words, offset);\n }\n });\n\n return ECB;\n}());// Moved to hmac-sha-256.js\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./bower_components/pubnub/web/pubnub.js\n ** module id = 10\n ** module chunks = 0\n **/","export default class Cache {\n\n static defaultPrefix = 'rc-';\n\n constructor(storage, prefix) {\n this.setPrefix(prefix);\n this._storage = storage;\n }\n\n setPrefix(prefix) {\n this._prefix = prefix || Cache.defaultPrefix;\n return this;\n }\n\n setItem(key, data) {\n this._storage[this._prefixKey(key)] = JSON.stringify(data);\n return this;\n }\n\n removeItem(key) {\n delete this._storage[this._prefixKey(key)];\n return this;\n }\n\n getItem(key) {\n var item = this._storage[this._prefixKey(key)];\n if (!item) return null;\n return JSON.parse(item);\n }\n\n clean() {\n\n for (var key in this._storage) {\n\n if (!this._storage.hasOwnProperty(key)) continue;\n\n if (key.indexOf(this._prefix) === 0) {\n delete this._storage[key];\n }\n\n }\n\n return this;\n\n }\n\n _prefixKey(key) {\n return this._prefix + key;\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Cache.js\n **/","export default class Observable {\n\n constructor() {\n this.off();\n }\n\n hasListeners(event) {\n return (event in this._listeners);\n }\n\n on(events, callback) {\n\n if (typeof events == 'string') events = [events];\n if (!events) throw new Error('No events to subscribe to');\n if (typeof callback !== 'function') throw new Error('Callback must be a function');\n\n events.forEach((event) => {\n\n if (!this.hasListeners(event)) this._listeners[event] = [];\n\n this._listeners[event].push(callback);\n\n });\n\n return this;\n\n }\n\n emit(event, ...args) {\n\n var result = null;\n\n if (!this.hasListeners(event)) return null;\n\n this._listeners[event].some((callback) => {\n\n result = callback.apply(this, args);\n return (result === false);\n\n });\n\n return result;\n\n }\n\n off(event, callback) {\n\n if (!event) {\n\n this._listeners = {};\n\n } else {\n\n if (!callback) {\n\n delete this._listeners[event];\n\n } else {\n\n if (!this.hasListeners(event)) return this;\n\n this._listeners[event].forEach((cb, i) => {\n\n if (cb === callback) delete this._listeners[event][i];\n\n });\n\n }\n\n }\n\n return this;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Observable.js\n **/","import {fetch, Request, Response, Headers, Promise} from '../core/Externals';\nimport {queryStringify} from '../core/Utils';\nimport {findHeaderName} from './Utils';\nimport Observable from '../core/Observable';\nimport ApiResponse from './ApiResponse';\n\nexport default class Client extends Observable {\n\n static _allowedMethods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'];\n\n events = {\n beforeRequest: 'beforeRequest',\n requestSuccess: 'requestSuccess',\n requestError: 'requestError'\n };\n\n /**\n * @param {Request} request\n * @return {Promise}\n */\n async sendRequest(request) {\n\n var apiResponse = new ApiResponse(request);\n\n try {\n\n //TODO Stop request if listeners return false\n this.emit(this.events.beforeRequest, apiResponse);\n\n apiResponse._response = await this._loadResponse(request);\n\n if (apiResponse._isMultipart() || apiResponse._isJson()) {\n apiResponse._text = await apiResponse.response().text();\n }\n\n if (!apiResponse.ok()) throw new Error('Response has unsuccessful status');\n\n this.emit(this.events.requestSuccess, apiResponse);\n\n return apiResponse;\n\n } catch (e) {\n\n if (!e.apiResponse) e = this.makeError(e, apiResponse);\n\n this.emit(this.events.requestError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @param {Request} request\n * @return {Promise}\n * @private\n */\n async _loadResponse(request) {\n return await fetch.call(null, request);\n }\n\n /**\n * Wraps the JS Error object with transaction information\n * @param {Error|IApiError} e\n * @param {ApiResponse} apiResponse\n * @return {IApiError}\n */\n makeError(e, apiResponse) {\n\n // Wrap only if regular error\n if (!e.hasOwnProperty('apiResponse') && !e.hasOwnProperty('originalMessage')) {\n\n e.apiResponse = apiResponse;\n e.originalMessage = e.message;\n e.message = (apiResponse && apiResponse.error(true)) || e.originalMessage;\n\n }\n\n return e;\n\n }\n\n /**\n *\n * @param {object} init\n * @param {object} [init.url]\n * @param {object} [init.body]\n * @param {string} [init.method]\n * @param {object} [init.query]\n * @param {object} [init.headers]\n * @return {Request}\n */\n createRequest(init) {\n\n init = init || {};\n init.headers = init.headers || {};\n\n // Sanity checks\n if (!init.url) throw new Error('Url is not defined');\n if (!init.method) init.method = 'GET';\n if (init.method && Client._allowedMethods.indexOf(init.method) < 0) throw new Error('Method has wrong value: ' + init.method);\n\n // Defaults\n init.credentials = init.credentials || 'include';\n init.mode = init.mode || 'cors';\n\n // Append Query String\n if (init.query) {\n init.url = init.url + (init.url.indexOf('?') > -1 ? '&' : '?') + queryStringify(init.query);\n }\n\n if (!(findHeaderName('Accept', init.headers))) {\n init.headers['Accept'] = ApiResponse._jsonContentType;\n }\n\n // Serialize body\n //TODO Check that body is a plain object\n if (typeof init.body !== 'string' || !init.body) {\n\n var contentTypeHeaderName = findHeaderName(ApiResponse._contentType, init.headers);\n\n if (!contentTypeHeaderName) {\n contentTypeHeaderName = ApiResponse._contentType;\n init.headers[contentTypeHeaderName] = ApiResponse._jsonContentType;\n }\n\n var contentType = init.headers[contentTypeHeaderName];\n\n // Assign a new encoded body\n if (contentType.indexOf(ApiResponse._jsonContentType) > -1) {\n init.body = JSON.stringify(init.body);\n } else if (contentType.indexOf(ApiResponse._urlencodedContentType) > -1) {\n init.body = queryStringify(init.body);\n }\n\n }\n\n // Create a request with encoded body\n var req = new Request(init.url, init);\n\n // Keep the original body accessible directly (for mocks)\n req.originalBody = init.body;\n\n return req;\n\n }\n\n}\n\n/**\n * @name IApiError\n * @property {string} stack\n * @property {string} originalMessage\n * @property {ApiResponse} apiResponse\n */\n\n\n/** WEBPACK FOOTER **\n ** ./src/http/Client.js\n **/","import {fetch, Request, Response, Headers, Promise} from '../core/Externals';\nimport * as utils from '../core/Utils';\n\n/**\n * Creates a response\n * @param stringBody\n * @param init\n * @return {Response}\n */\nexport function createResponse(stringBody, init) {\n\n init = init || {};\n\n var response = new Response(stringBody, init);\n\n //TODO Wait for https://github.com/bitinn/node-fetch/issues/38\n if (utils.isNodeJS()) {\n\n response._text = stringBody;\n response._decode = function() {\n return this._text;\n };\n\n }\n\n return response;\n\n}\n\nexport function findHeaderName(name, headers) {\n name = name.toLowerCase();\n return Object.keys(headers).reduce(function(res, key) {\n if (res) return res;\n if (name == key.toLowerCase()) return key;\n return res;\n }, null);\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/http/Utils.js\n **/","import {fetch, Request, Response, Headers, Promise} from '../core/Externals';\nimport * as utils from './Utils';\n\nexport default class ApiResponse {\n\n static _contentType = 'Content-Type';\n static _jsonContentType = 'application/json';\n static _multipartContentType = 'multipart/mixed';\n static _urlencodedContentType = 'application/x-www-form-urlencoded';\n static _headerSeparator = ':';\n static _bodySeparator = '\\n\\n';\n static _boundarySeparator = '--';\n\n /**\n * @param {Request} request\n * @param {Response} response\n * @param {string} responseText\n */\n constructor(request, response, responseText) {\n\n /** @type {Request} */\n this._request = request;\n\n /** @type {Response} */\n this._response = response;\n\n this._text = responseText;\n this._json = null;\n this._multipart = [];\n\n }\n\n /**\n * @return {Response}\n */\n response() {\n return this._response;\n }\n\n /**\n * @return {Request}\n */\n request() {\n return this._request;\n }\n\n /**\n * @return {boolean}\n */\n ok() {\n return this._response && this._response.ok;\n }\n\n /**\n * @return {string}\n */\n text() {\n if (!this._isJson() && !this._isMultipart()) throw new Error('Response is not text');\n return this._text;\n }\n\n /**\n * @return {object}\n */\n json() {\n if (!this._isJson()) throw new Error('Response is not JSON');\n if (!this._json) {\n this._json = this._text ? JSON.parse(this._text) : null;\n }\n return this._json;\n }\n\n /**\n * @param [skipOKCheck]\n * @return {string}\n */\n error(skipOKCheck) {\n\n if (this.ok() && !skipOKCheck) return null;\n\n var message = (this._response && this._response.status ? this._response.status + ' ' : '') +\n (this._response && this._response.statusText ? this._response.statusText : '');\n\n try {\n\n if (this.json().message) message = this.json().message;\n if (this.json().error_description) message = this.json().error_description;\n if (this.json().description) message = this.json().description;\n\n } catch (e) {}\n\n return message;\n\n }\n\n /**\n * @return {ApiResponse[]}\n */\n multipart() {\n\n if (!this._isMultipart()) throw new Error('Response is not multipart');\n\n if (!this._multipart.length) {\n\n // Step 1. Split multipart response\n\n var text = this.text();\n\n if (!text) throw new Error('No response body');\n\n var boundary = this._getContentType().match(/boundary=([^;]+)/i)[1];\n\n if (!boundary) throw new Error('Cannot find boundary');\n\n var parts = text.toString().split(ApiResponse._boundarySeparator + boundary);\n\n if (parts[0].trim() === '') parts.shift();\n if (parts[parts.length - 1].trim() == ApiResponse._boundarySeparator) parts.pop();\n\n if (parts.length < 1) throw new Error('No parts in body');\n\n // Step 2. Parse status info\n\n var statusInfo = ApiResponse.create(parts.shift(), this._response.status, this._response.statusText).json();\n\n // Step 3. Parse all other parts\n\n this._multipart = parts.map((part:string, i) => {\n\n var status = statusInfo.response[i].status;\n\n return ApiResponse.create(part, status);\n\n });\n\n }\n\n return this._multipart;\n\n }\n\n _isContentType(contentType) {\n return this._getContentType().indexOf(contentType) > -1;\n }\n\n _getContentType() {\n return this._response.headers.get(ApiResponse._contentType) || '';\n }\n\n _isMultipart() {\n return this._isContentType(ApiResponse._multipartContentType);\n }\n\n _isUrlEncoded() {\n return this._isContentType(ApiResponse._urlencodedContentType);\n }\n\n _isJson() {\n return this._isContentType(ApiResponse._jsonContentType);\n }\n\n /**\n * Method is used to create ApiResponse object from string parts of multipart/mixed response\n * @param {string} [text]\n * @param {number} [status]\n * @param {string} [statusText]\n * @return {ApiResponse}\n */\n static create(text, status, statusText) {\n\n text = text || '';\n status = status || 200;\n statusText = statusText || 'OK';\n\n text = text.replace(/\\r/g, '');\n\n var headers = new Headers(),\n headersAndBody = text.split(ApiResponse._bodySeparator),\n headersText = (headersAndBody.length > 1) ? headersAndBody.shift() : '';\n\n text = headersAndBody.join(ApiResponse._bodySeparator);\n\n (headersText || '')\n .split('\\n')\n .forEach((header:string) => {\n\n var split = header.trim().split(ApiResponse._headerSeparator),\n key = split.shift().trim(),\n value = split.join(ApiResponse._headerSeparator).trim();\n\n if (key) headers.append(key, value);\n\n });\n\n return new ApiResponse(null, utils.createResponse(text, {\n headers: headers,\n status: status,\n statusText: statusText\n }), text);\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/http/ApiResponse.js\n **/","import Registry from './Registry';\nimport {default as HttpClient} from '../http/Client';\n\nexport default class Client extends HttpClient {\n\n constructor() {\n super();\n this._registry = new Registry();\n }\n\n registry() {\n return this._registry;\n }\n\n async _loadResponse(request) {\n\n var mock = this._registry.find(request);\n\n return await mock.getResponse(request);\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/mocks/ClientMock.js\n **/","import Mock from './Mock';\n\nexport default class Registry {\n\n constructor() {\n this._mocks = [];\n }\n\n add(mock) {\n this._mocks.push(mock);\n return this;\n }\n\n clear() {\n this._mocks = [];\n return this;\n }\n\n find(request) {\n\n //console.log('Registry is looking for', request);\n\n var mock = this._mocks.shift();\n\n if (!mock) throw new Error('No mock in registry for request ' + request.method + ' ' + request.url);\n\n if (!mock.test(request)) throw new Error('Wrong request ' + request.method + ' ' + request.url +\n ' for expected mock ' + mock.method() + ' ' + mock.path());\n\n return mock;\n\n }\n\n apiCall(method:string, path:string, response:any, status, statusText) {\n\n this.add(new Mock(method, path, response, status, statusText));\n\n return this;\n\n }\n\n authentication() {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'access_token': 'ACCESS_TOKEN',\n 'token_type': 'bearer',\n 'expires_in': 3600,\n 'refresh_token': 'REFRESH_TOKEN',\n 'refresh_token_expires_in': 60480,\n 'scope': 'SMS RCM Foo Boo',\n 'expireTime': new Date().getTime() + 3600000\n });\n\n return this;\n\n }\n\n logout() {\n\n this.apiCall('POST', '/restapi/oauth/revoke', {});\n\n return this;\n\n }\n\n presenceLoad(id) {\n\n this.apiCall('GET', '/restapi/v1.0/account/~/extension/' + id + '/presence', {\n \"uri\": \"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/\" + id + \"/presence\",\n \"extension\": {\n \"uri\": \"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/\" + id,\n \"id\": id,\n \"extensionNumber\": \"101\"\n },\n \"activeCalls\": [],\n \"presenceStatus\": \"Available\",\n \"telephonyStatus\": \"Ringing\",\n \"userStatus\": \"Available\",\n \"dndStatus\": \"TakeAllCalls\",\n \"extensionId\": id\n });\n\n return this;\n\n }\n\n subscribeGeneric(expiresIn) {\n\n expiresIn = expiresIn || 15 * 60 * 60;\n\n var date = new Date();\n\n this.apiCall('POST', '/restapi/v1.0/subscription', {\n 'eventFilters': [\n '/restapi/v1.0/account/~/extension/~/presence'\n ],\n 'expirationTime': new Date(date.getTime() + (expiresIn * 1000)).toISOString(),\n 'expiresIn': expiresIn,\n 'deliveryMode': {\n 'transportType': 'PubNub',\n 'encryption': false,\n 'address': '123_foo',\n 'subscriberKey': 'sub-c-foo',\n 'secretKey': 'sec-c-bar'\n },\n 'id': 'foo-bar-baz',\n 'creationTime': date.toISOString(),\n 'status': 'Active',\n 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz'\n });\n\n return this;\n\n }\n\n subscribeOnPresence(id, detailed) {\n\n id = id || '1';\n\n var date = new Date();\n\n this.apiCall('POST', '/restapi/v1.0/subscription', {\n 'eventFilters': ['/restapi/v1.0/account/~/extension/' + id + '/presence' + (detailed ? '?detailedTelephonyState=true' : '')],\n 'expirationTime': new Date(date.getTime() + (15 * 60 * 60 * 1000)).toISOString(),\n 'deliveryMode': {\n 'transportType': 'PubNub',\n 'encryption': true,\n 'address': '123_foo',\n 'subscriberKey': 'sub-c-foo',\n 'secretKey': 'sec-c-bar',\n 'encryptionAlgorithm': 'AES',\n 'encryptionKey': 'VQwb6EVNcQPBhE/JgFZ2zw=='\n },\n 'creationTime': date.toISOString(),\n 'id': 'foo-bar-baz',\n 'status': 'Active',\n 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz'\n });\n\n return this;\n\n }\n\n tokenRefresh(failure) {\n\n if (!failure) {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'access_token': 'ACCESS_TOKEN_FROM_REFRESH',\n 'token_type': 'bearer',\n 'expires_in': 3600,\n 'refresh_token': 'REFRESH_TOKEN_FROM_REFRESH',\n 'refresh_token_expires_in': 60480,\n 'scope': 'SMS RCM Foo Boo'\n });\n\n } else {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'message': 'Wrong token',\n 'error_description': 'Wrong token',\n 'description': 'Wrong token'\n }, 400);\n\n }\n\n return this;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/mocks/Registry.js\n **/","import ApiResponse from '../http/ApiResponse';\nimport {delay} from '../core/Utils';\nimport {createResponse} from '../http/Utils';\n\nexport default class Mock {\n\n constructor(method, path, json, status, statusText, delay) {\n this._method = method.toUpperCase();\n this._path = path;\n this._json = json || {};\n this._delay = delay || 10;\n this._status = status || 200;\n this._statusText = statusText || 'OK';\n }\n\n path() {\n return this._path;\n }\n\n method() {\n return this._method;\n }\n\n test(request:Request) {\n\n return request.url.indexOf(this._path) > -1 &&\n request.method.toUpperCase() == this._method;\n\n }\n\n async getResponse(request) {\n\n await delay(this._delay);\n\n return this.createResponse(this._json);\n\n }\n\n createResponse(json, init) {\n\n init = init || {};\n\n init.status = init.status || this._status;\n init.statusText = init.statusText || this._statusText;\n\n var str = JSON.stringify(json),\n res = createResponse(str, init);\n\n res.headers.set(ApiResponse._contentType, ApiResponse._jsonContentType);\n\n return res;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/mocks/Mock.js\n **/","import Observable from '../core/Observable';\nimport Queue from './Queue';\nimport Auth from './Auth';\nimport {Promise} from '../core/Externals';\nimport {queryStringify, parseQueryString, delay} from '../core/Utils';\n\nexport default class Platform extends Observable {\n\n static _urlPrefix = '/restapi';\n static _apiVersion = 'v1.0';\n static _accessTokenTtl = null; // Platform server by default sets it to 60 * 60 = 1 hour\n static _refreshTokenTtl = 10 * 60 * 60; // 10 hours\n static _refreshTokenTtlRemember = 7 * 24 * 60 * 60; // 1 week\n static _tokenEndpoint = '/restapi/oauth/token';\n static _revokeEndpoint = '/restapi/oauth/revoke';\n static _authorizeEndpoint = '/restapi/oauth/authorize';\n static _refreshDelayMs = 100;\n static _cacheId = 'platform';\n static _clearCacheOnRefreshError = true;\n\n events = {\n beforeLogin: 'beforeLogin',\n loginSuccess: 'loginSuccess',\n loginError: 'loginError',\n beforeRefresh: 'beforeRefresh',\n refreshSuccess: 'refreshSuccess',\n refreshError: 'refreshError',\n beforeLogout: 'beforeLogout',\n logoutSuccess: 'logoutSuccess',\n logoutError: 'logoutError'\n };\n\n constructor(client, cache, server, appKey, appSecret) {\n\n super();\n\n this._server = server;\n this._appKey = appKey;\n this._appSecret = appSecret;\n\n /** @type {Cache} */\n this._cache = cache;\n\n /** @type {Client} */\n this._client = client;\n\n this._queue = new Queue(this._cache, Platform._cacheId + '-refresh');\n\n this._auth = new Auth(this._cache, Platform._cacheId);\n\n }\n\n /**\n * @return {Auth}\n */\n auth() {\n return this._auth;\n }\n\n /**\n * @return {Client}\n */\n client() {\n return this._client;\n }\n\n /**\n * @param {string} path\n * @param {object} [options]\n * @param {boolean} [options.addServer]\n * @param {string} [options.addMethod]\n * @param {boolean} [options.addToken]\n * @return {string}\n */\n createUrl(path, options) {\n\n path = path || '';\n options = options || {};\n\n var builtUrl = '',\n hasHttp = path.indexOf('http://') != -1 || path.indexOf('https://') != -1;\n\n if (options.addServer && !hasHttp) builtUrl += this._server;\n\n if (path.indexOf(Platform._urlPrefix) == -1 && !hasHttp) builtUrl += Platform._urlPrefix + '/' + Platform._apiVersion;\n\n builtUrl += path;\n\n if (options.addMethod || options.addToken) builtUrl += (path.indexOf('?') > -1 ? '&' : '?');\n\n if (options.addMethod) builtUrl += '_method=' + options.addMethod;\n if (options.addToken) builtUrl += (options.addMethod ? '&' : '') + 'access_token=' + this._auth.accessToken();\n\n return builtUrl;\n\n }\n\n /**\n * @param {string} options.redirectUri\n * @param {string} options.state\n * @param {string} options.brandId\n * @param {string} options.display\n * @param {string} options.prompt\n * @return {string}\n */\n authUrl(options) {\n\n options = options || {};\n\n return this.createUrl(Platform._authorizeEndpoint + '?' + queryStringify({\n 'response_type': 'code',\n 'redirect_uri': options.redirectUri || '',\n 'client_id': this._appKey,\n 'state': options.state || '',\n 'brand_id': options.brandId || '',\n 'display': options.display || '',\n 'prompt': options.prompt || ''\n }), {addServer: true})\n\n }\n\n /**\n * @param {string} url\n * @return {Object}\n */\n parseAuthRedirectUrl(url:string) {\n\n var qs = parseQueryString(url.split('?').reverse()[0]),\n error = qs.error_description || qs.error;\n\n if (error) {\n var e = new Error(error);\n e.error = qs.error;\n throw e;\n }\n\n return qs;\n\n }\n\n /**\n * @return {Promise}\n */\n async loggedIn() {\n\n try {\n await this._ensureAuthentication();\n return true;\n } catch (e) {\n return false;\n }\n\n }\n\n /**\n * @param {string} options.username\n * @param {string} options.password\n * @param {string} options.extension\n * @param {string} options.code\n * @param {string} options.redirectUri\n * @param {string} options.endpointId\n * @returns {Promise}\n */\n async login(options) {\n\n try {\n\n options = options || {};\n\n options.remember = options.remember || false;\n\n this.emit(this.events.beforeLogin);\n\n var body = {\n \"access_token_ttl\": Platform._accessTokenTtl,\n \"refresh_token_ttl\": options.remember ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl\n };\n\n if (!options.code) {\n\n body.grant_type = 'password';\n body.username = options.username;\n body.password = options.password;\n body.extension = options.extension || '';\n\n } else if (options.code) {\n\n body.grant_type = 'authorization_code';\n body.code = options.code;\n body.redirect_uri = options.redirectUri;\n //body.client_id = this.getCredentials().key; // not needed\n\n }\n\n if (options.endpointId) body.endpoint_id = options.endpointId;\n\n var apiResponse = await this._tokenRequest(Platform._tokenEndpoint, body),\n json = apiResponse.json();\n\n this._auth\n .setData(json)\n .setRemember(options.remember);\n\n this.emit(this.events.loginSuccess, apiResponse);\n\n return apiResponse;\n\n } catch (e) {\n\n this._cache.clean();\n\n this.emit(this.events.loginError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n async refresh() {\n\n try {\n\n this.emit(this.events.beforeRefresh);\n\n if (this._queue.isPaused()) {\n\n await this._queue.poll();\n\n if (!this._isAccessTokenValid()) {\n throw new Error('Automatic authentification timeout');\n }\n\n this.emit(this.events.refreshSuccess, null);\n\n return null;\n\n }\n\n this._queue.pause();\n\n // Make sure all existing AJAX calls had a chance to reach the server\n await delay(Platform._refreshDelayMs);\n\n // Perform sanity checks\n if (!this._auth.refreshToken()) throw new Error('Refresh token is missing');\n if (!this._auth.refreshTokenValid()) throw new Error('Refresh token has expired');\n if (!this._queue.isPaused()) throw new Error('Queue was resumed before refresh call');\n\n /** @type {ApiResponse} */\n var res = await this._tokenRequest(Platform._tokenEndpoint, {\n \"grant_type\": \"refresh_token\",\n \"refresh_token\": this._auth.refreshToken(),\n \"access_token_ttl\": Platform._accessTokenTtl,\n \"refresh_token_ttl\": this._auth.remember() ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl\n }),\n json = res.json();\n\n if (!json.access_token) {\n throw this._client.makeError(new Error('Malformed OAuth response'), res);\n }\n\n this._auth.setData(json);\n this._queue.resume();\n\n this.emit(this.events.refreshSuccess, res);\n\n return res;\n\n } catch (e) {\n\n e = this._client.makeError(e);\n\n if (Platform._clearCacheOnRefreshError) {\n this._cache.clean();\n }\n\n this.emit(this.events.refreshError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n async logout() {\n\n try {\n\n this.emit(this.events.beforeLogout);\n\n this._queue.pause();\n\n var res = await this._tokenRequest(Platform._revokeEndpoint, {\n token: this._auth.accessToken()\n });\n\n this._queue.resume();\n this._cache.clean();\n\n this.emit(this.events.logoutSuccess, res);\n\n return res;\n\n } catch (e) {\n\n this._queue.resume();\n\n this.emit(this.events.logoutError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @param {Request} request\n * @param {object} [options]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async inflateRequest(request, options) {\n\n options = options || {};\n\n if (options.skipAuthCheck) return request;\n\n await this._ensureAuthentication();\n\n request.headers.set('Authorization', this._authHeader());\n //request.url = this.createUrl(request.url, {addServer: true}); //FIXME Spec prevents this...\n\n //TODO Add User-Agent here\n\n return request;\n\n }\n\n /**\n * @param {Request} request\n * @param {object} [options]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async sendRequest(request, options) {\n\n try {\n\n request = await this.inflateRequest(request, options);\n\n return (await this._client.sendRequest(request));\n\n } catch (e) {\n\n // Guard is for errors that come from polling\n if (!e.apiResponse || !e.apiResponse.response() || (e.apiResponse.response().status != 401)) throw e;\n\n this._auth.cancelAccessToken();\n\n return (await this.sendRequest(request, options));\n\n }\n\n }\n\n /**\n * General purpose function to send anything to server\n * @param {object} [options.body]\n * @param {string} [options.url]\n * @param {string} [options.method]\n * @param {object} [options.query]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async send(options = {}) {\n\n //FIXME https://github.com/bitinn/node-fetch/issues/43\n options.url = this.createUrl(options.url, {addServer: true});\n\n return await this.sendRequest(this._client.createRequest(options), options);\n\n }\n\n /**\n * @param {string} url\n * @param {object} query\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async get(url, query, options) {\n options = options || {};\n options.method = 'GET';\n options.url = url;\n options.query = query;\n return await this.send(options);\n }\n\n /**\n * @param {string} url\n * @param {object} body\n * @param {object} query\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async post(url, body, query, options) {\n options = options || {};\n options.method = 'POST';\n options.url = url;\n options.query = query;\n options.body = body;\n return await this.send(options);\n }\n\n /**\n * @param {string} url\n * @param {object} body\n * @param {object} query\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async put(url, body, query, options) {\n options = options || {};\n options.method = 'PUT';\n options.url = url;\n options.query = query;\n options.body = body;\n return await this.send(options);\n }\n\n /**\n * @param {string} url\n * @param {string} query\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async 'delete'(url, query, options) {\n options = options || {};\n options.method = 'DELETE';\n options.url = url;\n options.query = query;\n return await this.send(options);\n }\n\n async _tokenRequest(path, body) {\n\n return await this.send({\n url: path,\n skipAuthCheck: true,\n body: body,\n method: 'POST',\n headers: {\n 'Authorization': 'Basic ' + this._apiKey(),\n 'Content-Type': 'application/x-www-form-urlencoded'\n }\n });\n\n }\n\n async _ensureAuthentication() {\n\n if (this._isAccessTokenValid()) return null;\n return await this.refresh();\n\n }\n\n _isAccessTokenValid() {\n\n return (this._auth.accessTokenValid() && !this._queue.isPaused());\n\n }\n\n _apiKey() {\n var apiKey = this._appKey + ':' + this._appSecret;\n return (typeof btoa == 'function') ? btoa(apiKey) : new Buffer(apiKey).toString('base64');\n }\n\n _authHeader() {\n var token = this._auth.accessToken();\n return this._auth.tokenType() + (token ? ' ' + token : '');\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/platform/Platform.js\n **/","import {Promise} from '../core/Externals';\nimport {poll, stopPolling} from '../core/Utils';\n\nexport default class Queue {\n\n static _pollInterval = 250;\n static _releaseTimeout = 5000;\n\n constructor(cache, cacheId) {\n\n this._cache = cache;\n this._cacheId = cacheId;\n this._promise = null;\n\n }\n\n isPaused() {\n\n var storage = this._cache,\n cacheId = this._cacheId,\n time = storage.getItem(cacheId);\n\n return !!time && Date.now() - parseInt(time) < Queue._releaseTimeout;\n }\n\n pause() {\n this._cache.setItem(this._cacheId, Date.now());\n return this;\n }\n\n resume() {\n this._cache.removeItem(this._cacheId);\n return this;\n }\n\n poll() {\n\n if (this._promise) return this._promise;\n\n this._promise = new Promise((resolve, reject) => {\n\n poll((next) => {\n\n if (this.isPaused()) return next();\n\n this._promise = null;\n\n this.resume(); // this is actually not needed but why not\n\n resolve(null);\n\n }, Queue._pollInterval);\n\n });\n\n return this._promise;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/platform/Queue.js\n **/","export default class Auth {\n\n static refreshHandicapMs:number = 60 * 1000; // 1 minute\n static forcedTokenType = 'forced';\n\n constructor(cache, cacheId:string) {\n\n /** @type {Cache} */\n this._cache = cache;\n this._cacheId = cacheId;\n\n }\n\n accessToken() {\n return this.data().access_token;\n }\n\n refreshToken() {\n return this.data().refresh_token;\n }\n\n tokenType() {\n return this.data().token_type;\n }\n\n /**\n * @return {{token_type: string, access_token: string, expires_in: number, refresh_token: string, refresh_token_expires_in: number}}\n */\n data() {\n\n return this._cache.getItem(this._cacheId) || {\n token_type: '',\n access_token: '',\n expires_in: 0,\n refresh_token: '',\n refresh_token_expires_in: 0\n };\n\n }\n\n /**\n * @param {object} newData\n * @return {Auth}\n */\n setData(newData) {\n\n newData = newData || {};\n\n var data = this.data();\n\n Object.keys(newData).forEach((key) => {\n data[key] = newData[key];\n });\n\n data.expire_time = Date.now() + (data.expires_in * 1000);\n data.refresh_token_expire_time = Date.now() + (data.refresh_token_expires_in * 1000);\n\n this._cache.setItem(this._cacheId, data);\n\n return this;\n\n }\n\n /**\n * Check if there is a valid (not expired) access token\n * @return {boolean}\n */\n accessTokenValid() {\n\n var authData = this.data();\n return (authData.token_type === Auth.forcedTokenType || (authData.expire_time - Auth.refreshHandicapMs > Date.now()));\n\n }\n\n /**\n * Check if there is a valid (not expired) access token\n * @return {boolean}\n */\n refreshTokenValid() {\n\n return (this.data().refresh_token_expire_time > Date.now());\n\n }\n\n /**\n * @return {Auth}\n */\n cancelAccessToken() {\n\n return this.setData({\n access_token: '',\n expires_in: 0\n });\n\n }\n\n /**\n * This method sets a special authentication mode used in Service Web\n * @return {Auth}\n */\n forceAuthentication() {\n\n this.setData({\n token_type: Auth.forcedTokenType,\n access_token: '',\n expires_in: 0,\n refresh_token: '',\n refresh_token_expires_in: 0\n });\n\n return this;\n\n }\n\n /**\n * @param remember\n * @return {Auth}\n */\n setRemember(remember) {\n\n return this.setData({remember: remember});\n\n }\n\n /**\n * @return {boolean}\n */\n remember() {\n\n return !!this.data().remember;\n\n }\n\n}\n\n//export interface IAuthData {\n// remember?:boolean;\n// token_type?:string;\n// access_token?:string;\n// expires_in?:number; // actually it's string\n// expire_time?:number;\n// refresh_token?:string;\n// refresh_token_expires_in?:number; // actually it's string\n// refresh_token_expire_time?:number;\n// scope?:string;\n//}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/platform/Auth.js\n **/","import PubnubMock from './PubnubMock.js';\nimport {PUBNUB} from '../core/Externals';\n\nexport default class PubnubMockFactory {\n\n constructor() {\n this.crypto_obj = PUBNUB.crypto_obj;\n }\n\n init(options:PUBNUBInitOptions) {\n return new PubnubMock(options);\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/pubnub/PubnubFactory.js\n **/","import Observable from '../core/Observable';\nimport {PUBNUB} from '../core/Externals';\n\nexport default class PubnubMock extends Observable {\n\n constructor(options) {\n super();\n this.options = options;\n this.crypto_obj = PUBNUB.crypto_obj;\n }\n\n ready() {}\n\n subscribe(options:PUBNUBSubscribeOptions) {\n this.on('message-' + options.channel, options.message);\n }\n\n unsubscribe(options:PUBNUBUnsubscribeOptions) {\n this.off('message-' + options.channel);\n }\n\n receiveMessage(msg, channel) {\n this.emit('message-' + channel, msg, 'env', channel);\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/pubnub/PubnubMock.js\n **/","import Observable from '../core/Observable';\nimport Client from '../http/Client';\nimport {poll, stopPolling} from '../core/Utils';\n\nexport default class Subscription extends Observable {\n\n static _renewHandicapMs = 2 * 60 * 1000;\n static _pollInterval = 10 * 1000;\n\n events = {\n notification: 'notification',\n removeSuccess: 'removeSuccess',\n removeError: 'removeError',\n renewSuccess: 'renewSuccess',\n renewError: 'renewError',\n subscribeSuccess: 'subscribeSuccess',\n subscribeError: 'subscribeError'\n };\n\n constructor(pubnubFactory, platform, cache) {\n\n super();\n\n this._pubnubFactory = pubnubFactory;\n this._platform = platform;\n this._cache = cache;\n this._pubnub = null;\n this._timeout = null;\n this._subscription = {};\n\n }\n\n /**\n * @return {boolean}\n */\n alive() {\n\n return !!(this._subscription.id &&\n this._subscription.deliveryMode &&\n this._subscription.deliveryMode.subscriberKey &&\n this._subscription.deliveryMode.address &&\n Date.now() < this.expirationTime());\n\n }\n\n expirationTime() {\n return new Date(this._subscription.expirationTime || 0).getTime() - Subscription._renewHandicapMs;\n }\n\n setSubscription(subscription) {\n\n subscription = subscription || {};\n\n this._clearTimeout();\n\n this._subscription = subscription;\n\n if (!this._pubnub) this._subscribeAtPubnub();\n\n this._setTimeout();\n\n return this;\n\n }\n\n subscription() {\n return this._subscription;\n }\n\n /**\n * Creates or updates subscription if there is an active one\n * @param {{events?:string[]}} [options] New array of events\n * @returns {Promise}\n */\n async register(options) {\n\n if (this.alive()) {\n return await this.renew(options);\n } else {\n return await this.subscribe(options);\n }\n\n }\n\n eventFilters() {\n return this._subscription.eventFilters || [];\n }\n\n /**\n * @param {string[]} events\n * @return {Subscription}\n */\n addEventFilters(events) {\n this.setEventFilters(this.eventFilters().concat(events));\n return this;\n }\n\n /**\n * @param {string[]} events\n * @return {Subscription}\n */\n setEventFilters(events) {\n this._subscription.eventFilters = events;\n return this;\n }\n\n /**\n * @param {{events?:string[]}} [options] New array of events\n * @returns {Promise}\n */\n async subscribe(options) {\n\n try {\n\n options = options || {};\n\n if (options.events) this.setEventFilters(options.events);\n\n this._clearTimeout();\n\n if (!this.eventFilters().length) throw new Error('Events are undefined');\n\n var response = await this._platform.post('/restapi/v1.0/subscription', {\n eventFilters: this._getFullEventFilters(),\n deliveryMode: {\n transportType: 'PubNub'\n }\n }),\n json = response.json();\n\n this.setSubscription(json)\n .emit(this.events.subscribeSuccess, response);\n\n return response;\n\n\n } catch (e) {\n\n e = this._platform.client().makeError(e);\n\n this.reset()\n .emit(this.events.subscribeError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @param {{events?:string[]}} [options] New array of events\n * @returns {Promise}\n */\n async renew(options) {\n\n try {\n\n options = options || {};\n\n if (options.events) this.setEventFilters(options.events);\n\n this._clearTimeout();\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n if (!this.eventFilters().length) throw new Error('Events are undefined');\n\n var response = await this._platform.put('/restapi/v1.0/subscription/' + this._subscription.id, {\n eventFilters: this._getFullEventFilters()\n });\n\n var json = response.json();\n\n this.setSubscription(json)\n .emit(this.events.renewSuccess, response);\n\n return response;\n\n } catch (e) {\n\n e = this._platform.client().makeError(e);\n\n this.reset()\n .emit(this.events.renewError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n async remove() {\n\n try {\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n var response = await this._platform.delete('/restapi/v1.0/subscription/' + this._subscription.id);\n\n this.reset()\n .emit(this.events.removeSuccess, response);\n\n return response;\n\n } catch (e) {\n\n e = this._platform.client().makeError(e);\n\n this.emit(this.events.removeError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * Remove subscription and disconnect from PUBNUB\n * This method resets subscription at client side but backend is not notified\n */\n reset() {\n this._clearTimeout();\n if (this.alive() && this._pubnub) this._pubnub.unsubscribe({channel: this._subscription.deliveryMode.address});\n this._subscription = {};\n return this;\n }\n\n /**\n *\n * @param {string} cacheKey\n * @param {string[]} events\n * @return {Subscription}\n */\n restoreFromCache(cacheKey, events) {\n\n this.on([this.events.subscribeSuccess, this.events.renewSuccess], () => {\n\n this._cache.setItem(cacheKey, this.subscription());\n\n });\n\n this.on(this.events.renewError, () => {\n\n this.reset()\n .setEventFilters(events)\n .register();\n\n });\n\n var cachedSubscriptionData = this._cache.getItem(cacheKey);\n\n if (cachedSubscriptionData) {\n try {\n this.setSubscription(cachedSubscriptionData);\n } catch (e) {}\n } else {\n this.setEventFilters(events);\n }\n\n return this;\n\n }\n\n _getFullEventFilters() {\n\n return this.eventFilters().map((event) => {\n return this._platform.createUrl(event);\n });\n\n }\n\n _setTimeout() {\n\n this._clearTimeout();\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n poll((next)=> {\n\n if (this.alive()) return next();\n\n this.renew();\n\n }, Subscription._pollInterval, this._timeout);\n\n return this;\n\n }\n\n _clearTimeout() {\n\n stopPolling(this._timeout);\n\n return this;\n\n }\n\n _decrypt(message:any) {\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n if (this._subscription.deliveryMode.encryptionKey) {\n\n var PUBNUB = this._pubnubFactory;\n\n message = PUBNUB.crypto_obj.decrypt(message, this._subscription.deliveryMode.encryptionKey, {\n encryptKey: false,\n keyEncoding: 'base64',\n keyLength: 128,\n mode: 'ecb'\n });\n\n }\n\n return message;\n\n }\n\n _notify(message:any) {\n\n this.emit(this.events.notification, this._decrypt(message));\n\n return this;\n\n }\n\n _subscribeAtPubnub():Subscription {\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n var PUBNUB = this._pubnubFactory;\n\n this._pubnub = PUBNUB.init({\n ssl: true,\n subscribe_key: this._subscription.deliveryMode.subscriberKey\n });\n\n this._pubnub.ready();\n\n this._pubnub.subscribe({\n channel: this._subscription.deliveryMode.address,\n message: this._notify.bind(this),\n connect: () => {}\n });\n\n return this;\n\n }\n\n}\n\n//export interface ISubscription {\n// id?:string;\n// uri?: string;\n// eventFilters?:string[];\n// expirationTime?:string; // 2014-03-12T19:54:35.613Z\n// expiresIn?:number;\n// deliveryMode?: {\n// transportType?:string;\n// encryption?:boolean;\n// address?:string;\n// subscriberKey?:string;\n// encryptionKey?:string;\n// secretKey?:string;\n// };\n// creationTime?:string; // 2014-03-12T19:54:35.613Z\n// status?:string; // Active\n//}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/subscription/Subscription.js\n **/","/**\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 // This invoke function is written in a style that assumes some\n // calling function (or Promise) will handle exceptions.\n function invoke(method, arg) {\n var result = generator[method](arg);\n var value = result.value;\n return value instanceof AwaitArgument\n ? Promise.resolve(value.arg).then(invokeNext, invokeThrow)\n : 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 return result;\n });\n }\n\n if (typeof process === \"object\" && process.domain) {\n invoke = process.domain.bind(invoke);\n }\n\n var invokeNext = invoke.bind(generator, \"next\");\n var invokeThrow = invoke.bind(generator, \"throw\");\n var invokeReturn = invoke.bind(generator, \"return\");\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return invoke(method, arg);\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 ) : new Promise(function (resolve) {\n resolve(callInvokeWithMethodAndArg());\n });\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\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/regenerator/runtime.js\n ** module id = 25\n ** module chunks = 0\n **/"],"sourceRoot":"/source/"} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","ringcentral-bundle.js","webpack:/webpack/bootstrap 376cc765ad2cf3304422","webpack:///src/SDK.js","webpack:///src/core/Utils.js","webpack:///src/core/Externals.js","webpack:///bower_components/es6-promise/promise.js","webpack:///(webpack)/~/node-libs-browser/~/timers-browserify/main.js","webpack:///(webpack)/~/node-libs-browser/~/process/browser.js","webpack:///(webpack)/buildin/module.js","webpack:///(webpack)/buildin/amd-define.js","webpack:///bower_components/fetch/fetch.js","webpack:///bower_components/pubnub/web/pubnub.js","webpack:///src/core/Cache.js","webpack:///src/core/Observable.js","webpack:///src/core/Queue.js","webpack:///src/http/Client.js","webpack:///src/http/Utils.js","webpack:///src/http/ApiResponse.js","webpack:///src/mocks/ClientMock.js","webpack:///src/mocks/Registry.js","webpack:///src/mocks/Mock.js","webpack:///src/platform/Platform.js","webpack:///src/platform/Auth.js","webpack:///src/pubnub/PubnubFactory.js","webpack:///src/pubnub/PubnubMock.js","webpack:///src/subscription/Subscription.js","webpack:///src/subscription/CachedSubscription.js","webpack:///~/regenerator/runtime.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","_interopRequireDefault","obj","__esModule","default","_interopRequireWildcard","newObj","key","Object","prototype","hasOwnProperty","_classCallCheck","instance","Constructor","TypeError","_createClass","defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","defineProperty","protoProps","staticProps","_coreUtils","Utils","_coreCache","_coreCache2","_coreExternals","Externals","_coreObservable","_coreObservable2","_coreQueue","_coreQueue2","_httpClient","_httpClient2","_httpApiResponse","_httpApiResponse2","_httpUtils","HttpUtils","_mocksClientMock","_mocksClientMock2","_mocksMock","_mocksMock2","_mocksRegistry","_mocksRegistry2","_platformPlatform","_platformPlatform2","_platformAuth","_platformAuth2","_pubnubPubnubFactory","_pubnubPubnubFactory2","_subscriptionSubscription","_subscriptionSubscription2","_subscriptionCachedSubscription","_subscriptionCachedSubscription2","SDK","options","_cache","localStorage","cachePrefix","_client","client","_platform","server","appKey","appSecret","_pubnubFactory","pubnubFactory","PUBNUB","value","sandbox","production","platform","createSubscription","createCachedSubscription","cacheKey","cache","Cache","Observable","Queue","Client","ApiResponse","Auth","Platform","Subscription","Registry","Mock","PubnubMockFactory","queryStringify","parameters","array","keys","forEach","k","v","isArray","vv","push","encodeURIComponent","join","parseQueryString","queryString","argsParsed","split","arg","decodeURIComponent","indexOf","trim","pair","isFunction","Array","poll","fn","interval","timeout","stopPolling","next","delay","setTimeout","clearTimeout","isNodeJS","process","isBrowser","window","_ExternalsJs","Promise","resolve","reject","_es6Promise","_es6Promise2","_nodeFetch","_nodeFetch2","_pubnub","_pubnub2","Function","fetch","Request","Response","Headers","__WEBPACK_AMD_DEFINE_RESULT__","setImmediate","global","lib$es6$promise$utils$$objectOrFunction","x","lib$es6$promise$utils$$isFunction","lib$es6$promise$utils$$isMaybeThenable","lib$es6$promise$asap$$asap","callback","lib$es6$promise$asap$$queue","lib$es6$promise$asap$$len","lib$es6$promise$asap$$customSchedulerFn","lib$es6$promise$asap$$flush","lib$es6$promise$asap$$scheduleFlush","lib$es6$promise$asap$$setScheduler","scheduleFn","lib$es6$promise$asap$$useNextTick","nextTick","version","versions","node","match","lib$es6$promise$asap$$useVertxTimer","lib$es6$promise$asap$$vertxNext","lib$es6$promise$asap$$useMutationObserver","iterations","observer","lib$es6$promise$asap$$BrowserMutationObserver","document","createTextNode","observe","characterData","data","lib$es6$promise$asap$$useMessageChannel","channel","MessageChannel","port1","onmessage","port2","postMessage","lib$es6$promise$asap$$useSetTimeout","undefined","lib$es6$promise$asap$$attemptVertex","vertx","e","Error","code","runOnLoop","runOnContext","lib$es6$promise$$internal$$noop","lib$es6$promise$$internal$$selfFullfillment","lib$es6$promise$$internal$$cannotReturnOwn","lib$es6$promise$$internal$$getThen","promise","then","error","lib$es6$promise$$internal$$GET_THEN_ERROR","lib$es6$promise$$internal$$tryThen","fulfillmentHandler","rejectionHandler","lib$es6$promise$$internal$$handleForeignThenable","thenable","lib$es6$promise$asap$$default","sealed","lib$es6$promise$$internal$$resolve","lib$es6$promise$$internal$$fulfill","reason","lib$es6$promise$$internal$$reject","_label","lib$es6$promise$$internal$$handleOwnThenable","_state","lib$es6$promise$$internal$$FULFILLED","_result","lib$es6$promise$$internal$$REJECTED","lib$es6$promise$$internal$$subscribe","lib$es6$promise$$internal$$handleMaybeThenable","maybeThenable","constructor","lib$es6$promise$$internal$$publishRejection","_onerror","lib$es6$promise$$internal$$publish","lib$es6$promise$$internal$$PENDING","_subscribers","parent","child","onFulfillment","onRejection","subscribers","settled","detail","lib$es6$promise$$internal$$invokeCallback","lib$es6$promise$$internal$$ErrorObject","lib$es6$promise$$internal$$tryCatch","lib$es6$promise$$internal$$TRY_CATCH_ERROR","succeeded","failed","hasCallback","lib$es6$promise$$internal$$initializePromise","resolver","lib$es6$promise$enumerator$$Enumerator","input","enumerator","_instanceConstructor","_validateInput","_input","_remaining","_init","_enumerate","_validationError","lib$es6$promise$promise$all$$all","entries","lib$es6$promise$enumerator$$default","lib$es6$promise$promise$race$$race","lib$es6$promise$utils$$isArray","lib$es6$promise$promise$resolve$$resolve","object","lib$es6$promise$promise$reject$$reject","lib$es6$promise$promise$$needsResolver","lib$es6$promise$promise$$needsNew","lib$es6$promise$promise$$Promise","_id","lib$es6$promise$promise$$counter","lib$es6$promise$polyfill$$polyfill","local","self","P","toString","cast","lib$es6$promise$promise$$default","lib$es6$promise$utils$$_isArray","lib$es6$promise$asap$$browserWindow","lib$es6$promise$asap$$browserGlobal","MutationObserver","WebKitMutationObserver","lib$es6$promise$asap$$isNode","lib$es6$promise$asap$$isWorker","Uint8ClampedArray","importScripts","_eachEntry","entry","_settledAt","_willSettleAt","state","lib$es6$promise$promise$all$$default","lib$es6$promise$promise$race$$default","lib$es6$promise$promise$resolve$$default","lib$es6$promise$promise$reject$$default","all","race","_setScheduler","_asap","result","arguments","catch","lib$es6$promise$polyfill$$default","lib$es6$promise$umd$$ES6Promise","polyfill","clearImmediate","Timeout","clearFn","_clearFn","apply","slice","immediateIds","nextImmediateId","setInterval","clearInterval","close","unref","ref","enroll","item","msecs","_idleTimeoutId","_idleTimeout","unenroll","_unrefActive","active","_onTimeout","args","cleanUpNextTick","draining","currentQueue","queue","concat","queueIndex","drainQueue","len","run","Item","fun","noop","title","browser","env","argv","on","addListener","once","off","removeListener","removeAllListeners","emit","binding","name","cwd","chdir","dir","umask","webpackPolyfill","deprecate","paths","children","normalizeName","String","test","toLowerCase","normalizeValue","headers","map","append","getOwnPropertyNames","consumed","body","bodyUsed","fileReaderReady","reader","onload","onerror","readBlobAsArrayBuffer","blob","FileReader","readAsArrayBuffer","readBlobAsText","readAsText","Body","_initBody","_bodyInit","_bodyText","support","Blob","isPrototypeOf","_bodyBlob","formData","FormData","_bodyFormData","rejected","arrayBuffer","text","decode","json","JSON","parse","normalizeMethod","method","upcased","toUpperCase","methods","url","credentials","mode","referrer","form","bytes","shift","replace","xhr","head","pairs","getAllResponseHeaders","header","bodyInit","type","status","ok","statusText","list","get","values","getAll","has","set","thisArg","init","request","responseURL","getResponseHeader","XMLHttpRequest","response","responseText","open","withCredentials","responseType","setRequestHeader","send","unique","NOW","Date","rnow","build_url","url_components","url_params","URLBIT","params","each","value_str","encode","PARAMSBIT","updater","rate","last","runnit","grep","fin","l","supplant","str","REPL","_","wait","generate_uuid","u","r","Math","random","o","f","pam_encode","charCodeAt","path","generate_channel_list","channels","nopresence","search","subscribed","sort","generate_channel_group_list","channel_groups","channel_group","ready","READY","READY_BUFFER","connect","SECOND","PNmessage","msg","apns","aps","alert","badge","exclude1","exclude","getPubnubMessage","publish","message","PN_API","setup","_get_url_params","_object_to_key_list","_object_to_key_list_sorted","_get_pam_sign_input_from_params","si","validate_presence_heartbeat","heartbeat","cur_heartbeat","err","PRESENCE_HB_THRESHOLD","PRESENCE_HB_DEFAULT","encrypt","crypto_obj","CIPHER_KEY","decrypt","_presence_heartbeat","PRESENCE_HB_TIMEOUT","PRESENCE_HB_INTERVAL","CHANNELS","CHANNEL_GROUPS","PRESENCE_HB_RUNNING","SELF","stringify","start_presence_heartbeat","NO_WAIT_FOR_PENDING","PUB_QUEUE","sending","xdr","each_channel_group","count","chang","each_channel","chan","_invoke_callback","callback_data","_invoke_error","CR","url1","jsonp","jsonp_cb","AUTH_KEY","STD_ORIGIN","SUBSCRIBE_KEY","success","fail","_poll_online","_is_online","_reset_offline","_poll_timer","_poll_online2","TIME_CHECK","detect_time_detla","_poll_timer2","KEEPALIVE","SUB_RECEIVER","detect_latency","tt","adjusted_time","TIME_DRIFT","cb","time","calculate","ptime","latency","stime","SUB_WINDOWING","DEF_WINDOWING","SUB_TIMEOUT","DEF_SUB_TIMEOUT","DEF_KEEPALIVE","NOLEAVE","PUBLISH_KEY","SECRET_KEY","hmac_SHA256","SSL","ORIGIN","nextorigin","SUB_ORIGIN","CONNECT","CLOAK","SUB_CALLBACK","SUB_CHANNEL","SUB_RESTORE","TIMETOKEN","RESUMED","STATE","PRESENCE_HB","COMPATIBLE_35","db","UUID","USE_INSTANCEID","INSTANCEID","shutdown","use_send_beacon","sendBeacon","a","b","LEAVE","blocking","auth_key","uuid","auth","origin","PRESENCE_SUFFIX","url_string","action","service","LEAVE_GROUP","set_resumed","resumed","get_cipher_key","set_cipher_key","raw_encrypt","raw_decrypt","get_heartbeat","set_heartbeat","heartbeat_interval","get_heartbeat_interval","set_heartbeat_interval","get_version","SDK_VER","getGcmMessageObject","getApnsMessageObject","newPnMessage","gcm","n","_add_param","val","namespace","ns_ch","cloak","ns_ch_a","channel_group_list_groups","channel_group_list_channels","channel_group_remove_channel","channel_group_remove_group","channel_group_add_channel","channel_group_cloak","channel_group_list_namespaces","channel_group_remove_namespace","history","reverse","cipher_key","start","end","include_token","string_msg_token","payload","messages","decrypted_messages","new_message","replay","source","destination","stop","limit","post","store","add_msg","unsubscribe","ch","CB_CALLED","chg","subscribe","_test_connection","windowing","disconnected","reconnect","disconnect","_connect","st","sub_timeout","SUB_ERROR","idlecb","connected","backfill","next_callback","channels2","list2","channel2","chobj","decrypted_msg","presence","noheresync","timetoken","restore","settings","here","uid","timestamp","floor","occupancy","here_now","uuids","where_now","grant","ttl","w","getTime","sign_input","signature","mobile_gw_provision","op","gw_type","device_id","audit","revoke","set_uuid","get_uuid","get_subscibed_channels","presence_heartbeat","stop_timers","each-channel","offline","now","SHA256","s","CryptoJS","parse_options","defaultOptions","allowedKeyEncodings","allowedKeyLengths","parseInt","allowedModes","decode_key","get_padded_key","get_mode","get_iv","iv","encryptKey","keyEncoding","keyLength","hex_message","encryptedHexArray","base_64_encrypted","binary_enc","json_plain","ciphertext","plaintext","toJSON","valueOf","quote","string","escapable","lastIndex","meta","holder","partial","mind","gap","rep","isFinite","indent","cx","\b","\t","\n","\f","\r","\"","\\","replacer","space","eval","DEF_TIMEOUT","max","ori","failover","get_hmac_SHA256","hash","$","getElementById","console","elements","el","getElementsByTagName","bind","etype","rapfun","event","cancelBubble","preventDefault","stopPropagation","addEventListener","attachEvent","attr","attribute","setAttribute","getAttribute","css","element","styles","style","create","createElement","XORIGN","FDomainRequest","ajax","script","finished","xhrtme","timer","done","appendChild","parentNode","removeChild","ASYNC","src","complete","async","abort","XDomainRequest","onabort","onloadend","onreadystatechange","readyState","eee","navigator","pubnubs","fdomainrequest","SWF","UA","userAgent","PNSDK","log","opera","postError","ls","cookieGet","cookie","RegExp","cookieSet","cookieTest","getItem","setItem","events","unbind","fire","PDIV","CREATE_PUBNUB","leave_on_unload","pnsdk","PN","prop","pdiv","notest","publish_key","subscribe_key","ssl","location","href","position","top","unescape","WS","protocols","bits","protocol","pubnub","wasClean","h","g","lib","q","Base","extend","mixIn","$super","clone","WordArray","words","sigBytes","d","clamp","ceil","enc","Hex","substr","Latin1","fromCharCode","j","Utf8","escape","BufferedBlockAlgorithm","reset","_data","_nDataBytes","_append","_process","blockSize","_minBufferSize","min","_doProcessBlock","splice","Hasher","cfg","_doReset","update","finalize","_doFinalize","_createHelper","_createHmacHelper","t","HMAC","algo","sqrt","pow","_hash","HmacSHA256","_hasher","_oKey","_iKey","Base64","_map","charAt","abs","sin","MD5","z","A","B","C","D","E","HmacMD5","EvpKDF","keySize","hasher","compute","Cipher","createEncryptor","_ENC_XFORM_MODE","createDecryptor","_DEC_XFORM_MODE","_xformMode","_key","ivSize","StreamCipher","_iv","_prevBlock","BlockCipherMode","Encryptor","Decryptor","_cipher","processBlock","encryptBlock","decryptBlock","CBC","pad","Pkcs7","unpad","BlockCipher","padding","_mode","CipherParams","formatter","format","OpenSSL","salt","SerializableCipher","algorithm","_parse","kdf","execute","PasswordBasedCipher","F","G","y","H","AES","_nRounds","_keySchedule","_invKeySchedule","_doCryptBlock","ECB","offset","storage","prefix","setPrefix","_storage","_prefix","defaultPrefix","_prefixKey","removeItem","clean","hasListeners","_listeners","_this","_this2","_len","some","_this3","_Utils","cacheId","_cacheId","_promise","isPaused","_releaseTimeout","pause","resume","_pollInterval","_inherits","subClass","superClass","setPrototypeOf","__proto__","_ApiResponse","_ApiResponse2","_Observable","beforeRequest","requestSuccess","requestError","sendRequest","apiResponse","regeneratorRuntime","context$2$0","prev","awrap","_loadResponse","_response","sent","_isMultipart","_isJson","_text","abrupt","t0","makeError","originalMessage","createRequest","_allowedMethods","query","findHeaderName","_jsonContentType","contentTypeHeaderName","_contentType","contentType","_urlencodedContentType","req","originalBody","createResponse","stringBody","utils","_decode","reduce","res","_request","_json","_multipart","skipOKCheck","error_description","description","multipart","boundary","_getContentType","parts","_boundarySeparator","pop","statusInfo","part","_isContentType","_multipartContentType","_isUrlEncoded","headersAndBody","_bodySeparator","headersText","_headerSeparator","_Registry","_Registry2","_HttpClient","_registry","registry","mock","find","getResponse","_Mock","_Mock2","_mocks","add","clear","apiCall","authentication","access_token","token_type","expires_in","refresh_token","refresh_token_expires_in","scope","expireTime","logout","presenceLoad","uri","extension","extensionNumber","activeCalls","presenceStatus","telephonyStatus","userStatus","dndStatus","extensionId","subscribeGeneric","expiresIn","date","eventFilters","expirationTime","toISOString","deliveryMode","transportType","encryption","address","subscriberKey","secretKey","creationTime","subscribeOnPresence","detailed","encryptionAlgorithm","encryptionKey","tokenRefresh","failure","_method","_path","_delay","_status","_statusText","_Auth","_Auth2","beforeLogin","loginSuccess","loginError","beforeRefresh","refreshSuccess","refreshError","beforeLogout","logoutSuccess","logoutError","_server","_appKey","_appSecret","_queue","_auth","createUrl","builtUrl","hasHttp","addServer","_urlPrefix","_apiVersion","addMethod","addToken","accessToken","authUrl","_authorizeEndpoint","response_type","redirect_uri","redirectUri","client_id","brand_id","brandId","display","prompt","parseAuthRedirectUrl","qs","loggedIn","_ensureAuthentication","login","remember","access_token_ttl","_accessTokenTtl","refresh_token_ttl","_refreshTokenTtlRemember","_refreshTokenTtl","grant_type","username","password","endpointId","endpoint_id","_tokenRequest","_tokenEndpoint","setData","setRemember","refresh","_isAccessTokenValid","_refreshDelayMs","refreshToken","refreshTokenValid","_clearCacheOnRefreshError","_revokeEndpoint","token","inflateRequest","skipAuthCheck","_authHeader","cancelAccessToken","put","Authorization","_apiKey","Content-Type","accessTokenValid","apiKey","btoa","Buffer","tokenType","newData","expire_time","refresh_token_expire_time","authData","forcedTokenType","refreshHandicapMs","forceAuthentication","_PubnubMockJs","_PubnubMockJs2","PubnubMock","receiveMessage","notification","removeSuccess","removeError","renewSuccess","renewError","subscribeSuccess","subscribeError","_timeout","_subscription","alive","_renewHandicapMs","setSubscription","subscription","_clearTimeout","_subscribeAtPubnub","_setTimeout","register","renew","addEventFilters","setEventFilters","_getFullEventFilters","remove","resubscribe","_decrypt","_notify","_extends","assign","_Subscription2","_Subscription3","CachedSubscription","_Subscription","_cacheKey","_renewQueue","_resubscribeQueue","queuedRenewSuccess","queuedRenewError","queuedResubscribeSuccess","queuedResubscribeError","actionCb","successEvent","errorEvent","errorMessage","cachedSubscriptionData","wrap","innerFn","outerFn","tryLocsList","generator","Generator","context","Context","_invoke","makeInvokeMethod","tryCatch","GeneratorFunction","GeneratorFunctionPrototype","defineIteratorMethods","AwaitArgument","AsyncIterator","invoke","invokeNext","invokeThrow","unwrapped","enqueue","callInvokeWithMethodAndArg","previousPromise","domain","GenStateSuspendedStart","GenStateExecuting","GenStateCompleted","doneResult","delegate","iterator","returnMethod","record","info","GenStateSuspendedYield","resultName","nextLoc","dispatchException","ContinueSentinel","pushTryEntry","locs","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","iterable","iteratorMethod","iteratorSymbol","isNaN","hasOwn","Symbol","inModule","runtime","Gp","displayName","isGeneratorFunction","genFun","ctor","mark","iter","skipTempReset","rootEntry","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","finish","thrown","delegateYield"],"mappings":"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","file":"ringcentral-bundle.min.js","sourcesContent":["(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[\"SDK\"] = factory();\n\telse\n\t\troot[\"RingCentral\"] = root[\"RingCentral\"] || {}, root[\"RingCentral\"][\"SDK\"] = factory();\n})(this, function() {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/","(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[\"SDK\"] = factory();\n\telse\n\t\troot[\"RingCentral\"] = root[\"RingCentral\"] || {}, root[\"RingCentral\"][\"SDK\"] = 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 = \"/build/\";\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\nmodule.exports = __webpack_require__(1);\n\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _coreUtils = __webpack_require__(2);\n\nvar Utils = _interopRequireWildcard(_coreUtils);\n\nvar _coreCache = __webpack_require__(11);\n\nvar _coreCache2 = _interopRequireDefault(_coreCache);\n\nvar _coreExternals = __webpack_require__(3);\n\nvar Externals = _interopRequireWildcard(_coreExternals);\n\nvar _coreObservable = __webpack_require__(12);\n\nvar _coreObservable2 = _interopRequireDefault(_coreObservable);\n\nvar _coreQueue = __webpack_require__(13);\n\nvar _coreQueue2 = _interopRequireDefault(_coreQueue);\n\nvar _httpClient = __webpack_require__(14);\n\nvar _httpClient2 = _interopRequireDefault(_httpClient);\n\nvar _httpApiResponse = __webpack_require__(16);\n\nvar _httpApiResponse2 = _interopRequireDefault(_httpApiResponse);\n\nvar _httpUtils = __webpack_require__(15);\n\nvar HttpUtils = _interopRequireWildcard(_httpUtils);\n\nvar _mocksClientMock = __webpack_require__(17);\n\nvar _mocksClientMock2 = _interopRequireDefault(_mocksClientMock);\n\nvar _mocksMock = __webpack_require__(19);\n\nvar _mocksMock2 = _interopRequireDefault(_mocksMock);\n\nvar _mocksRegistry = __webpack_require__(18);\n\nvar _mocksRegistry2 = _interopRequireDefault(_mocksRegistry);\n\nvar _platformPlatform = __webpack_require__(20);\n\nvar _platformPlatform2 = _interopRequireDefault(_platformPlatform);\n\nvar _platformAuth = __webpack_require__(21);\n\nvar _platformAuth2 = _interopRequireDefault(_platformAuth);\n\nvar _pubnubPubnubFactory = __webpack_require__(22);\n\nvar _pubnubPubnubFactory2 = _interopRequireDefault(_pubnubPubnubFactory);\n\nvar _subscriptionSubscription = __webpack_require__(24);\n\nvar _subscriptionSubscription2 = _interopRequireDefault(_subscriptionSubscription);\n\nvar _subscriptionCachedSubscription = __webpack_require__(25);\n\nvar _subscriptionCachedSubscription2 = _interopRequireDefault(_subscriptionCachedSubscription);\n\n__webpack_require__(26);\n\nvar SDK = (function () {\n _createClass(SDK, null, [{\n key: 'version',\n value: '2.0.0',\n enumerable: true\n }, {\n key: 'server',\n value: {\n sandbox: 'https://platform.devtest.ringcentral.com',\n production: 'https://platform.ringcentral.com'\n },\n\n /**\n * @constructor\n * @param {object} [options]\n * @param {string} [options.server]\n * @param {string} [options.cachePrefix]\n * @param {string} [options.appSecret]\n * @param {string} [options.appKey]\n * @param {string} [options.appName]\n * @param {string} [options.appVersion]\n * @param {string} [options.pubnubFactory]\n * @param {string} [options.client]\n */\n enumerable: true\n }]);\n\n function SDK(options) {\n _classCallCheck(this, SDK);\n\n options = options || {};\n\n this._cache = new _coreCache2['default'](Externals.localStorage, options.cachePrefix);\n\n this._client = options.client || new _httpClient2['default']();\n\n this._platform = new _platformPlatform2['default'](this._client, this._cache, options.server, options.appKey, options.appSecret);\n\n this._pubnubFactory = options.pubnubFactory || Externals.PUBNUB;\n }\n\n /**\n * @return {Platform}\n */\n\n SDK.prototype.platform = function platform() {\n return this._platform;\n };\n\n /**\n * @return {Subscription}\n */\n\n SDK.prototype.createSubscription = function createSubscription() {\n return new _subscriptionSubscription2['default'](this._pubnubFactory, this._platform);\n };\n\n /**\n * @return {CachedSubscription}\n */\n\n SDK.prototype.createCachedSubscription = function createCachedSubscription(cacheKey) {\n return new _subscriptionCachedSubscription2['default'](this._pubnubFactory, this._platform, this._cache, cacheKey);\n };\n\n /**\n * @return {Cache}\n */\n\n SDK.prototype.cache = function cache() {\n return this._cache;\n };\n\n _createClass(SDK, null, [{\n key: 'core',\n value: {\n Cache: _coreCache2['default'],\n Observable: _coreObservable2['default'],\n Utils: Utils,\n Externals: Externals,\n Queue: _coreQueue2['default']\n },\n enumerable: true\n }, {\n key: 'http',\n value: {\n Client: _httpClient2['default'],\n ApiResponse: _httpApiResponse2['default'],\n Utils: HttpUtils\n },\n enumerable: true\n }, {\n key: 'platform',\n value: {\n Auth: _platformAuth2['default'],\n Platform: _platformPlatform2['default']\n },\n enumerable: true\n }, {\n key: 'subscription',\n value: {\n Subscription: _subscriptionSubscription2['default']\n },\n enumerable: true\n }, {\n key: 'mocks',\n value: {\n Client: _mocksClientMock2['default'],\n Registry: _mocksRegistry2['default'],\n Mock: _mocksMock2['default']\n },\n enumerable: true\n }, {\n key: 'pubnub',\n value: {\n PubnubMockFactory: _pubnubPubnubFactory2['default']\n },\n enumerable: true\n }]);\n\n return SDK;\n})();\n\nexports['default'] = SDK;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\nexports.queryStringify = queryStringify;\nexports.parseQueryString = parseQueryString;\nexports.isFunction = isFunction;\nexports.isArray = isArray;\nexports.poll = poll;\nexports.stopPolling = stopPolling;\nexports.isNodeJS = isNodeJS;\nexports.isBrowser = isBrowser;\nexports.delay = delay;\n\nvar _ExternalsJs = __webpack_require__(3);\n\n/**\n * TODO Replace with something better\n * @see https://github.com/joyent/node/blob/master/lib/querystring.js\n * @param {object} parameters\n * @returns {string}\n */\n\nfunction queryStringify(parameters) {\n\n var array = [];\n\n parameters = parameters || {};\n\n Object.keys(parameters).forEach(function (k) {\n\n var v = parameters[k];\n\n if (isArray(v)) {\n v.forEach(function (vv) {\n array.push(encodeURIComponent(k) + '=' + encodeURIComponent(vv));\n });\n } else {\n array.push(encodeURIComponent(k) + '=' + encodeURIComponent(v));\n }\n });\n\n return array.join('&');\n}\n\n/**\n * TODO Replace with something better\n * @see https://github.com/joyent/node/blob/master/lib/querystring.js\n * @param {string} queryString\n * @returns {object}\n */\n\nfunction parseQueryString(queryString) {\n\n var argsParsed = {};\n\n queryString.split('&').forEach(function (arg) {\n\n arg = decodeURIComponent(arg);\n\n if (arg.indexOf('=') == -1) {\n\n argsParsed[arg.trim()] = true;\n } else {\n\n var pair = arg.split('='),\n key = pair[0].trim(),\n value = pair[1].trim();\n\n if (key in argsParsed) {\n if (key in argsParsed && !isArray(argsParsed[key])) argsParsed[key] = [argsParsed[key]];\n argsParsed[key].push(value);\n } else {\n argsParsed[key] = value;\n }\n }\n });\n\n return argsParsed;\n}\n\n/**\n * @param obj\n * @return {boolean}\n */\n\nfunction isFunction(obj) {\n return typeof obj === \"function\";\n}\n\n/**\n * @param obj\n * @return {boolean}\n */\n\nfunction isArray(obj) {\n return Array.isArray ? Array.isArray(obj) : typeof obj === \"array\";\n}\n\n/**\n * @param fn\n * @param interval\n * @param timeout\n */\n\nfunction poll(fn, interval, timeout) {\n //NodeJS.Timer|number\n\n module.exports.stopPolling(timeout);\n\n interval = interval || 1000;\n\n var next = function next(delay) {\n\n delay = delay || interval;\n\n interval = delay;\n\n return setTimeout(function () {\n\n fn(next, delay);\n }, delay);\n };\n\n return next();\n}\n\nfunction stopPolling(timeout) {\n if (timeout) clearTimeout(timeout);\n}\n\nfunction isNodeJS() {\n return typeof process !== 'undefined';\n}\n\nfunction isBrowser() {\n return typeof window !== 'undefined';\n}\n\nfunction delay(timeout) {\n return new _ExternalsJs.Promise(function (resolve, reject) {\n setTimeout(function () {\n resolve(null);\n }, timeout);\n });\n}\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _es6Promise = __webpack_require__(4);\n\nvar _es6Promise2 = _interopRequireDefault(_es6Promise);\n\nvar _nodeFetch = __webpack_require__(9);\n\nvar _nodeFetch2 = _interopRequireDefault(_nodeFetch);\n\nvar _pubnub = __webpack_require__(10);\n\nvar _pubnub2 = _interopRequireDefault(_pubnub);\n\nvar root = new Function('return this')();\n\nvar Promise = _es6Promise2['default'] && _es6Promise2['default'].Promise || root.Promise;\n\nexports.Promise = Promise;\nvar fetch = root.fetch || _nodeFetch2['default'];\nexports.fetch = fetch;\nvar Request = root.Request || fetch.Request;\nexports.Request = Request;\nvar Response = root.Response || fetch.Response;\nexports.Response = Response;\nvar Headers = root.Headers || fetch.Headers;\n\nexports.Headers = Headers;\nvar PUBNUB = root.PUBNUB || _pubnub2['default'];\n\nexports.PUBNUB = PUBNUB;\nvar localStorage = typeof root.localStorage !== 'undefined' ? root.localStorage : {};\nexports.localStorage = localStorage;\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\nvar require;var __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(setImmediate, global, module) {/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license Licensed under MIT license\n * See https://raw.githubusercontent.com/jakearchibald/es6-promise/master/LICENSE\n * @version 2.2.0\n */\n\n(function() {\n \"use strict\";\n function lib$es6$promise$utils$$objectOrFunction(x) {\n return typeof x === 'function' || (typeof x === 'object' && x !== null);\n }\n\n function lib$es6$promise$utils$$isFunction(x) {\n return typeof x === 'function';\n }\n\n function lib$es6$promise$utils$$isMaybeThenable(x) {\n return typeof x === 'object' && x !== null;\n }\n\n var lib$es6$promise$utils$$_isArray;\n if (!Array.isArray) {\n lib$es6$promise$utils$$_isArray = function (x) {\n return Object.prototype.toString.call(x) === '[object Array]';\n };\n } else {\n lib$es6$promise$utils$$_isArray = Array.isArray;\n }\n\n var lib$es6$promise$utils$$isArray = lib$es6$promise$utils$$_isArray;\n var lib$es6$promise$asap$$len = 0;\n var lib$es6$promise$asap$$toString = {}.toString;\n var lib$es6$promise$asap$$vertxNext;\n var lib$es6$promise$asap$$customSchedulerFn;\n\n function lib$es6$promise$asap$$asap(callback, arg) {\n lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len] = callback;\n lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len + 1] = arg;\n lib$es6$promise$asap$$len += 2;\n if (lib$es6$promise$asap$$len === 2) {\n // If len is 2, 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 if (lib$es6$promise$asap$$customSchedulerFn) {\n lib$es6$promise$asap$$customSchedulerFn(lib$es6$promise$asap$$flush);\n } else {\n lib$es6$promise$asap$$scheduleFlush();\n }\n }\n }\n\n var lib$es6$promise$asap$$default = lib$es6$promise$asap$$asap;\n function lib$es6$promise$asap$$setScheduler(scheduleFn) {\n lib$es6$promise$asap$$customSchedulerFn = scheduleFn;\n }\n\n var lib$es6$promise$asap$$browserWindow = (typeof window !== 'undefined') ? window : undefined;\n var lib$es6$promise$asap$$browserGlobal = lib$es6$promise$asap$$browserWindow || {};\n var lib$es6$promise$asap$$BrowserMutationObserver = lib$es6$promise$asap$$browserGlobal.MutationObserver || lib$es6$promise$asap$$browserGlobal.WebKitMutationObserver;\n var lib$es6$promise$asap$$isNode = typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n // test for web worker but not in IE10\n var lib$es6$promise$asap$$isWorker = typeof Uint8ClampedArray !== 'undefined' &&\n typeof importScripts !== 'undefined' &&\n typeof MessageChannel !== 'undefined';\n\n // node\n function lib$es6$promise$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$es6$promise$asap$$flush);\n };\n }\n\n // vertx\n function lib$es6$promise$asap$$useVertxTimer() {\n return function() {\n lib$es6$promise$asap$$vertxNext(lib$es6$promise$asap$$flush);\n };\n }\n\n function lib$es6$promise$asap$$useMutationObserver() {\n var iterations = 0;\n var observer = new lib$es6$promise$asap$$BrowserMutationObserver(lib$es6$promise$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$es6$promise$asap$$useMessageChannel() {\n var channel = new MessageChannel();\n channel.port1.onmessage = lib$es6$promise$asap$$flush;\n return function () {\n channel.port2.postMessage(0);\n };\n }\n\n function lib$es6$promise$asap$$useSetTimeout() {\n return function() {\n setTimeout(lib$es6$promise$asap$$flush, 1);\n };\n }\n\n var lib$es6$promise$asap$$queue = new Array(1000);\n function lib$es6$promise$asap$$flush() {\n for (var i = 0; i < lib$es6$promise$asap$$len; i+=2) {\n var callback = lib$es6$promise$asap$$queue[i];\n var arg = lib$es6$promise$asap$$queue[i+1];\n\n callback(arg);\n\n lib$es6$promise$asap$$queue[i] = undefined;\n lib$es6$promise$asap$$queue[i+1] = undefined;\n }\n\n lib$es6$promise$asap$$len = 0;\n }\n\n function lib$es6$promise$asap$$attemptVertex() {\n try {\n var r = require;\n var vertx = __webpack_require__(!(function webpackMissingModule() { var e = new Error(\"Cannot find module \\\"vertx\\\"\"); e.code = 'MODULE_NOT_FOUND'; throw e; }()));\n lib$es6$promise$asap$$vertxNext = vertx.runOnLoop || vertx.runOnContext;\n return lib$es6$promise$asap$$useVertxTimer();\n } catch(e) {\n return lib$es6$promise$asap$$useSetTimeout();\n }\n }\n\n var lib$es6$promise$asap$$scheduleFlush;\n // Decide what async method to use to triggering processing of queued callbacks:\n if (lib$es6$promise$asap$$isNode) {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useNextTick();\n } else if (lib$es6$promise$asap$$BrowserMutationObserver) {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMutationObserver();\n } else if (lib$es6$promise$asap$$isWorker) {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMessageChannel();\n } else if (lib$es6$promise$asap$$browserWindow === undefined && \"function\" === 'function') {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$attemptVertex();\n } else {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useSetTimeout();\n }\n\n function lib$es6$promise$$internal$$noop() {}\n\n var lib$es6$promise$$internal$$PENDING = void 0;\n var lib$es6$promise$$internal$$FULFILLED = 1;\n var lib$es6$promise$$internal$$REJECTED = 2;\n\n var lib$es6$promise$$internal$$GET_THEN_ERROR = new lib$es6$promise$$internal$$ErrorObject();\n\n function lib$es6$promise$$internal$$selfFullfillment() {\n return new TypeError(\"You cannot resolve a promise with itself\");\n }\n\n function lib$es6$promise$$internal$$cannotReturnOwn() {\n return new TypeError('A promises callback cannot return that same promise.');\n }\n\n function lib$es6$promise$$internal$$getThen(promise) {\n try {\n return promise.then;\n } catch(error) {\n lib$es6$promise$$internal$$GET_THEN_ERROR.error = error;\n return lib$es6$promise$$internal$$GET_THEN_ERROR;\n }\n }\n\n function lib$es6$promise$$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$es6$promise$$internal$$handleForeignThenable(promise, thenable, then) {\n lib$es6$promise$asap$$default(function(promise) {\n var sealed = false;\n var error = lib$es6$promise$$internal$$tryThen(then, thenable, function(value) {\n if (sealed) { return; }\n sealed = true;\n if (thenable !== value) {\n lib$es6$promise$$internal$$resolve(promise, value);\n } else {\n lib$es6$promise$$internal$$fulfill(promise, value);\n }\n }, function(reason) {\n if (sealed) { return; }\n sealed = true;\n\n lib$es6$promise$$internal$$reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && error) {\n sealed = true;\n lib$es6$promise$$internal$$reject(promise, error);\n }\n }, promise);\n }\n\n function lib$es6$promise$$internal$$handleOwnThenable(promise, thenable) {\n if (thenable._state === lib$es6$promise$$internal$$FULFILLED) {\n lib$es6$promise$$internal$$fulfill(promise, thenable._result);\n } else if (thenable._state === lib$es6$promise$$internal$$REJECTED) {\n lib$es6$promise$$internal$$reject(promise, thenable._result);\n } else {\n lib$es6$promise$$internal$$subscribe(thenable, undefined, function(value) {\n lib$es6$promise$$internal$$resolve(promise, value);\n }, function(reason) {\n lib$es6$promise$$internal$$reject(promise, reason);\n });\n }\n }\n\n function lib$es6$promise$$internal$$handleMaybeThenable(promise, maybeThenable) {\n if (maybeThenable.constructor === promise.constructor) {\n lib$es6$promise$$internal$$handleOwnThenable(promise, maybeThenable);\n } else {\n var then = lib$es6$promise$$internal$$getThen(maybeThenable);\n\n if (then === lib$es6$promise$$internal$$GET_THEN_ERROR) {\n lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$GET_THEN_ERROR.error);\n } else if (then === undefined) {\n lib$es6$promise$$internal$$fulfill(promise, maybeThenable);\n } else if (lib$es6$promise$utils$$isFunction(then)) {\n lib$es6$promise$$internal$$handleForeignThenable(promise, maybeThenable, then);\n } else {\n lib$es6$promise$$internal$$fulfill(promise, maybeThenable);\n }\n }\n }\n\n function lib$es6$promise$$internal$$resolve(promise, value) {\n if (promise === value) {\n lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$selfFullfillment());\n } else if (lib$es6$promise$utils$$objectOrFunction(value)) {\n lib$es6$promise$$internal$$handleMaybeThenable(promise, value);\n } else {\n lib$es6$promise$$internal$$fulfill(promise, value);\n }\n }\n\n function lib$es6$promise$$internal$$publishRejection(promise) {\n if (promise._onerror) {\n promise._onerror(promise._result);\n }\n\n lib$es6$promise$$internal$$publish(promise);\n }\n\n function lib$es6$promise$$internal$$fulfill(promise, value) {\n if (promise._state !== lib$es6$promise$$internal$$PENDING) { return; }\n\n promise._result = value;\n promise._state = lib$es6$promise$$internal$$FULFILLED;\n\n if (promise._subscribers.length !== 0) {\n lib$es6$promise$asap$$default(lib$es6$promise$$internal$$publish, promise);\n }\n }\n\n function lib$es6$promise$$internal$$reject(promise, reason) {\n if (promise._state !== lib$es6$promise$$internal$$PENDING) { return; }\n promise._state = lib$es6$promise$$internal$$REJECTED;\n promise._result = reason;\n\n lib$es6$promise$asap$$default(lib$es6$promise$$internal$$publishRejection, promise);\n }\n\n function lib$es6$promise$$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$es6$promise$$internal$$FULFILLED] = onFulfillment;\n subscribers[length + lib$es6$promise$$internal$$REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n lib$es6$promise$asap$$default(lib$es6$promise$$internal$$publish, parent);\n }\n }\n\n function lib$es6$promise$$internal$$publish(promise) {\n var subscribers = promise._subscribers;\n var settled = promise._state;\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$es6$promise$$internal$$invokeCallback(settled, child, callback, detail);\n } else {\n callback(detail);\n }\n }\n\n promise._subscribers.length = 0;\n }\n\n function lib$es6$promise$$internal$$ErrorObject() {\n this.error = null;\n }\n\n var lib$es6$promise$$internal$$TRY_CATCH_ERROR = new lib$es6$promise$$internal$$ErrorObject();\n\n function lib$es6$promise$$internal$$tryCatch(callback, detail) {\n try {\n return callback(detail);\n } catch(e) {\n lib$es6$promise$$internal$$TRY_CATCH_ERROR.error = e;\n return lib$es6$promise$$internal$$TRY_CATCH_ERROR;\n }\n }\n\n function lib$es6$promise$$internal$$invokeCallback(settled, promise, callback, detail) {\n var hasCallback = lib$es6$promise$utils$$isFunction(callback),\n value, error, succeeded, failed;\n\n if (hasCallback) {\n value = lib$es6$promise$$internal$$tryCatch(callback, detail);\n\n if (value === lib$es6$promise$$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$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$cannotReturnOwn());\n return;\n }\n\n } else {\n value = detail;\n succeeded = true;\n }\n\n if (promise._state !== lib$es6$promise$$internal$$PENDING) {\n // noop\n } else if (hasCallback && succeeded) {\n lib$es6$promise$$internal$$resolve(promise, value);\n } else if (failed) {\n lib$es6$promise$$internal$$reject(promise, error);\n } else if (settled === lib$es6$promise$$internal$$FULFILLED) {\n lib$es6$promise$$internal$$fulfill(promise, value);\n } else if (settled === lib$es6$promise$$internal$$REJECTED) {\n lib$es6$promise$$internal$$reject(promise, value);\n }\n }\n\n function lib$es6$promise$$internal$$initializePromise(promise, resolver) {\n try {\n resolver(function resolvePromise(value){\n lib$es6$promise$$internal$$resolve(promise, value);\n }, function rejectPromise(reason) {\n lib$es6$promise$$internal$$reject(promise, reason);\n });\n } catch(e) {\n lib$es6$promise$$internal$$reject(promise, e);\n }\n }\n\n function lib$es6$promise$enumerator$$Enumerator(Constructor, input) {\n var enumerator = this;\n\n enumerator._instanceConstructor = Constructor;\n enumerator.promise = new Constructor(lib$es6$promise$$internal$$noop);\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$es6$promise$$internal$$fulfill(enumerator.promise, enumerator._result);\n } else {\n enumerator.length = enumerator.length || 0;\n enumerator._enumerate();\n if (enumerator._remaining === 0) {\n lib$es6$promise$$internal$$fulfill(enumerator.promise, enumerator._result);\n }\n }\n } else {\n lib$es6$promise$$internal$$reject(enumerator.promise, enumerator._validationError());\n }\n }\n\n lib$es6$promise$enumerator$$Enumerator.prototype._validateInput = function(input) {\n return lib$es6$promise$utils$$isArray(input);\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._validationError = function() {\n return new Error('Array Methods must be provided an Array');\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._init = function() {\n this._result = new Array(this.length);\n };\n\n var lib$es6$promise$enumerator$$default = lib$es6$promise$enumerator$$Enumerator;\n\n lib$es6$promise$enumerator$$Enumerator.prototype._enumerate = function() {\n var enumerator = this;\n\n var length = enumerator.length;\n var promise = enumerator.promise;\n var input = enumerator._input;\n\n for (var i = 0; promise._state === lib$es6$promise$$internal$$PENDING && i < length; i++) {\n enumerator._eachEntry(input[i], i);\n }\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._eachEntry = function(entry, i) {\n var enumerator = this;\n var c = enumerator._instanceConstructor;\n\n if (lib$es6$promise$utils$$isMaybeThenable(entry)) {\n if (entry.constructor === c && entry._state !== lib$es6$promise$$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] = entry;\n }\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._settledAt = function(state, i, value) {\n var enumerator = this;\n var promise = enumerator.promise;\n\n if (promise._state === lib$es6$promise$$internal$$PENDING) {\n enumerator._remaining--;\n\n if (state === lib$es6$promise$$internal$$REJECTED) {\n lib$es6$promise$$internal$$reject(promise, value);\n } else {\n enumerator._result[i] = value;\n }\n }\n\n if (enumerator._remaining === 0) {\n lib$es6$promise$$internal$$fulfill(promise, enumerator._result);\n }\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._willSettleAt = function(promise, i) {\n var enumerator = this;\n\n lib$es6$promise$$internal$$subscribe(promise, undefined, function(value) {\n enumerator._settledAt(lib$es6$promise$$internal$$FULFILLED, i, value);\n }, function(reason) {\n enumerator._settledAt(lib$es6$promise$$internal$$REJECTED, i, reason);\n });\n };\n function lib$es6$promise$promise$all$$all(entries) {\n return new lib$es6$promise$enumerator$$default(this, entries).promise;\n }\n var lib$es6$promise$promise$all$$default = lib$es6$promise$promise$all$$all;\n function lib$es6$promise$promise$race$$race(entries) {\n /*jshint validthis:true */\n var Constructor = this;\n\n var promise = new Constructor(lib$es6$promise$$internal$$noop);\n\n if (!lib$es6$promise$utils$$isArray(entries)) {\n lib$es6$promise$$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$es6$promise$$internal$$resolve(promise, value);\n }\n\n function onRejection(reason) {\n lib$es6$promise$$internal$$reject(promise, reason);\n }\n\n for (var i = 0; promise._state === lib$es6$promise$$internal$$PENDING && i < length; i++) {\n lib$es6$promise$$internal$$subscribe(Constructor.resolve(entries[i]), undefined, onFulfillment, onRejection);\n }\n\n return promise;\n }\n var lib$es6$promise$promise$race$$default = lib$es6$promise$promise$race$$race;\n function lib$es6$promise$promise$resolve$$resolve(object) {\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$es6$promise$$internal$$noop);\n lib$es6$promise$$internal$$resolve(promise, object);\n return promise;\n }\n var lib$es6$promise$promise$resolve$$default = lib$es6$promise$promise$resolve$$resolve;\n function lib$es6$promise$promise$reject$$reject(reason) {\n /*jshint validthis:true */\n var Constructor = this;\n var promise = new Constructor(lib$es6$promise$$internal$$noop);\n lib$es6$promise$$internal$$reject(promise, reason);\n return promise;\n }\n var lib$es6$promise$promise$reject$$default = lib$es6$promise$promise$reject$$reject;\n\n var lib$es6$promise$promise$$counter = 0;\n\n function lib$es6$promise$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$es6$promise$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 var lib$es6$promise$promise$$default = lib$es6$promise$promise$$Promise;\n /**\n Promise objects represent the eventual result of an asynchronous operation. The\n primary way of interacting with a promise is through its `then` method, which\n registers callbacks to receive either a promise’s eventual value or the reason\n why the promise cannot be fulfilled.\n\n Terminology\n -----------\n\n - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n - `thenable` is an object or function that defines a `then` method.\n - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n - `exception` is a value that is thrown using the throw statement.\n - `reason` is a value that indicates why a promise was rejected.\n - `settled` the final resting state of a promise, fulfilled or rejected.\n\n A promise can be in one of three states: pending, fulfilled, or rejected.\n\n Promises that are fulfilled have a fulfillment value and are in the fulfilled\n state. Promises that are rejected have a rejection reason and are in the\n rejected state. A fulfillment value is never a thenable.\n\n Promises can also be said to *resolve* a value. If this value is also a\n promise, then the original promise's settled state will match the value's\n settled state. So a promise that *resolves* a promise that rejects will\n itself reject, and a promise that *resolves* a promise that fulfills will\n itself fulfill.\n\n\n Basic Usage:\n ------------\n\n ```js\n var promise = new Promise(function(resolve, reject) {\n // on success\n resolve(value);\n\n // on failure\n reject(reason);\n });\n\n promise.then(function(value) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Advanced Usage:\n ---------------\n\n Promises shine when abstracting away asynchronous interactions such as\n `XMLHttpRequest`s.\n\n ```js\n function getJSON(url) {\n return new Promise(function(resolve, reject){\n var xhr = new XMLHttpRequest();\n\n xhr.open('GET', url);\n xhr.onreadystatechange = handler;\n xhr.responseType = 'json';\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send();\n\n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200) {\n resolve(this.response);\n } else {\n reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n }\n }\n };\n });\n }\n\n getJSON('/posts.json').then(function(json) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Unlike callbacks, promises are great composable primitives.\n\n ```js\n Promise.all([\n getJSON('/posts'),\n getJSON('/comments')\n ]).then(function(values){\n values[0] // => postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class Promise\n @param {function} resolver\n Useful for tooling.\n @constructor\n */\n function lib$es6$promise$promise$$Promise(resolver) {\n this._id = lib$es6$promise$promise$$counter++;\n this._state = undefined;\n this._result = undefined;\n this._subscribers = [];\n\n if (lib$es6$promise$$internal$$noop !== resolver) {\n if (!lib$es6$promise$utils$$isFunction(resolver)) {\n lib$es6$promise$promise$$needsResolver();\n }\n\n if (!(this instanceof lib$es6$promise$promise$$Promise)) {\n lib$es6$promise$promise$$needsNew();\n }\n\n lib$es6$promise$$internal$$initializePromise(this, resolver);\n }\n }\n\n lib$es6$promise$promise$$Promise.all = lib$es6$promise$promise$all$$default;\n lib$es6$promise$promise$$Promise.race = lib$es6$promise$promise$race$$default;\n lib$es6$promise$promise$$Promise.resolve = lib$es6$promise$promise$resolve$$default;\n lib$es6$promise$promise$$Promise.reject = lib$es6$promise$promise$reject$$default;\n lib$es6$promise$promise$$Promise._setScheduler = lib$es6$promise$asap$$setScheduler;\n lib$es6$promise$promise$$Promise._asap = lib$es6$promise$asap$$default;\n\n lib$es6$promise$promise$$Promise.prototype = {\n constructor: lib$es6$promise$promise$$Promise,\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 Useful for tooling.\n @return {Promise}\n */\n then: function(onFulfillment, onRejection) {\n var parent = this;\n var state = parent._state;\n\n if (state === lib$es6$promise$$internal$$FULFILLED && !onFulfillment || state === lib$es6$promise$$internal$$REJECTED && !onRejection) {\n return this;\n }\n\n var child = new this.constructor(lib$es6$promise$$internal$$noop);\n var result = parent._result;\n\n if (state) {\n var callback = arguments[state - 1];\n lib$es6$promise$asap$$default(function(){\n lib$es6$promise$$internal$$invokeCallback(state, child, callback, result);\n });\n } else {\n lib$es6$promise$$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 Useful for tooling.\n @return {Promise}\n */\n 'catch': function(onRejection) {\n return this.then(null, onRejection);\n }\n };\n function lib$es6$promise$polyfill$$polyfill() {\n var local;\n\n if (typeof global !== 'undefined') {\n local = global;\n } else if (typeof self !== 'undefined') {\n local = self;\n } else {\n try {\n local = Function('return this')();\n } catch (e) {\n throw new Error('polyfill failed because global object is unavailable in this environment');\n }\n }\n\n var P = local.Promise;\n\n if (P && Object.prototype.toString.call(P.resolve()) === '[object Promise]' && !P.cast) {\n return;\n }\n\n local.Promise = lib$es6$promise$promise$$default;\n }\n var lib$es6$promise$polyfill$$default = lib$es6$promise$polyfill$$polyfill;\n\n var lib$es6$promise$umd$$ES6Promise = {\n 'Promise': lib$es6$promise$promise$$default,\n 'polyfill': lib$es6$promise$polyfill$$default\n };\n\n /* global define:true module:true window: true */\n if (\"function\" === 'function' && __webpack_require__(8)['amd']) {\n !(__WEBPACK_AMD_DEFINE_RESULT__ = function() { return lib$es6$promise$umd$$ES6Promise; }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else if (typeof module !== 'undefined' && module['exports']) {\n module['exports'] = lib$es6$promise$umd$$ES6Promise;\n } else if (typeof this !== 'undefined') {\n this['ES6Promise'] = lib$es6$promise$umd$$ES6Promise;\n }\n\n lib$es6$promise$polyfill$$default();\n}).call(this);\n\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(5).setImmediate, (function() { return this; }()), __webpack_require__(7)(module)))\n\n/***/ },\n/* 5 */\n/***/ function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(setImmediate, clearImmediate) {var nextTick = __webpack_require__(6).nextTick;\nvar apply = Function.prototype.apply;\nvar slice = Array.prototype.slice;\nvar immediateIds = {};\nvar nextImmediateId = 0;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n return new Timeout(apply.call(setInterval, window, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) { timeout.close(); };\n\nfunction Timeout(id, clearFn) {\n this._id = id;\n this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n this._clearFn.call(window, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n clearTimeout(item._idleTimeoutId);\n\n var msecs = item._idleTimeout;\n if (msecs >= 0) {\n item._idleTimeoutId = setTimeout(function onTimeout() {\n if (item._onTimeout)\n item._onTimeout();\n }, msecs);\n }\n};\n\n// That's not how node.js implements it but the exposed api is the same.\nexports.setImmediate = typeof setImmediate === \"function\" ? setImmediate : function(fn) {\n var id = nextImmediateId++;\n var args = arguments.length < 2 ? false : slice.call(arguments, 1);\n\n immediateIds[id] = true;\n\n nextTick(function onNextTick() {\n if (immediateIds[id]) {\n // fn.call() is faster so we optimize for the common use-case\n // @see http://jsperf.com/call-apply-segu\n if (args) {\n fn.apply(null, args);\n } else {\n fn.call(null);\n }\n // Prevent ids from leaking\n exports.clearImmediate(id);\n }\n });\n\n return id;\n};\n\nexports.clearImmediate = typeof clearImmediate === \"function\" ? clearImmediate : function(id) {\n delete immediateIds[id];\n};\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(5).setImmediate, __webpack_require__(5).clearImmediate))\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n// shim for using process in browser\n\nvar process = module.exports = {};\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = setTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n clearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n setTimeout(drainQueue, 0);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n/***/ },\n/* 7 */\n/***/ function(module, exports) {\n\nmodule.exports = function(module) {\r\n\tif(!module.webpackPolyfill) {\r\n\t\tmodule.deprecate = function() {};\r\n\t\tmodule.paths = [];\r\n\t\t// module.parent = undefined by default\r\n\t\tmodule.children = [];\r\n\t\tmodule.webpackPolyfill = 1;\r\n\t}\r\n\treturn module;\r\n}\r\n\n\n/***/ },\n/* 8 */\n/***/ function(module, exports) {\n\nmodule.exports = function() { throw new Error(\"define cannot be used indirect\"); };\r\n\n\n/***/ },\n/* 9 */\n/***/ function(module, exports) {\n\n(function() {\n 'use strict';\n\n if (self.fetch) {\n return\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n }\n\n function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var list = this.map[name]\n if (!list) {\n list = []\n this.map[name] = list\n }\n list.push(value)\n }\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n }\n\n Headers.prototype.get = function(name) {\n var values = this.map[normalizeName(name)]\n return values ? values[0] : null\n }\n\n Headers.prototype.getAll = function(name) {\n return this.map[normalizeName(name)] || []\n }\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n }\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = [normalizeValue(value)]\n }\n\n Headers.prototype.forEach = function(callback, thisArg) {\n Object.getOwnPropertyNames(this.map).forEach(function(name) {\n this.map[name].forEach(function(value) {\n callback.call(thisArg, value, name, this)\n }, this)\n }, this)\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n reader.readAsArrayBuffer(blob)\n return fileReaderReady(reader)\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader()\n reader.readAsText(blob)\n return fileReaderReady(reader)\n }\n\n var support = {\n blob: 'FileReader' in self && 'Blob' in self && (function() {\n try {\n new Blob();\n return true\n } catch(e) {\n return false\n }\n })(),\n formData: 'FormData' in self\n }\n\n function Body() {\n this.bodyUsed = false\n\n\n this._initBody = function(body) {\n this._bodyInit = body\n if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (!body) {\n this._bodyText = ''\n } else {\n throw new Error('unsupported BodyInit type')\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n } else {\n this.text = function() {\n var rejected = consumed(this)\n return rejected ? rejected : Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return (methods.indexOf(upcased) > -1) ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {}\n var body = options.body\n if (Request.prototype.isPrototypeOf(input)) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n if (!body) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n } else {\n this.url = input\n }\n\n this.credentials = options.credentials || this.credentials || 'omit'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n }\n\n function decode(body) {\n var form = new FormData()\n body.trim().split('&').forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n }\n\n function headers(xhr) {\n var head = new Headers()\n var pairs = xhr.getAllResponseHeaders().trim().split('\\n')\n pairs.forEach(function(header) {\n var split = header.trim().split(':')\n var key = split.shift().trim()\n var value = split.join(':').trim()\n head.append(key, value)\n })\n return head\n }\n\n Body.call(Request.prototype)\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {}\n }\n\n this._initBody(bodyInit)\n this.type = 'default'\n this.url = null\n this.status = options.status\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = options.statusText\n this.headers = options.headers instanceof Headers ? options.headers : new Headers(options.headers)\n this.url = options.url || ''\n }\n\n Body.call(Response.prototype)\n\n self.Headers = Headers;\n self.Request = Request;\n self.Response = Response;\n\n self.fetch = function(input, init) {\n var request\n if (Request.prototype.isPrototypeOf(input) && !init) {\n request = input\n } else {\n request = new Request(input, init)\n }\n\n return new Promise(function(resolve, reject) {\n var xhr = new XMLHttpRequest()\n\n function responseURL() {\n if ('responseURL' in xhr) {\n return xhr.responseURL\n }\n\n // Avoid security warnings on getResponseHeader when not allowed by CORS\n if (/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())) {\n return xhr.getResponseHeader('X-Request-URL')\n }\n\n return;\n }\n\n xhr.onload = function() {\n var status = (xhr.status === 1223) ? 204 : xhr.status\n if (status < 100 || status > 599) {\n reject(new TypeError('Network request failed'))\n return\n }\n var options = {\n status: status,\n statusText: xhr.statusText,\n headers: headers(xhr),\n url: responseURL()\n }\n var body = 'response' in xhr ? xhr.response : xhr.responseText;\n resolve(new Response(body, options))\n }\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.open(request.method, request.url, true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob'\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n }\n self.fetch.polyfill = true\n})();\n\n\n/***/ },\n/* 10 */\n/***/ function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(module) {// Version: 3.7.14\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n/* =-========================= JSON =============================-= */\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n\n(window['JSON'] && window['JSON']['stringify']) || (function () {\n window['JSON'] || (window['JSON'] = {});\n\n function toJSON(key) {\n try { return this.valueOf() }\n catch(e) { return null }\n }\n\n var cx = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n escapable = /[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n gap,\n indent,\n meta = { // table of character substitutions\n '\\b': '\\\\b',\n '\\t': '\\\\t',\n '\\n': '\\\\n',\n '\\f': '\\\\f',\n '\\r': '\\\\r',\n '\"' : '\\\\\"',\n '\\\\': '\\\\\\\\'\n },\n rep;\n\n function quote(string) {\n escapable.lastIndex = 0;\n return escapable.test(string) ?\n '\"' + string.replace(escapable, function (a) {\n var c = meta[a];\n return typeof c === 'string' ? c :\n '\\\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n }) + '\"' :\n '\"' + string + '\"';\n }\n\n function str(key, holder) {\n var i, // The loop counter.\n k, // The member key.\n v, // The member value.\n length,\n partial,\n mind = gap,\n value = holder[key];\n\n if (value && typeof value === 'object') {\n value = toJSON.call( value, key );\n }\n\n if (typeof rep === 'function') {\n value = rep.call(holder, key, value);\n }\n\n switch (typeof value) {\n case 'string':\n return quote(value);\n\n case 'number':\n return isFinite(value) ? String(value) : 'null';\n\n case 'boolean':\n case 'null':\n return String(value);\n\n case 'object':\n\n if (!value) {\n return 'null';\n }\n\n gap += indent;\n partial = [];\n\n if (Object.prototype.toString.apply(value) === '[object Array]') {\n\n length = value.length;\n for (i = 0; i < length; i += 1) {\n partial[i] = str(i, value) || 'null';\n }\n\n v = partial.length === 0 ? '[]' :\n gap ? '[\\n' + gap +\n partial.join(',\\n' + gap) + '\\n' +\n mind + ']' :\n '[' + partial.join(',') + ']';\n gap = mind;\n return v;\n }\n if (rep && typeof rep === 'object') {\n length = rep.length;\n for (i = 0; i < length; i += 1) {\n k = rep[i];\n if (typeof k === 'string') {\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? ': ' : ':') + v);\n }\n }\n }\n } else {\n for (k in value) {\n if (Object.hasOwnProperty.call(value, k)) {\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? ': ' : ':') + v);\n }\n }\n }\n }\n\n v = partial.length === 0 ? '{}' :\n gap ? '{\\n' + gap + partial.join(',\\n' + gap) + '\\n' +\n mind + '}' : '{' + partial.join(',') + '}';\n gap = mind;\n return v;\n }\n }\n\n if (typeof JSON['stringify'] !== 'function') {\n JSON['stringify'] = function (value, replacer, space) {\n var i;\n gap = '';\n indent = '';\n\n if (typeof space === 'number') {\n for (i = 0; i < space; i += 1) {\n indent += ' ';\n }\n } else if (typeof space === 'string') {\n indent = space;\n }\n rep = replacer;\n if (replacer && typeof replacer !== 'function' &&\n (typeof replacer !== 'object' ||\n typeof replacer.length !== 'number')) {\n throw new Error('JSON.stringify');\n }\n return str('', {'': value});\n };\n }\n\n if (typeof JSON['parse'] !== 'function') {\n // JSON is parsed on the server for security.\n JSON['parse'] = function (text) {return eval('('+text+')')};\n }\n}());\nvar NOW = 1\n, READY = false\n, READY_BUFFER = []\n, PRESENCE_SUFFIX = '-pnpres'\n, DEF_WINDOWING = 10 // MILLISECONDS.\n, DEF_TIMEOUT = 10000 // MILLISECONDS.\n, DEF_SUB_TIMEOUT = 310 // SECONDS.\n, DEF_KEEPALIVE = 60 // SECONDS (FOR TIMESYNC).\n, SECOND = 1000 // A THOUSAND MILLISECONDS.\n, URLBIT = '/'\n, PARAMSBIT = '&'\n, PRESENCE_HB_THRESHOLD = 5\n, PRESENCE_HB_DEFAULT = 30\n, SDK_VER = '3.7.14'\n, REPL = /{([\\w\\-]+)}/g;\n\n/**\n * UTILITIES\n */\nfunction unique() { return'x'+ ++NOW+''+(+new Date) }\nfunction rnow() { return+new Date }\n\n/**\n * NEXTORIGIN\n * ==========\n * var next_origin = nextorigin();\n */\nvar nextorigin = (function() {\n var max = 20\n , ori = Math.floor(Math.random() * max);\n return function( origin, failover ) {\n return origin.indexOf('pubsub.') > 0\n && origin.replace(\n 'pubsub', 'ps' + (\n failover ? generate_uuid().split('-')[0] :\n (++ori < max? ori : ori=1)\n ) ) || origin;\n }\n})();\n\n\n/**\n * Build Url\n * =======\n *\n */\nfunction build_url( url_components, url_params ) {\n var url = url_components.join(URLBIT)\n , params = [];\n\n if (!url_params) return url;\n\n each( url_params, function( key, value ) {\n var value_str = (typeof value == 'object')?JSON['stringify'](value):value;\n (typeof value != 'undefined' &&\n value != null && encode(value_str).length > 0\n ) && params.push(key + \"=\" + encode(value_str));\n } );\n\n url += \"?\" + params.join(PARAMSBIT);\n return url;\n}\n\n/**\n * UPDATER\n * =======\n * var timestamp = unique();\n */\nfunction updater( fun, rate ) {\n var timeout\n , last = 0\n , runnit = function() {\n if (last + rate > rnow()) {\n clearTimeout(timeout);\n timeout = setTimeout( runnit, rate );\n }\n else {\n last = rnow();\n fun();\n }\n };\n\n return runnit;\n}\n\n/**\n * GREP\n * ====\n * var list = grep( [1,2,3], function(item) { return item % 2 } )\n */\nfunction grep( list, fun ) {\n var fin = [];\n each( list || [], function(l) { fun(l) && fin.push(l) } );\n return fin\n}\n\n/**\n * SUPPLANT\n * ========\n * var text = supplant( 'Hello {name}!', { name : 'John' } )\n */\nfunction supplant( str, values ) {\n return str.replace( REPL, function( _, match ) {\n return values[match] || _\n } );\n}\n\n/**\n * timeout\n * =======\n * timeout( function(){}, 100 );\n */\nfunction timeout( fun, wait ) {\n return setTimeout( fun, wait );\n}\n\n/**\n * uuid\n * ====\n * var my_uuid = generate_uuid();\n */\nfunction generate_uuid(callback) {\n var u = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,\n function(c) {\n var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);\n return v.toString(16);\n });\n if (callback) callback(u);\n return u;\n}\n\nfunction isArray(arg) {\n return !!arg && typeof arg !== 'string' && (Array.isArray && Array.isArray(arg) || typeof(arg.length) === \"number\")\n //return !!arg && (Array.isArray && Array.isArray(arg) || typeof(arg.length) === \"number\")\n}\n\n/**\n * EACH\n * ====\n * each( [1,2,3], function(item) { } )\n */\nfunction each( o, f) {\n if ( !o || !f ) return;\n\n if ( isArray(o) )\n for ( var i = 0, l = o.length; i < l; )\n f.call( o[i], o[i], i++ );\n else\n for ( var i in o )\n o.hasOwnProperty &&\n o.hasOwnProperty(i) &&\n f.call( o[i], i, o[i] );\n}\n\n/**\n * MAP\n * ===\n * var list = map( [1,2,3], function(item) { return item + 1 } )\n */\nfunction map( list, fun ) {\n var fin = [];\n each( list || [], function( k, v ) { fin.push(fun( k, v )) } );\n return fin;\n}\n\n\nfunction pam_encode(str) {\n return encodeURIComponent(str).replace(/[!'()*~]/g, function(c) {\n return '%' + c.charCodeAt(0).toString(16).toUpperCase();\n });\n}\n\n/**\n * ENCODE\n * ======\n * var encoded_data = encode('path');\n */\nfunction encode(path) { return encodeURIComponent(path) }\n\n/**\n * Generate Subscription Channel List\n * ==================================\n * generate_channel_list(channels_object);\n */\nfunction generate_channel_list(channels, nopresence) {\n var list = [];\n each( channels, function( channel, status ) {\n if (nopresence) {\n if(channel.search('-pnpres') < 0) {\n if (status.subscribed) list.push(channel);\n }\n } else {\n if (status.subscribed) list.push(channel);\n }\n });\n return list.sort();\n}\n\n/**\n * Generate Subscription Channel Groups List\n * ==================================\n * generate_channel_group_list(channels_groups object);\n */\nfunction generate_channel_group_list(channel_groups, nopresence) {\n var list = [];\n each(channel_groups, function( channel_group, status ) {\n if (nopresence) {\n if(channel_group.search('-pnpres') < 0) {\n if (status.subscribed) list.push(channel_group);\n }\n } else {\n if (status.subscribed) list.push(channel_group);\n }\n });\n return list.sort();\n}\n\n// PUBNUB READY TO CONNECT\nfunction ready() { timeout( function() {\n if (READY) return;\n READY = 1;\n each( READY_BUFFER, function(connect) { connect() } );\n}, SECOND ); }\n\nfunction PNmessage(args) {\n msg = args || {'apns' : {}},\n msg['getPubnubMessage'] = function() {\n var m = {};\n\n if (Object.keys(msg['apns']).length) {\n m['pn_apns'] = {\n 'aps' : {\n 'alert' : msg['apns']['alert'] ,\n 'badge' : msg['apns']['badge']\n }\n }\n for (var k in msg['apns']) {\n m['pn_apns'][k] = msg['apns'][k];\n }\n var exclude1 = ['badge','alert'];\n for (var k in exclude1) {\n delete m['pn_apns'][exclude1[k]];\n }\n }\n\n\n\n if (msg['gcm']) {\n m['pn_gcm'] = {\n 'data' : msg['gcm']\n }\n }\n\n for (var k in msg) {\n m[k] = msg[k];\n }\n var exclude = ['apns','gcm','publish', 'channel','callback','error'];\n for (var k in exclude) {\n delete m[exclude[k]];\n }\n\n return m;\n };\n msg['publish'] = function() {\n\n var m = msg.getPubnubMessage();\n\n if (msg['pubnub'] && msg['channel']) {\n msg['pubnub'].publish({\n 'message' : m,\n 'channel' : msg['channel'],\n 'callback' : msg['callback'],\n 'error' : msg['error']\n })\n }\n };\n return msg;\n}\n\nfunction PN_API(setup) {\n var SUB_WINDOWING = +setup['windowing'] || DEF_WINDOWING\n , SUB_TIMEOUT = (+setup['timeout'] || DEF_SUB_TIMEOUT) * SECOND\n , KEEPALIVE = (+setup['keepalive'] || DEF_KEEPALIVE) * SECOND\n , TIME_CHECK = setup['timecheck'] || 0\n , NOLEAVE = setup['noleave'] || 0\n , PUBLISH_KEY = setup['publish_key']\n , SUBSCRIBE_KEY = setup['subscribe_key']\n , AUTH_KEY = setup['auth_key'] || ''\n , SECRET_KEY = setup['secret_key'] || ''\n , hmac_SHA256 = setup['hmac_SHA256']\n , SSL = setup['ssl'] ? 's' : ''\n , ORIGIN = 'http'+SSL+'://'+(setup['origin']||'pubsub.pubnub.com')\n , STD_ORIGIN = nextorigin(ORIGIN)\n , SUB_ORIGIN = nextorigin(ORIGIN)\n , CONNECT = function(){}\n , PUB_QUEUE = []\n , CLOAK = true\n , TIME_DRIFT = 0\n , SUB_CALLBACK = 0\n , SUB_CHANNEL = 0\n , SUB_RECEIVER = 0\n , SUB_RESTORE = setup['restore'] || 0\n , SUB_BUFF_WAIT = 0\n , TIMETOKEN = 0\n , RESUMED = false\n , CHANNELS = {}\n , CHANNEL_GROUPS = {}\n , SUB_ERROR = function(){}\n , STATE = {}\n , PRESENCE_HB_TIMEOUT = null\n , PRESENCE_HB = validate_presence_heartbeat(\n setup['heartbeat'] || setup['pnexpires'] || 0, setup['error']\n )\n , PRESENCE_HB_INTERVAL = setup['heartbeat_interval'] || (PRESENCE_HB / 2) -1\n , PRESENCE_HB_RUNNING = false\n , NO_WAIT_FOR_PENDING = setup['no_wait_for_pending']\n , COMPATIBLE_35 = setup['compatible_3.5'] || false\n , xdr = setup['xdr']\n , params = setup['params'] || {}\n , error = setup['error'] || function() {}\n , _is_online = setup['_is_online'] || function() { return 1 }\n , jsonp_cb = setup['jsonp_cb'] || function() { return 0 }\n , db = setup['db'] || {'get': function(){}, 'set': function(){}}\n , CIPHER_KEY = setup['cipher_key']\n , UUID = setup['uuid'] || ( !setup['unique_uuid'] && db && db['get'](SUBSCRIBE_KEY+'uuid') || '')\n , USE_INSTANCEID = setup['instance_id'] || false\n , INSTANCEID = ''\n , shutdown = setup['shutdown']\n , use_send_beacon = (typeof setup['use_send_beacon'] != 'undefined')?setup['use_send_beacon']:true\n , sendBeacon = (use_send_beacon)?setup['sendBeacon']:null\n , _poll_timer\n , _poll_timer2;\n\n if (PRESENCE_HB === 2) PRESENCE_HB_INTERVAL = 1;\n\n var crypto_obj = setup['crypto_obj'] ||\n {\n 'encrypt' : function(a,key){ return a},\n 'decrypt' : function(b,key){return b}\n };\n\n function _get_url_params(data) {\n if (!data) data = {};\n each( params , function( key, value ) {\n if (!(key in data)) data[key] = value;\n });\n return data;\n }\n\n function _object_to_key_list(o) {\n var l = []\n each( o , function( key, value ) {\n l.push(key);\n });\n return l;\n }\n function _object_to_key_list_sorted(o) {\n return _object_to_key_list(o).sort();\n }\n\n function _get_pam_sign_input_from_params(params) {\n var si = \"\";\n var l = _object_to_key_list_sorted(params);\n\n for (var i in l) {\n var k = l[i]\n si += k + \"=\" + pam_encode(params[k]) ;\n if (i != l.length - 1) si += \"&\"\n }\n return si;\n }\n\n function validate_presence_heartbeat(heartbeat, cur_heartbeat, error) {\n var err = false;\n\n if (typeof heartbeat === 'undefined') {\n return cur_heartbeat;\n }\n\n if (typeof heartbeat === 'number') {\n if (heartbeat > PRESENCE_HB_THRESHOLD || heartbeat == 0)\n err = false;\n else\n err = true;\n } else if(typeof heartbeat === 'boolean'){\n if (!heartbeat) {\n return 0;\n } else {\n return PRESENCE_HB_DEFAULT;\n }\n } else {\n err = true;\n }\n\n if (err) {\n error && error(\"Presence Heartbeat value invalid. Valid range ( x > \" + PRESENCE_HB_THRESHOLD + \" or x = 0). Current Value : \" + (cur_heartbeat || PRESENCE_HB_THRESHOLD));\n return cur_heartbeat || PRESENCE_HB_THRESHOLD;\n } else return heartbeat;\n }\n\n function encrypt(input, key) {\n return crypto_obj['encrypt'](input, key || CIPHER_KEY) || input;\n }\n function decrypt(input, key) {\n return crypto_obj['decrypt'](input, key || CIPHER_KEY) ||\n crypto_obj['decrypt'](input, CIPHER_KEY) ||\n input;\n }\n\n function error_common(message, callback) {\n callback && callback({ 'error' : message || \"error occurred\"});\n error && error(message);\n }\n function _presence_heartbeat() {\n\n clearTimeout(PRESENCE_HB_TIMEOUT);\n\n if (!PRESENCE_HB_INTERVAL || PRESENCE_HB_INTERVAL >= 500 ||\n PRESENCE_HB_INTERVAL < 1 ||\n (!generate_channel_list(CHANNELS,true).length && !generate_channel_group_list(CHANNEL_GROUPS, true).length ) )\n {\n PRESENCE_HB_RUNNING = false;\n return;\n }\n\n PRESENCE_HB_RUNNING = true;\n SELF['presence_heartbeat']({\n 'callback' : function(r) {\n PRESENCE_HB_TIMEOUT = timeout( _presence_heartbeat, (PRESENCE_HB_INTERVAL) * SECOND );\n },\n 'error' : function(e) {\n error && error(\"Presence Heartbeat unable to reach Pubnub servers.\" + JSON.stringify(e));\n PRESENCE_HB_TIMEOUT = timeout( _presence_heartbeat, (PRESENCE_HB_INTERVAL) * SECOND );\n }\n });\n }\n\n function start_presence_heartbeat() {\n !PRESENCE_HB_RUNNING && _presence_heartbeat();\n }\n\n function publish(next) {\n\n if (NO_WAIT_FOR_PENDING) {\n if (!PUB_QUEUE.length) return;\n } else {\n if (next) PUB_QUEUE.sending = 0;\n if ( PUB_QUEUE.sending || !PUB_QUEUE.length ) return;\n PUB_QUEUE.sending = 1;\n }\n\n xdr(PUB_QUEUE.shift());\n }\n function each_channel_group(callback) {\n var count = 0;\n\n each( generate_channel_group_list(CHANNEL_GROUPS), function(channel_group) {\n var chang = CHANNEL_GROUPS[channel_group];\n\n if (!chang) return;\n\n count++;\n (callback||function(){})(chang);\n } );\n\n return count;\n }\n\n function each_channel(callback) {\n var count = 0;\n\n each( generate_channel_list(CHANNELS), function(channel) {\n var chan = CHANNELS[channel];\n\n if (!chan) return;\n\n count++;\n (callback||function(){})(chan);\n } );\n\n return count;\n }\n function _invoke_callback(response, callback, err) {\n if (typeof response == 'object') {\n if (response['error']) {\n var callback_data = {};\n\n if (response['message']) {\n callback_data['message'] = response['message'];\n }\n\n if (response['payload']) {\n callback_data['payload'] = response['payload'];\n }\n\n err && err(callback_data);\n return;\n\n }\n if (response['payload']) {\n if (response['next_page'])\n callback && callback(response['payload'], response['next_page']);\n else\n callback && callback(response['payload']);\n return;\n }\n }\n callback && callback(response);\n }\n\n function _invoke_error(response,err) {\n\n if (typeof response == 'object' && response['error']) {\n var callback_data = {};\n\n if (response['message']) {\n callback_data['message'] = response['message'];\n }\n\n if (response['payload']) {\n callback_data['payload'] = response['payload'];\n }\n \n err && err(callback_data);\n return;\n } else {\n err && err(response);\n }\n }\n function CR(args, callback, url1, data) {\n var callback = args['callback'] || callback\n , err = args['error'] || error\n , jsonp = jsonp_cb();\n\n data = data || {};\n \n if (!data['auth']) {\n data['auth'] = args['auth_key'] || AUTH_KEY;\n }\n \n var url = [\n STD_ORIGIN, 'v1', 'channel-registration',\n 'sub-key', SUBSCRIBE_KEY\n ];\n\n url.push.apply(url,url1);\n \n if (jsonp) data['callback'] = jsonp;\n \n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : url\n });\n\n }\n\n // Announce Leave Event\n var SELF = {\n 'LEAVE' : function( channel, blocking, auth_key, callback, error ) {\n\n var data = { 'uuid' : UUID, 'auth' : auth_key || AUTH_KEY }\n , origin = nextorigin(ORIGIN)\n , callback = callback || function(){}\n , err = error || function(){}\n , url\n , jsonp = jsonp_cb();\n\n\n\n // Prevent Leaving a Presence Channel\n if (channel.indexOf(PRESENCE_SUFFIX) > 0) return true;\n\n\n\n\n if (COMPATIBLE_35) {\n if (!SSL) return false;\n if (jsonp == '0') return false;\n }\n\n if (NOLEAVE) return false;\n\n if (jsonp != '0') data['callback'] = jsonp;\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n url = [\n origin, 'v2', 'presence', 'sub_key',\n SUBSCRIBE_KEY, 'channel', encode(channel), 'leave'\n ];\n\n params = _get_url_params(data);\n\n\n if (sendBeacon) {\n url_string = build_url(url, params);\n if (sendBeacon(url_string)) {\n callback && callback({\"status\": 200, \"action\": \"leave\", \"message\": \"OK\", \"service\": \"Presence\"});\n return true;\n }\n }\n\n\n xdr({\n blocking : blocking || SSL,\n timeout : 2000,\n callback : jsonp,\n data : params,\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : url\n });\n return true;\n },\n 'LEAVE_GROUP' : function( channel_group, blocking, auth_key, callback, error ) {\n\n var data = { 'uuid' : UUID, 'auth' : auth_key || AUTH_KEY }\n , origin = nextorigin(ORIGIN)\n , callback = callback || function(){}\n , err = error || function(){}\n , jsonp = jsonp_cb();\n\n // Prevent Leaving a Presence Channel Group\n if (channel_group.indexOf(PRESENCE_SUFFIX) > 0) return true;\n\n if (COMPATIBLE_35) {\n if (!SSL) return false;\n if (jsonp == '0') return false;\n }\n\n if (NOLEAVE) return false;\n\n if (jsonp != '0') data['callback'] = jsonp;\n\n if (channel_group && channel_group.length > 0) data['channel-group'] = channel_group;\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n blocking : blocking || SSL,\n timeout : 5000,\n callback : jsonp,\n data : _get_url_params(data),\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : [\n origin, 'v2', 'presence', 'sub_key',\n SUBSCRIBE_KEY, 'channel', encode(','), 'leave'\n ]\n });\n return true;\n },\n 'set_resumed' : function(resumed) {\n RESUMED = resumed;\n },\n 'get_cipher_key' : function() {\n return CIPHER_KEY;\n },\n 'set_cipher_key' : function(key) {\n CIPHER_KEY = key;\n },\n 'raw_encrypt' : function(input, key) {\n return encrypt(input, key);\n },\n 'raw_decrypt' : function(input, key) {\n return decrypt(input, key);\n },\n 'get_heartbeat' : function() {\n return PRESENCE_HB;\n },\n \n 'set_heartbeat' : function(heartbeat, heartbeat_interval) {\n PRESENCE_HB = validate_presence_heartbeat(heartbeat, PRESENCE_HB, error);\n PRESENCE_HB_INTERVAL = heartbeat_interval || (PRESENCE_HB / 2) - 1;\n if (PRESENCE_HB == 2) {\n PRESENCE_HB_INTERVAL = 1;\n }\n CONNECT();\n _presence_heartbeat();\n },\n \n 'get_heartbeat_interval' : function() {\n return PRESENCE_HB_INTERVAL;\n },\n \n 'set_heartbeat_interval' : function(heartbeat_interval) {\n PRESENCE_HB_INTERVAL = heartbeat_interval;\n _presence_heartbeat();\n },\n \n 'get_version' : function() {\n return SDK_VER;\n },\n 'getGcmMessageObject' : function(obj) {\n return {\n 'data' : obj\n }\n },\n 'getApnsMessageObject' : function(obj) {\n var x = {\n 'aps' : { 'badge' : 1, 'alert' : ''}\n }\n for (k in obj) {\n k[x] = obj[k];\n }\n return x;\n },\n 'newPnMessage' : function() {\n var x = {};\n if (gcm) x['pn_gcm'] = gcm;\n if (apns) x['pn_apns'] = apns;\n for ( k in n ) {\n x[k] = n[k];\n }\n return x;\n },\n\n '_add_param' : function(key,val) {\n params[key] = val;\n },\n\n 'channel_group' : function(args, callback) {\n var ns_ch = args['channel_group']\n , callback = callback || args['callback']\n , channels = args['channels'] || args['channel']\n , cloak = args['cloak']\n , namespace\n , channel_group\n , url = []\n , data = {}\n , mode = args['mode'] || 'add';\n\n\n if (ns_ch) {\n var ns_ch_a = ns_ch.split(':');\n\n if (ns_ch_a.length > 1) {\n namespace = (ns_ch_a[0] === '*')?null:ns_ch_a[0];\n\n channel_group = ns_ch_a[1];\n } else {\n channel_group = ns_ch_a[0];\n }\n }\n\n namespace && url.push('namespace') && url.push(encode(namespace));\n\n url.push('channel-group');\n\n if (channel_group && channel_group !== '*') {\n url.push(channel_group);\n }\n\n if (channels ) {\n if (isArray(channels)) {\n channels = channels.join(',');\n }\n data[mode] = channels;\n data['cloak'] = (CLOAK)?'true':'false';\n } else {\n if (mode === 'remove') url.push('remove');\n }\n\n if (typeof cloak != 'undefined') data['cloak'] = (cloak)?'true':'false';\n\n CR(args, callback, url, data);\n },\n\n 'channel_group_list_groups' : function(args, callback) {\n var namespace;\n\n namespace = args['namespace'] || args['ns'] || args['channel_group'] || null;\n if (namespace) {\n args[\"channel_group\"] = namespace + \":*\";\n }\n\n SELF['channel_group'](args, callback);\n },\n\n 'channel_group_list_channels' : function(args, callback) {\n if (!args['channel_group']) return error('Missing Channel Group');\n SELF['channel_group'](args, callback);\n },\n\n 'channel_group_remove_channel' : function(args, callback) {\n if (!args['channel_group']) return error('Missing Channel Group');\n if (!args['channel'] && !args['channels'] ) return error('Missing Channel');\n\n args['mode'] = 'remove';\n SELF['channel_group'](args,callback);\n },\n\n 'channel_group_remove_group' : function(args, callback) {\n if (!args['channel_group']) return error('Missing Channel Group');\n if (args['channel']) return error('Use channel_group_remove_channel if you want to remove a channel from a group.');\n\n args['mode'] = 'remove';\n SELF['channel_group'](args,callback);\n },\n\n 'channel_group_add_channel' : function(args, callback) {\n if (!args['channel_group']) return error('Missing Channel Group');\n if (!args['channel'] && !args['channels'] ) return error('Missing Channel');\n SELF['channel_group'](args,callback);\n },\n\n 'channel_group_cloak' : function(args, callback) {\n if (typeof args['cloak'] == 'undefined') {\n callback(CLOAK);\n return;\n }\n CLOAK = args['cloak'];\n SELF['channel_group'](args,callback);\n },\n\n 'channel_group_list_namespaces' : function(args, callback) {\n var url = ['namespace'];\n CR(args, callback, url);\n },\n 'channel_group_remove_namespace' : function(args, callback) {\n var url = ['namespace',args['namespace'],'remove'];\n CR(args, callback, url);\n },\n\n /*\n PUBNUB.history({\n channel : 'my_chat_channel',\n limit : 100,\n callback : function(history) { }\n });\n */\n 'history' : function( args, callback ) {\n var callback = args['callback'] || callback\n , count = args['count'] || args['limit'] || 100\n , reverse = args['reverse'] || \"false\"\n , err = args['error'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , cipher_key = args['cipher_key']\n , channel = args['channel']\n , channel_group = args['channel_group']\n , start = args['start']\n , end = args['end']\n , include_token = args['include_token']\n , string_msg_token = args['string_message_token'] || false\n , params = {}\n , jsonp = jsonp_cb();\n\n // Make sure we have a Channel\n if (!channel && !channel_group) return error('Missing Channel');\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n params['stringtoken'] = 'true';\n params['count'] = count;\n params['reverse'] = reverse;\n params['auth'] = auth_key;\n\n if (channel_group) {\n params['channel-group'] = channel_group;\n if (!channel) {\n channel = ','; \n }\n }\n if (jsonp) params['callback'] = jsonp;\n if (start) params['start'] = start;\n if (end) params['end'] = end;\n if (include_token) params['include_token'] = 'true';\n if (string_msg_token) params['string_message_token'] = 'true';\n\n // Send Message\n xdr({\n callback : jsonp,\n data : _get_url_params(params),\n success : function(response) {\n if (typeof response == 'object' && response['error']) {\n err({'message' : response['message'], 'payload' : response['payload']});\n return;\n }\n var messages = response[0];\n var decrypted_messages = [];\n for (var a = 0; a < messages.length; a++) {\n var new_message = decrypt(messages[a],cipher_key);\n try {\n decrypted_messages['push'](JSON['parse'](new_message));\n } catch (e) {\n decrypted_messages['push']((new_message));\n }\n }\n callback([decrypted_messages, response[1], response[2]]);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : [\n STD_ORIGIN, 'v2', 'history', 'sub-key',\n SUBSCRIBE_KEY, 'channel', encode(channel)\n ]\n });\n },\n\n /*\n PUBNUB.replay({\n source : 'my_channel',\n destination : 'new_channel'\n });\n */\n 'replay' : function(args, callback) {\n var callback = callback || args['callback'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , source = args['source']\n , destination = args['destination']\n , stop = args['stop']\n , start = args['start']\n , end = args['end']\n , reverse = args['reverse']\n , limit = args['limit']\n , jsonp = jsonp_cb()\n , data = {}\n , url;\n\n // Check User Input\n if (!source) return error('Missing Source Channel');\n if (!destination) return error('Missing Destination Channel');\n if (!PUBLISH_KEY) return error('Missing Publish Key');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n // Setup URL Params\n if (jsonp != '0') data['callback'] = jsonp;\n if (stop) data['stop'] = 'all';\n if (reverse) data['reverse'] = 'true';\n if (start) data['start'] = start;\n if (end) data['end'] = end;\n if (limit) data['count'] = limit;\n\n data['auth'] = auth_key;\n\n // Compose URL Parts\n url = [\n STD_ORIGIN, 'v1', 'replay',\n PUBLISH_KEY, SUBSCRIBE_KEY,\n source, destination\n ];\n\n // Start (or Stop) Replay!\n xdr({\n callback : jsonp,\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function() { callback([ 0, 'Disconnected' ]) },\n url : url,\n data : _get_url_params(data)\n });\n },\n\n /*\n PUBNUB.auth('AJFLKAJSDKLA');\n */\n 'auth' : function(auth) {\n AUTH_KEY = auth;\n CONNECT();\n },\n\n /*\n PUBNUB.time(function(time){ });\n */\n 'time' : function(callback) {\n var jsonp = jsonp_cb();\n\n var data = { 'uuid' : UUID, 'auth' : AUTH_KEY }\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n timeout : SECOND * 5,\n url : [STD_ORIGIN, 'time', jsonp],\n success : function(response) { callback(response[0]) },\n fail : function() { callback(0) }\n });\n },\n\n /*\n PUBNUB.publish({\n channel : 'my_chat_channel',\n message : 'hello!'\n });\n */\n 'publish' : function( args, callback ) {\n var msg = args['message'];\n if (!msg) return error('Missing Message');\n\n var callback = callback || args['callback'] || msg['callback'] || function(){}\n , channel = args['channel'] || msg['channel']\n , auth_key = args['auth_key'] || AUTH_KEY\n , cipher_key = args['cipher_key']\n , err = args['error'] || msg['error'] || function() {}\n , post = args['post'] || false\n , store = ('store_in_history' in args) ? args['store_in_history']: true\n , jsonp = jsonp_cb()\n , add_msg = 'push'\n , params\n , url;\n\n if (args['prepend']) add_msg = 'unshift'\n\n if (!channel) return error('Missing Channel');\n if (!PUBLISH_KEY) return error('Missing Publish Key');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n if (msg['getPubnubMessage']) {\n msg = msg['getPubnubMessage']();\n }\n\n // If trying to send Object\n msg = JSON['stringify'](encrypt(msg, cipher_key));\n\n // Create URL\n url = [\n STD_ORIGIN, 'publish',\n PUBLISH_KEY, SUBSCRIBE_KEY,\n 0, encode(channel),\n jsonp, encode(msg)\n ];\n\n params = { 'uuid' : UUID, 'auth' : auth_key }\n\n if (!store) params['store'] =\"0\"\n\n if (USE_INSTANCEID) params['instanceid'] = INSTANCEID;\n\n // Queue Message Send\n PUB_QUEUE[add_msg]({\n callback : jsonp,\n timeout : SECOND * 5,\n url : url,\n data : _get_url_params(params),\n fail : function(response){\n _invoke_error(response, err);\n publish(1);\n },\n success : function(response) {\n _invoke_callback(response, callback, err);\n publish(1);\n },\n mode : (post)?'POST':'GET'\n });\n\n // Send Message\n publish();\n },\n\n /*\n PUBNUB.unsubscribe({ channel : 'my_chat' });\n */\n 'unsubscribe' : function(args, callback) {\n var channel = args['channel']\n , channel_group = args['channel_group']\n , auth_key = args['auth_key'] || AUTH_KEY\n , callback = callback || args['callback'] || function(){}\n , err = args['error'] || function(){};\n\n TIMETOKEN = 0;\n //SUB_RESTORE = 1; REVISIT !!!!\n\n if (channel) {\n // Prepare Channel(s)\n channel = map( (\n channel.join ? channel.join(',') : ''+channel\n ).split(','), function(channel) {\n if (!CHANNELS[channel]) return;\n return channel + ',' + channel + PRESENCE_SUFFIX;\n } ).join(',');\n\n // Iterate over Channels\n each( channel.split(','), function(ch) {\n var CB_CALLED = true;\n if (!ch) return;\n CHANNELS[ch] = 0;\n if (ch in STATE) delete STATE[ch];\n if (READY) {\n CB_CALLED = SELF['LEAVE']( ch, 0 , auth_key, callback, err);\n }\n if (!CB_CALLED) callback({action : \"leave\"});\n\n \n } );\n }\n\n if (channel_group) {\n // Prepare channel group(s)\n channel_group = map( (\n channel_group.join ? channel_group.join(',') : ''+channel_group\n ).split(','), function(channel_group) {\n if (!CHANNEL_GROUPS[channel_group]) return;\n return channel_group + ',' + channel_group + PRESENCE_SUFFIX;\n } ).join(',');\n\n // Iterate over channel groups\n each( channel_group.split(','), function(chg) {\n var CB_CALLED = true;\n if (!chg) return;\n CHANNEL_GROUPS[chg] = 0;\n if (chg in STATE) delete STATE[chg];\n if (READY) {\n CB_CALLED = SELF['LEAVE_GROUP']( chg, 0 , auth_key, callback, err);\n }\n if (!CB_CALLED) callback({action : \"leave\"});\n\n } );\n }\n\n // Reset Connection if Count Less\n CONNECT();\n },\n\n /*\n PUBNUB.subscribe({\n channel : 'my_chat'\n callback : function(message) { }\n });\n */\n 'subscribe' : function( args, callback ) {\n var channel = args['channel']\n , channel_group = args['channel_group']\n , callback = callback || args['callback']\n , callback = callback || args['message']\n , connect = args['connect'] || function(){}\n , reconnect = args['reconnect'] || function(){}\n , disconnect = args['disconnect'] || function(){}\n , SUB_ERROR = args['error'] || SUB_ERROR || function(){}\n , idlecb = args['idle'] || function(){}\n , presence = args['presence'] || 0\n , noheresync = args['noheresync'] || 0\n , backfill = args['backfill'] || 0\n , timetoken = args['timetoken'] || 0\n , sub_timeout = args['timeout'] || SUB_TIMEOUT\n , windowing = args['windowing'] || SUB_WINDOWING\n , state = args['state']\n , heartbeat = args['heartbeat'] || args['pnexpires']\n , heartbeat_interval = args['heartbeat_interval']\n , restore = args['restore'] || SUB_RESTORE;\n\n AUTH_KEY = args['auth_key'] || AUTH_KEY;\n\n // Restore Enabled?\n SUB_RESTORE = restore;\n\n // Always Reset the TT\n TIMETOKEN = timetoken;\n\n // Make sure we have a Channel\n if (!channel && !channel_group) {\n return error('Missing Channel');\n }\n\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n if (heartbeat || heartbeat === 0 || heartbeat_interval || heartbeat_interval === 0) {\n SELF['set_heartbeat'](heartbeat, heartbeat_interval);\n }\n\n // Setup Channel(s)\n if (channel) {\n each( (channel.join ? channel.join(',') : ''+channel).split(','),\n function(channel) {\n var settings = CHANNELS[channel] || {};\n\n // Store Channel State\n CHANNELS[SUB_CHANNEL = channel] = {\n name : channel,\n connected : settings.connected,\n disconnected : settings.disconnected,\n subscribed : 1,\n callback : SUB_CALLBACK = callback,\n 'cipher_key' : args['cipher_key'],\n connect : connect,\n disconnect : disconnect,\n reconnect : reconnect\n };\n\n if (state) {\n if (channel in state) {\n STATE[channel] = state[channel];\n } else {\n STATE[channel] = state;\n }\n }\n\n // Presence Enabled?\n if (!presence) return;\n\n // Subscribe Presence Channel\n SELF['subscribe']({\n 'channel' : channel + PRESENCE_SUFFIX,\n 'callback' : presence,\n 'restore' : restore\n });\n\n // Presence Subscribed?\n if (settings.subscribed) return;\n\n // See Who's Here Now?\n if (noheresync) return;\n SELF['here_now']({\n 'channel' : channel,\n 'data' : _get_url_params({ 'uuid' : UUID, 'auth' : AUTH_KEY }),\n 'callback' : function(here) {\n each( 'uuids' in here ? here['uuids'] : [],\n function(uid) { presence( {\n 'action' : 'join',\n 'uuid' : uid,\n 'timestamp' : Math.floor(rnow() / 1000),\n 'occupancy' : here['occupancy'] || 1\n }, here, channel ); } );\n }\n });\n } );\n }\n\n // Setup Channel Groups\n if (channel_group) {\n each( (channel_group.join ? channel_group.join(',') : ''+channel_group).split(','),\n function(channel_group) {\n var settings = CHANNEL_GROUPS[channel_group] || {};\n\n CHANNEL_GROUPS[channel_group] = {\n name : channel_group,\n connected : settings.connected,\n disconnected : settings.disconnected,\n subscribed : 1,\n callback : SUB_CALLBACK = callback,\n 'cipher_key' : args['cipher_key'],\n connect : connect,\n disconnect : disconnect,\n reconnect : reconnect\n };\n\n // Presence Enabled?\n if (!presence) return;\n\n // Subscribe Presence Channel\n SELF['subscribe']({\n 'channel_group' : channel_group + PRESENCE_SUFFIX,\n 'callback' : presence,\n 'restore' : restore,\n 'auth_key' : AUTH_KEY\n });\n\n // Presence Subscribed?\n if (settings.subscribed) return;\n\n // See Who's Here Now?\n if (noheresync) return;\n SELF['here_now']({\n 'channel_group' : channel_group,\n 'data' : _get_url_params({ 'uuid' : UUID, 'auth' : AUTH_KEY }),\n 'callback' : function(here) {\n each( 'uuids' in here ? here['uuids'] : [],\n function(uid) { presence( {\n 'action' : 'join',\n 'uuid' : uid,\n 'timestamp' : Math.floor(rnow() / 1000),\n 'occupancy' : here['occupancy'] || 1\n }, here, channel_group ); } );\n }\n });\n } );\n }\n\n\n // Test Network Connection\n function _test_connection(success) {\n if (success) {\n // Begin Next Socket Connection\n timeout( CONNECT, windowing);\n }\n else {\n // New Origin on Failed Connection\n STD_ORIGIN = nextorigin( ORIGIN, 1 );\n SUB_ORIGIN = nextorigin( ORIGIN, 1 );\n\n // Re-test Connection\n timeout( function() {\n SELF['time'](_test_connection);\n }, SECOND );\n }\n\n // Disconnect & Reconnect\n each_channel(function(channel){\n // Reconnect\n if (success && channel.disconnected) {\n channel.disconnected = 0;\n return channel.reconnect(channel.name);\n }\n\n // Disconnect\n if (!success && !channel.disconnected) {\n channel.disconnected = 1;\n channel.disconnect(channel.name);\n }\n });\n \n // Disconnect & Reconnect for channel groups\n each_channel_group(function(channel_group){\n // Reconnect\n if (success && channel_group.disconnected) {\n channel_group.disconnected = 0;\n return channel_group.reconnect(channel_group.name);\n }\n\n // Disconnect\n if (!success && !channel_group.disconnected) {\n channel_group.disconnected = 1;\n channel_group.disconnect(channel_group.name);\n }\n });\n }\n\n // Evented Subscribe\n function _connect() {\n var jsonp = jsonp_cb()\n , channels = generate_channel_list(CHANNELS).join(',')\n , channel_groups = generate_channel_group_list(CHANNEL_GROUPS).join(',');\n\n // Stop Connection\n if (!channels && !channel_groups) return;\n\n if (!channels) channels = ',';\n\n // Connect to PubNub Subscribe Servers\n _reset_offline();\n\n var data = _get_url_params({ 'uuid' : UUID, 'auth' : AUTH_KEY });\n\n if (channel_groups) {\n data['channel-group'] = channel_groups;\n }\n\n\n var st = JSON.stringify(STATE);\n if (st.length > 2) data['state'] = JSON.stringify(STATE);\n\n if (PRESENCE_HB) data['heartbeat'] = PRESENCE_HB;\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n start_presence_heartbeat();\n SUB_RECEIVER = xdr({\n timeout : sub_timeout,\n callback : jsonp,\n fail : function(response) {\n if (response && response['error'] && response['service']) {\n _invoke_error(response, SUB_ERROR);\n _test_connection(1);\n } else {\n SELF['time'](function(success){\n !success && ( _invoke_error(response, SUB_ERROR));\n _test_connection(success);\n });\n }\n },\n data : _get_url_params(data),\n url : [\n SUB_ORIGIN, 'subscribe',\n SUBSCRIBE_KEY, encode(channels),\n jsonp, TIMETOKEN\n ],\n success : function(messages) {\n\n // Check for Errors\n if (!messages || (\n typeof messages == 'object' &&\n 'error' in messages &&\n messages['error']\n )) {\n SUB_ERROR(messages['error']);\n return timeout( CONNECT, SECOND );\n }\n\n // User Idle Callback\n idlecb(messages[1]);\n\n // Restore Previous Connection Point if Needed\n TIMETOKEN = !TIMETOKEN &&\n SUB_RESTORE &&\n db['get'](SUBSCRIBE_KEY) || messages[1];\n\n /*\n // Connect\n each_channel_registry(function(registry){\n if (registry.connected) return;\n registry.connected = 1;\n registry.connect(channel.name);\n });\n */\n\n // Connect\n each_channel(function(channel){\n if (channel.connected) return;\n channel.connected = 1;\n channel.connect(channel.name);\n });\n\n // Connect for channel groups\n each_channel_group(function(channel_group){\n if (channel_group.connected) return;\n channel_group.connected = 1;\n channel_group.connect(channel_group.name);\n });\n\n if (RESUMED && !SUB_RESTORE) {\n TIMETOKEN = 0;\n RESUMED = false;\n // Update Saved Timetoken\n db['set']( SUBSCRIBE_KEY, 0 );\n timeout( _connect, windowing );\n return;\n }\n\n // Invoke Memory Catchup and Receive Up to 100\n // Previous Messages from the Queue.\n if (backfill) {\n TIMETOKEN = 10000;\n backfill = 0;\n }\n\n // Update Saved Timetoken\n db['set']( SUBSCRIBE_KEY, messages[1] );\n\n // Route Channel <---> Callback for Message\n var next_callback = (function() {\n var channels = '';\n var channels2 = '';\n\n if (messages.length > 3) {\n channels = messages[3];\n channels2 = messages[2];\n } else if (messages.length > 2) {\n channels = messages[2];\n } else {\n channels = map(\n generate_channel_list(CHANNELS), function(chan) { return map(\n Array(messages[0].length)\n .join(',').split(','),\n function() { return chan; }\n ) }).join(',')\n }\n\n var list = channels.split(',');\n var list2 = (channels2)?channels2.split(','):[];\n\n return function() {\n var channel = list.shift()||SUB_CHANNEL;\n var channel2 = list2.shift();\n\n var chobj = {};\n\n if (channel2) {\n if (channel && channel.indexOf('-pnpres') >= 0 \n && channel2.indexOf('-pnpres') < 0) {\n channel2 += '-pnpres';\n }\n chobj = CHANNEL_GROUPS[channel2] || CHANNELS[channel2] || {'callback' : function(){}};\n } else {\n chobj = CHANNELS[channel];\n }\n\n var r = [\n chobj\n .callback||SUB_CALLBACK,\n channel.split(PRESENCE_SUFFIX)[0]\n ];\n channel2 && r.push(channel2.split(PRESENCE_SUFFIX)[0]);\n return r;\n };\n })();\n\n var latency = detect_latency(+messages[1]);\n each( messages[0], function(msg) {\n var next = next_callback();\n var decrypted_msg = decrypt(msg,\n (CHANNELS[next[1]])?CHANNELS[next[1]]['cipher_key']:null);\n next[0] && next[0]( decrypted_msg, messages, next[2] || next[1], latency, next[1]);\n });\n\n timeout( _connect, windowing );\n }\n });\n }\n\n CONNECT = function() {\n _reset_offline();\n timeout( _connect, windowing );\n };\n\n // Reduce Status Flicker\n if (!READY) return READY_BUFFER.push(CONNECT);\n\n // Connect Now\n CONNECT();\n },\n\n /*\n PUBNUB.here_now({ channel : 'my_chat', callback : fun });\n */\n 'here_now' : function( args, callback ) {\n var callback = args['callback'] || callback\n , err = args['error'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , channel = args['channel']\n , channel_group = args['channel_group']\n , jsonp = jsonp_cb()\n , uuids = ('uuids' in args) ? args['uuids'] : true\n , state = args['state']\n , data = { 'uuid' : UUID, 'auth' : auth_key };\n\n if (!uuids) data['disable_uuids'] = 1;\n if (state) data['state'] = 1;\n\n // Make sure we have a Channel\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n var url = [\n STD_ORIGIN, 'v2', 'presence',\n 'sub_key', SUBSCRIBE_KEY\n ];\n\n channel && url.push('channel') && url.push(encode(channel));\n\n if (jsonp != '0') { data['callback'] = jsonp; }\n\n if (channel_group) {\n data['channel-group'] = channel_group;\n !channel && url.push('channel') && url.push(','); \n }\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : url\n });\n },\n\n /*\n PUBNUB.current_channels_by_uuid({ channel : 'my_chat', callback : fun });\n */\n 'where_now' : function( args, callback ) {\n var callback = args['callback'] || callback\n , err = args['error'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , jsonp = jsonp_cb()\n , uuid = args['uuid'] || UUID\n , data = { 'auth' : auth_key };\n\n // Make sure we have a Channel\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n if (jsonp != '0') { data['callback'] = jsonp; }\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : [\n STD_ORIGIN, 'v2', 'presence',\n 'sub_key', SUBSCRIBE_KEY,\n 'uuid', encode(uuid)\n ]\n });\n },\n\n 'state' : function(args, callback) {\n var callback = args['callback'] || callback || function(r) {}\n , err = args['error'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , jsonp = jsonp_cb()\n , state = args['state']\n , uuid = args['uuid'] || UUID\n , channel = args['channel']\n , channel_group = args['channel_group']\n , url\n , data = _get_url_params({ 'auth' : auth_key });\n\n // Make sure we have a Channel\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n if (!uuid) return error('Missing UUID');\n if (!channel && !channel_group) return error('Missing Channel');\n\n if (jsonp != '0') { data['callback'] = jsonp; }\n\n if (typeof channel != 'undefined'\n && CHANNELS[channel] && CHANNELS[channel].subscribed ) {\n if (state) STATE[channel] = state;\n }\n\n if (typeof channel_group != 'undefined'\n && CHANNEL_GROUPS[channel_group]\n && CHANNEL_GROUPS[channel_group].subscribed\n ) {\n if (state) STATE[channel_group] = state;\n data['channel-group'] = channel_group;\n\n if (!channel) {\n channel = ',';\n }\n }\n\n data['state'] = JSON.stringify(state);\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n if (state) {\n url = [\n STD_ORIGIN, 'v2', 'presence',\n 'sub-key', SUBSCRIBE_KEY,\n 'channel', channel,\n 'uuid', uuid, 'data'\n ]\n } else {\n url = [\n STD_ORIGIN, 'v2', 'presence',\n 'sub-key', SUBSCRIBE_KEY,\n 'channel', channel,\n 'uuid', encode(uuid)\n ]\n }\n\n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : url\n\n });\n\n },\n\n /*\n PUBNUB.grant({\n channel : 'my_chat',\n callback : fun,\n error : fun,\n ttl : 24 * 60, // Minutes\n read : true,\n write : true,\n auth_key : '3y8uiajdklytowsj'\n });\n */\n 'grant' : function( args, callback ) {\n var callback = args['callback'] || callback\n , err = args['error'] || function(){}\n , channel = args['channel'] || args['channels']\n , channel_group = args['channel_group']\n , jsonp = jsonp_cb()\n , ttl = args['ttl']\n , r = (args['read'] )?\"1\":\"0\"\n , w = (args['write'])?\"1\":\"0\"\n , m = (args['manage'])?\"1\":\"0\"\n , auth_key = args['auth_key'] || args['auth_keys'];\n\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n if (!PUBLISH_KEY) return error('Missing Publish Key');\n if (!SECRET_KEY) return error('Missing Secret Key');\n\n var timestamp = Math.floor(new Date().getTime() / 1000)\n , sign_input = SUBSCRIBE_KEY + \"\\n\" + PUBLISH_KEY + \"\\n\"\n + \"grant\" + \"\\n\";\n\n var data = {\n 'w' : w,\n 'r' : r,\n 'timestamp' : timestamp\n };\n if (args['manage']) {\n data['m'] = m;\n }\n if (isArray(channel)) {\n channel = channel['join'](',');\n }\n if (isArray(auth_key)) {\n auth_key = auth_key['join'](',');\n }\n if (typeof channel != 'undefined' && channel != null && channel.length > 0) data['channel'] = channel;\n if (typeof channel_group != 'undefined' && channel_group != null && channel_group.length > 0) {\n data['channel-group'] = channel_group;\n }\n if (jsonp != '0') { data['callback'] = jsonp; }\n if (ttl || ttl === 0) data['ttl'] = ttl;\n\n if (auth_key) data['auth'] = auth_key;\n\n data = _get_url_params(data)\n\n if (!auth_key) delete data['auth'];\n\n sign_input += _get_pam_sign_input_from_params(data);\n\n var signature = hmac_SHA256( sign_input, SECRET_KEY );\n\n signature = signature.replace( /\\+/g, \"-\" );\n signature = signature.replace( /\\//g, \"_\" );\n\n data['signature'] = signature;\n\n xdr({\n callback : jsonp,\n data : data,\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : [\n STD_ORIGIN, 'v1', 'auth', 'grant' ,\n 'sub-key', SUBSCRIBE_KEY\n ]\n });\n },\n\n /*\n PUBNUB.mobile_gw_provision ({\n device_id: 'A655FBA9931AB',\n op : 'add' | 'remove',\n gw_type : 'apns' | 'gcm',\n channel : 'my_chat',\n callback : fun,\n error : fun,\n });\n */\n\n 'mobile_gw_provision' : function( args ) {\n\n var callback = args['callback'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , err = args['error'] || function() {}\n , jsonp = jsonp_cb()\n , channel = args['channel']\n , op = args['op']\n , gw_type = args['gw_type']\n , device_id = args['device_id']\n , params\n , url;\n\n if (!device_id) return error('Missing Device ID (device_id)');\n if (!gw_type) return error('Missing GW Type (gw_type: gcm or apns)');\n if (!op) return error('Missing GW Operation (op: add or remove)');\n if (!channel) return error('Missing gw destination Channel (channel)');\n if (!PUBLISH_KEY) return error('Missing Publish Key');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n // Create URL\n url = [\n STD_ORIGIN, 'v1/push/sub-key',\n SUBSCRIBE_KEY, 'devices', device_id\n ];\n\n params = { 'uuid' : UUID, 'auth' : auth_key, 'type': gw_type};\n\n if (op == \"add\") {\n params['add'] = channel;\n } else if (op == \"remove\") {\n params['remove'] = channel;\n }\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n callback : jsonp,\n data : params,\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : url\n });\n\n },\n\n /*\n PUBNUB.audit({\n channel : 'my_chat',\n callback : fun,\n error : fun,\n read : true,\n write : true,\n auth_key : '3y8uiajdklytowsj'\n });\n */\n 'audit' : function( args, callback ) {\n var callback = args['callback'] || callback\n , err = args['error'] || function(){}\n , channel = args['channel']\n , channel_group = args['channel_group']\n , auth_key = args['auth_key']\n , jsonp = jsonp_cb();\n\n // Make sure we have a Channel\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n if (!PUBLISH_KEY) return error('Missing Publish Key');\n if (!SECRET_KEY) return error('Missing Secret Key');\n\n var timestamp = Math.floor(new Date().getTime() / 1000)\n , sign_input = SUBSCRIBE_KEY + \"\\n\"\n + PUBLISH_KEY + \"\\n\"\n + \"audit\" + \"\\n\";\n\n var data = {'timestamp' : timestamp };\n if (jsonp != '0') { data['callback'] = jsonp; }\n if (typeof channel != 'undefined' && channel != null && channel.length > 0) data['channel'] = channel;\n if (typeof channel_group != 'undefined' && channel_group != null && channel_group.length > 0) {\n data['channel-group'] = channel_group;\n }\n if (auth_key) data['auth'] = auth_key;\n\n data = _get_url_params(data);\n\n if (!auth_key) delete data['auth'];\n\n sign_input += _get_pam_sign_input_from_params(data);\n\n var signature = hmac_SHA256( sign_input, SECRET_KEY );\n\n signature = signature.replace( /\\+/g, \"-\" );\n signature = signature.replace( /\\//g, \"_\" );\n\n data['signature'] = signature;\n xdr({\n callback : jsonp,\n data : data,\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : [\n STD_ORIGIN, 'v1', 'auth', 'audit' ,\n 'sub-key', SUBSCRIBE_KEY\n ]\n });\n },\n\n /*\n PUBNUB.revoke({\n channel : 'my_chat',\n callback : fun,\n error : fun,\n auth_key : '3y8uiajdklytowsj'\n });\n */\n 'revoke' : function( args, callback ) {\n args['read'] = false;\n args['write'] = false;\n SELF['grant']( args, callback );\n },\n 'set_uuid' : function(uuid) {\n UUID = uuid;\n CONNECT();\n },\n 'get_uuid' : function() {\n return UUID;\n },\n 'isArray' : function(arg) {\n return isArray(arg);\n },\n 'get_subscibed_channels' : function() {\n return generate_channel_list(CHANNELS, true);\n },\n 'presence_heartbeat' : function(args) {\n var callback = args['callback'] || function() {}\n var err = args['error'] || function() {}\n var jsonp = jsonp_cb();\n var data = { 'uuid' : UUID, 'auth' : AUTH_KEY };\n\n var st = JSON['stringify'](STATE);\n if (st.length > 2) data['state'] = JSON['stringify'](STATE);\n\n if (PRESENCE_HB > 0 && PRESENCE_HB < 320) data['heartbeat'] = PRESENCE_HB;\n\n if (jsonp != '0') { data['callback'] = jsonp; }\n\n var channels = encode(generate_channel_list(CHANNELS, true)['join'](','));\n var channel_groups = generate_channel_group_list(CHANNEL_GROUPS, true)['join'](',');\n\n if (!channels) channels = ',';\n if (channel_groups) data['channel-group'] = channel_groups;\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n timeout : SECOND * 5,\n url : [\n STD_ORIGIN, 'v2', 'presence',\n 'sub-key', SUBSCRIBE_KEY,\n 'channel' , channels,\n 'heartbeat'\n ],\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) { _invoke_error(response, err); }\n });\n },\n 'stop_timers': function () {\n clearTimeout(_poll_timer);\n clearTimeout(_poll_timer2);\n clearTimeout(PRESENCE_HB_TIMEOUT);\n },\n 'shutdown': function () {\n SELF['stop_timers']();\n shutdown && shutdown();\n },\n\n // Expose PUBNUB Functions\n 'xdr' : xdr,\n 'ready' : ready,\n 'db' : db,\n 'uuid' : generate_uuid,\n 'map' : map,\n 'each' : each,\n 'each-channel' : each_channel,\n 'grep' : grep,\n 'offline' : function(){ _reset_offline(\n 1, { \"message\" : \"Offline. Please check your network settings.\" })\n },\n 'supplant' : supplant,\n 'now' : rnow,\n 'unique' : unique,\n 'updater' : updater\n };\n\n function _poll_online() {\n _is_online() || _reset_offline( 1, {\n \"error\" : \"Offline. Please check your network settings. \"\n });\n _poll_timer && clearTimeout(_poll_timer);\n _poll_timer = timeout( _poll_online, SECOND );\n }\n\n function _poll_online2() {\n if (!TIME_CHECK) return;\n SELF['time'](function(success){\n detect_time_detla( function(){}, success );\n success || _reset_offline( 1, {\n \"error\" : \"Heartbeat failed to connect to Pubnub Servers.\" +\n \"Please check your network settings.\"\n });\n _poll_timer2 && clearTimeout(_poll_timer2);\n _poll_timer2 = timeout( _poll_online2, KEEPALIVE );\n });\n }\n\n function _reset_offline(err, msg) {\n SUB_RECEIVER && SUB_RECEIVER(err, msg);\n SUB_RECEIVER = null;\n\n clearTimeout(_poll_timer);\n clearTimeout(_poll_timer2);\n }\n \n if (!UUID) UUID = SELF['uuid']();\n if (!INSTANCEID) INSTANCEID = SELF['uuid']();\n db['set']( SUBSCRIBE_KEY + 'uuid', UUID );\n\n _poll_timer = timeout( _poll_online, SECOND );\n _poll_timer2 = timeout( _poll_online2, KEEPALIVE );\n PRESENCE_HB_TIMEOUT = timeout(\n start_presence_heartbeat,\n ( PRESENCE_HB_INTERVAL - 3 ) * SECOND\n );\n\n // Detect Age of Message\n function detect_latency(tt) {\n var adjusted_time = rnow() - TIME_DRIFT;\n return adjusted_time - tt / 10000;\n }\n\n detect_time_detla();\n function detect_time_detla( cb, time ) {\n var stime = rnow();\n\n time && calculate(time) || SELF['time'](calculate);\n\n function calculate(time) {\n if (!time) return;\n var ptime = time / 10000\n , latency = (rnow() - stime) / 2;\n TIME_DRIFT = rnow() - (ptime + latency);\n cb && cb(TIME_DRIFT);\n }\n }\n\n return SELF;\n}\nfunction crypto_obj() {\n\n function SHA256(s) {\n return CryptoJS['SHA256'](s)['toString'](CryptoJS['enc']['Hex']);\n }\n\n var iv = \"0123456789012345\";\n\n var allowedKeyEncodings = ['hex', 'utf8', 'base64', 'binary'];\n var allowedKeyLengths = [128, 256];\n var allowedModes = ['ecb', 'cbc'];\n\n var defaultOptions = {\n 'encryptKey': true,\n 'keyEncoding': 'utf8',\n 'keyLength': 256,\n 'mode': 'cbc'\n };\n\n function parse_options(options) {\n\n // Defaults\n options = options || {};\n if (!options['hasOwnProperty']('encryptKey')) options['encryptKey'] = defaultOptions['encryptKey'];\n if (!options['hasOwnProperty']('keyEncoding')) options['keyEncoding'] = defaultOptions['keyEncoding'];\n if (!options['hasOwnProperty']('keyLength')) options['keyLength'] = defaultOptions['keyLength'];\n if (!options['hasOwnProperty']('mode')) options['mode'] = defaultOptions['mode'];\n\n // Validation\n if (allowedKeyEncodings['indexOf'](options['keyEncoding']['toLowerCase']()) == -1) options['keyEncoding'] = defaultOptions['keyEncoding'];\n if (allowedKeyLengths['indexOf'](parseInt(options['keyLength'], 10)) == -1) options['keyLength'] = defaultOptions['keyLength'];\n if (allowedModes['indexOf'](options['mode']['toLowerCase']()) == -1) options['mode'] = defaultOptions['mode'];\n\n return options;\n\n }\n\n function decode_key(key, options) {\n if (options['keyEncoding'] == 'base64') {\n return CryptoJS['enc']['Base64']['parse'](key);\n } else if (options['keyEncoding'] == 'hex') {\n return CryptoJS['enc']['Hex']['parse'](key);\n } else {\n return key;\n }\n }\n\n function get_padded_key(key, options) {\n key = decode_key(key, options);\n if (options['encryptKey']) {\n return CryptoJS['enc']['Utf8']['parse'](SHA256(key)['slice'](0, 32));\n } else {\n return key;\n }\n }\n\n function get_mode(options) {\n if (options['mode'] == 'ecb') {\n return CryptoJS['mode']['ECB'];\n } else {\n return CryptoJS['mode']['CBC'];\n }\n }\n\n function get_iv(options) {\n return (options['mode'] == 'cbc') ? CryptoJS['enc']['Utf8']['parse'](iv) : null;\n }\n\n return {\n\n 'encrypt': function(data, key, options) {\n if (!key) return data;\n options = parse_options(options);\n var iv = get_iv(options);\n var mode = get_mode(options);\n var cipher_key = get_padded_key(key, options);\n var hex_message = JSON['stringify'](data);\n var encryptedHexArray = CryptoJS['AES']['encrypt'](hex_message, cipher_key, {'iv': iv, 'mode': mode})['ciphertext'];\n var base_64_encrypted = encryptedHexArray['toString'](CryptoJS['enc']['Base64']);\n return base_64_encrypted || data;\n },\n\n 'decrypt': function(data, key, options) {\n if (!key) return data;\n options = parse_options(options);\n var iv = get_iv(options);\n var mode = get_mode(options);\n var cipher_key = get_padded_key(key, options);\n try {\n var binary_enc = CryptoJS['enc']['Base64']['parse'](data);\n var json_plain = CryptoJS['AES']['decrypt']({'ciphertext': binary_enc}, cipher_key, {'iv': iv, 'mode': mode})['toString'](CryptoJS['enc']['Utf8']);\n var plaintext = JSON['parse'](json_plain);\n return plaintext;\n }\n catch (e) {\n return undefined;\n }\n }\n };\n}\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n/* =-========================= UTIL =============================-= */\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n\nwindow['PUBNUB'] || (function() {\n\n/**\n * UTIL LOCALS\n */\n\nvar SWF = 'https://pubnub.a.ssl.fastly.net/pubnub.swf'\n, ASYNC = 'async'\n, UA = navigator.userAgent\n, PNSDK = 'PubNub-JS-' + 'Web' + '/' + '3.7.14'\n, XORIGN = UA.indexOf('MSIE 6') == -1;\n\n/**\n * CONSOLE COMPATIBILITY\n */\nwindow.console || (window.console=window.console||{});\nconsole.log || (\n console.log =\n console.error =\n ((window.opera||{}).postError||function(){})\n);\n\n/**\n * LOCAL STORAGE OR COOKIE\n */\nvar db = (function(){\n var store = {};\n var ls = false;\n try {\n ls = window['localStorage'];\n } catch (e) { }\n var cookieGet = function(key) {\n if (document.cookie.indexOf(key) == -1) return null;\n return ((document.cookie||'').match(\n RegExp(key+'=([^;]+)')\n )||[])[1] || null;\n };\n var cookieSet = function( key, value ) {\n document.cookie = key + '=' + value +\n '; expires=Thu, 1 Aug 2030 20:00:00 UTC; path=/';\n };\n var cookieTest = (function() {\n try {\n cookieSet('pnctest', '1');\n return cookieGet('pnctest') === '1';\n } catch (e) {\n return false;\n }\n }());\n return {\n 'get' : function(key) {\n try {\n if (ls) return ls.getItem(key);\n if (cookieTest) return cookieGet(key);\n return store[key];\n } catch(e) {\n return store[key];\n }\n },\n 'set' : function( key, value ) {\n try {\n if (ls) return ls.setItem( key, value ) && 0;\n if (cookieTest) cookieSet( key, value );\n store[key] = value;\n } catch(e) {\n store[key] = value;\n }\n }\n };\n})();\n\nfunction get_hmac_SHA256(data,key) {\n var hash = CryptoJS['HmacSHA256'](data, key);\n return hash.toString(CryptoJS['enc']['Base64']);\n}\n\n/**\n * $\n * =\n * var div = $('divid');\n */\nfunction $(id) { return document.getElementById(id) }\n\n/**\n * ERROR\n * =====\n * error('message');\n */\nfunction error(message) { console['error'](message) }\n\n/**\n * SEARCH\n * ======\n * var elements = search('a div span');\n */\nfunction search( elements, start) {\n var list = [];\n each( elements.split(/\\s+/), function(el) {\n each( (start || document).getElementsByTagName(el), function(node) {\n list.push(node);\n } );\n });\n return list;\n}\n\n/**\n * BIND\n * ====\n * bind( 'keydown', search('a')[0], function(element) {\n * ...\n * } );\n */\nfunction bind( type, el, fun ) {\n each( type.split(','), function(etype) {\n var rapfun = function(e) {\n if (!e) e = window.event;\n if (!fun(e)) {\n e.cancelBubble = true;\n e.preventDefault && e.preventDefault();\n e.stopPropagation && e.stopPropagation();\n }\n };\n\n if ( el.addEventListener ) el.addEventListener( etype, rapfun, false );\n else if ( el.attachEvent ) el.attachEvent( 'on' + etype, rapfun );\n else el[ 'on' + etype ] = rapfun;\n } );\n}\n\n/**\n * UNBIND\n * ======\n * unbind( 'keydown', search('a')[0] );\n */\nfunction unbind( type, el, fun ) {\n if ( el.removeEventListener ) el.removeEventListener( type, false );\n else if ( el.detachEvent ) el.detachEvent( 'on' + type, false );\n else el[ 'on' + type ] = null;\n}\n\n/**\n * HEAD\n * ====\n * head().appendChild(elm);\n */\nfunction head() { return search('head')[0] }\n\n/**\n * ATTR\n * ====\n * var attribute = attr( node, 'attribute' );\n */\nfunction attr( node, attribute, value ) {\n if (value) node.setAttribute( attribute, value );\n else return node && node.getAttribute && node.getAttribute(attribute);\n}\n\n/**\n * CSS\n * ===\n * var obj = create('div');\n */\nfunction css( element, styles ) {\n for (var style in styles) if (styles.hasOwnProperty(style))\n try {element.style[style] = styles[style] + (\n '|width|height|top|left|'.indexOf(style) > 0 &&\n typeof styles[style] == 'number'\n ? 'px' : ''\n )}catch(e){}\n}\n\n/**\n * CREATE\n * ======\n * var obj = create('div');\n */\nfunction create(element) { return document.createElement(element) }\n\n\n/**\n * jsonp_cb\n * ========\n * var callback = jsonp_cb();\n */\nfunction jsonp_cb() { return XORIGN || FDomainRequest() ? 0 : unique() }\n\n\n\n/**\n * EVENTS\n * ======\n * PUBNUB.events.bind( 'you-stepped-on-flower', function(message) {\n * // Do Stuff with message\n * } );\n *\n * PUBNUB.events.fire( 'you-stepped-on-flower', \"message-data\" );\n * PUBNUB.events.fire( 'you-stepped-on-flower', {message:\"data\"} );\n * PUBNUB.events.fire( 'you-stepped-on-flower', [1,2,3] );\n *\n */\nvar events = {\n 'list' : {},\n 'unbind' : function( name ) { events.list[name] = [] },\n 'bind' : function( name, fun ) {\n (events.list[name] = events.list[name] || []).push(fun);\n },\n 'fire' : function( name, data ) {\n each(\n events.list[name] || [],\n function(fun) { fun(data) }\n );\n }\n};\n\n/**\n * XDR Cross Domain Request\n * ========================\n * xdr({\n * url : ['http://www.blah.com/url'],\n * success : function(response) {},\n * fail : function() {}\n * });\n */\nfunction xdr( setup ) {\n if (XORIGN || FDomainRequest()) return ajax(setup);\n\n var script = create('script')\n , callback = setup.callback\n , id = unique()\n , finished = 0\n , xhrtme = setup.timeout || DEF_TIMEOUT\n , timer = timeout( function(){done(1, {\"message\" : \"timeout\"})}, xhrtme )\n , fail = setup.fail || function(){}\n , data = setup.data || {}\n , success = setup.success || function(){}\n , append = function() { head().appendChild(script) }\n , done = function( failed, response ) {\n if (finished) return;\n finished = 1;\n\n script.onerror = null;\n clearTimeout(timer);\n\n (failed || !response) || success(response);\n\n timeout( function() {\n failed && fail();\n var s = $(id)\n , p = s && s.parentNode;\n p && p.removeChild(s);\n }, SECOND );\n };\n\n window[callback] = function(response) {\n done( 0, response );\n };\n\n if (!setup.blocking) script[ASYNC] = ASYNC;\n\n script.onerror = function() { done(1) };\n script.src = build_url( setup.url, data );\n\n attr( script, 'id', id );\n\n append();\n return done;\n}\n\n/**\n * CORS XHR Request\n * ================\n * xdr({\n * url : ['http://www.blah.com/url'],\n * success : function(response) {},\n * fail : function() {}\n * });\n */\nfunction ajax( setup ) {\n var xhr, response\n , finished = function() {\n if (loaded) return;\n loaded = 1;\n\n clearTimeout(timer);\n\n try { response = JSON['parse'](xhr.responseText); }\n catch (r) { return done(1); }\n\n complete = 1;\n success(response);\n }\n , complete = 0\n , loaded = 0\n , xhrtme = setup.timeout || DEF_TIMEOUT\n , timer = timeout( function(){done(1, {\"message\" : \"timeout\"})}, xhrtme )\n , fail = setup.fail || function(){}\n , data = setup.data || {}\n , success = setup.success || function(){}\n , async = !(setup.blocking)\n , done = function(failed,response) {\n if (complete) return;\n complete = 1;\n\n clearTimeout(timer);\n\n if (xhr) {\n xhr.onerror = xhr.onload = null;\n xhr.abort && xhr.abort();\n xhr = null;\n }\n\n failed && fail(response);\n };\n\n // Send\n try {\n xhr = FDomainRequest() ||\n window.XDomainRequest &&\n new XDomainRequest() ||\n new XMLHttpRequest();\n\n xhr.onerror = xhr.onabort = function(e){ done(\n 1, e || (xhr && xhr.responseText) || { \"error\" : \"Network Connection Error\"}\n ) };\n xhr.onload = xhr.onloadend = finished;\n xhr.onreadystatechange = function() {\n if (xhr && xhr.readyState == 4) {\n switch(xhr.status) {\n case 200:\n break;\n default:\n try {\n response = JSON['parse'](xhr.responseText);\n done(1,response);\n }\n catch (r) { return done(1, {status : xhr.status, payload : null, message : xhr.responseText}); }\n return;\n }\n }\n }\n\n var url = build_url(setup.url,data);\n\n xhr.open( 'GET', url, async );\n if (async) xhr.timeout = xhrtme;\n xhr.send();\n }\n catch(eee) {\n done(0);\n XORIGN = 0;\n return xdr(setup);\n }\n\n // Return 'done'\n return done;\n}\n\n// Test Connection State\nfunction _is_online() {\n if (!('onLine' in navigator)) return 1;\n try { return navigator['onLine'] }\n catch (e) { return true }\n}\n\n\nfunction sendBeacon(url) {\n if (!('sendBeacon' in navigator)) return false;\n\n return navigator['sendBeacon'](url);\n}\n\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n/* =-========================= PUBNUB ===========================-= */\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n\nvar PDIV = $('pubnub') || 0\n, CREATE_PUBNUB = function(setup) {\n\n // Force JSONP if requested from user.\n if (setup['jsonp']) XORIGN = 0;\n else XORIGN = UA.indexOf('MSIE 6') == -1;\n\n var SUBSCRIBE_KEY = setup['subscribe_key'] || ''\n , KEEPALIVE = (+setup['keepalive'] || DEF_KEEPALIVE) * SECOND\n , UUID = setup['uuid'] || db['get'](SUBSCRIBE_KEY+'uuid')||'';\n\n var leave_on_unload = setup['leave_on_unload'] || 0;\n\n setup['xdr'] = xdr;\n setup['db'] = db;\n setup['error'] = setup['error'] || error;\n setup['_is_online'] = _is_online;\n setup['jsonp_cb'] = jsonp_cb;\n setup['hmac_SHA256']= get_hmac_SHA256;\n setup['crypto_obj'] = crypto_obj();\n setup['sendBeacon'] = sendBeacon;\n setup['params'] = { 'pnsdk' : PNSDK }\n\n var SELF = function(setup) {\n return CREATE_PUBNUB(setup);\n };\n\n var PN = PN_API(setup);\n\n for (var prop in PN) {\n if (PN.hasOwnProperty(prop)) {\n SELF[prop] = PN[prop];\n }\n }\n SELF['css'] = css;\n SELF['$'] = $;\n SELF['create'] = create;\n SELF['bind'] = bind;\n SELF['head'] = head;\n SELF['search'] = search;\n SELF['attr'] = attr;\n SELF['events'] = events;\n SELF['init'] = SELF;\n SELF['secure'] = SELF;\n SELF['crypto_obj'] = crypto_obj(); // export to instance\n\n\n // Add Leave Functions\n bind( 'beforeunload', window, function() {\n if (leave_on_unload) SELF['each-channel'](function(ch){ SELF['LEAVE']( ch.name, 0 ) });\n return true;\n } );\n\n // Return without Testing\n if (setup['notest']) return SELF;\n\n bind( 'offline', window, SELF['offline'] );\n bind( 'offline', document, SELF['offline'] );\n\n // Return PUBNUB Socket Object\n return SELF;\n};\nCREATE_PUBNUB['init'] = CREATE_PUBNUB;\nCREATE_PUBNUB['secure'] = CREATE_PUBNUB;\nCREATE_PUBNUB['crypto_obj'] = crypto_obj(); // export to constructor\n\n// Bind for PUBNUB Readiness to Subscribe\nif (document.readyState === 'complete') {\n timeout( ready, 0 );\n}\nelse {\n bind( 'load', window, function(){ timeout( ready, 0 ) } );\n}\n\nvar pdiv = PDIV || {};\n\n// CREATE A PUBNUB GLOBAL OBJECT\nPUBNUB = CREATE_PUBNUB({\n 'notest' : 1,\n 'publish_key' : attr( pdiv, 'pub-key' ),\n 'subscribe_key' : attr( pdiv, 'sub-key' ),\n 'ssl' : !document.location.href.indexOf('https') ||\n attr( pdiv, 'ssl' ) == 'on',\n 'origin' : attr( pdiv, 'origin' ),\n 'uuid' : attr( pdiv, 'uuid' )\n});\n\n// jQuery Interface\nwindow['jQuery'] && (window['jQuery']['PUBNUB'] = CREATE_PUBNUB);\n\n// For Modern JS + Testling.js - http://testling.com/\ntypeof(module) !== 'undefined' && (module['exports'] = PUBNUB) && ready();\n\nvar pubnubs = $('pubnubs') || 0;\n\n// LEAVE NOW IF NO PDIV.\nif (!PDIV) return;\n\n// PUBNUB Flash Socket\ncss( PDIV, { 'position' : 'absolute', 'top' : -SECOND } );\n\nif ('opera' in window || attr( PDIV, 'flash' )) PDIV['innerHTML'] =\n '';\n\n// Create Interface for Opera Flash\nPUBNUB['rdx'] = function( id, data ) {\n if (!data) return FDomainRequest[id]['onerror']();\n FDomainRequest[id]['responseText'] = unescape(data);\n FDomainRequest[id]['onload']();\n};\n\nfunction FDomainRequest() {\n if (!pubnubs || !pubnubs['get']) return 0;\n\n var fdomainrequest = {\n 'id' : FDomainRequest['id']++,\n 'send' : function() {},\n 'abort' : function() { fdomainrequest['id'] = {} },\n 'open' : function( method, url ) {\n FDomainRequest[fdomainrequest['id']] = fdomainrequest;\n pubnubs['get']( fdomainrequest['id'], url );\n }\n };\n\n return fdomainrequest;\n}\nFDomainRequest['id'] = SECOND;\n\n})();\n(function(){\n\n// ---------------------------------------------------------------------------\n// WEBSOCKET INTERFACE\n// ---------------------------------------------------------------------------\nvar WS = PUBNUB['ws'] = function( url, protocols ) {\n if (!(this instanceof WS)) return new WS( url, protocols );\n\n var self = this\n , url = self.url = url || ''\n , protocol = self.protocol = protocols || 'Sec-WebSocket-Protocol'\n , bits = url.split('/')\n , setup = {\n 'ssl' : bits[0] === 'wss:'\n ,'origin' : bits[2]\n ,'publish_key' : bits[3]\n ,'subscribe_key' : bits[4]\n ,'channel' : bits[5]\n };\n\n // READY STATES\n self['CONNECTING'] = 0; // The connection is not yet open.\n self['OPEN'] = 1; // The connection is open and ready to communicate.\n self['CLOSING'] = 2; // The connection is in the process of closing.\n self['CLOSED'] = 3; // The connection is closed or couldn't be opened.\n\n // CLOSE STATES\n self['CLOSE_NORMAL'] = 1000; // Normal Intended Close; completed.\n self['CLOSE_GOING_AWAY'] = 1001; // Closed Unexpecttedly.\n self['CLOSE_PROTOCOL_ERROR'] = 1002; // Server: Not Supported.\n self['CLOSE_UNSUPPORTED'] = 1003; // Server: Unsupported Protocol.\n self['CLOSE_TOO_LARGE'] = 1004; // Server: Too Much Data.\n self['CLOSE_NO_STATUS'] = 1005; // Server: No reason.\n self['CLOSE_ABNORMAL'] = 1006; // Abnormal Disconnect.\n\n // Events Default\n self['onclose'] = self['onerror'] =\n self['onmessage'] = self['onopen'] =\n self['onsend'] = function(){};\n\n // Attributes\n self['binaryType'] = '';\n self['extensions'] = '';\n self['bufferedAmount'] = 0;\n self['trasnmitting'] = false;\n self['buffer'] = [];\n self['readyState'] = self['CONNECTING'];\n\n // Close if no setup.\n if (!url) {\n self['readyState'] = self['CLOSED'];\n self['onclose']({\n 'code' : self['CLOSE_ABNORMAL'],\n 'reason' : 'Missing URL',\n 'wasClean' : true\n });\n return self;\n }\n\n // PubNub WebSocket Emulation\n self.pubnub = PUBNUB['init'](setup);\n self.pubnub.setup = setup;\n self.setup = setup;\n\n self.pubnub['subscribe']({\n 'restore' : false,\n 'channel' : setup['channel'],\n 'disconnect' : self['onerror'],\n 'reconnect' : self['onopen'],\n 'error' : function() {\n self['onclose']({\n 'code' : self['CLOSE_ABNORMAL'],\n 'reason' : 'Missing URL',\n 'wasClean' : false\n });\n },\n 'callback' : function(message) {\n self['onmessage']({ 'data' : message });\n },\n 'connect' : function() {\n self['readyState'] = self['OPEN'];\n self['onopen']();\n }\n });\n};\n\n// ---------------------------------------------------------------------------\n// WEBSOCKET SEND\n// ---------------------------------------------------------------------------\nWS.prototype.send = function(data) {\n var self = this;\n self.pubnub['publish']({\n 'channel' : self.pubnub.setup['channel'],\n 'message' : data,\n 'callback' : function(response) {\n self['onsend']({ 'data' : response });\n }\n });\n};\n\n// ---------------------------------------------------------------------------\n// WEBSOCKET CLOSE\n// ---------------------------------------------------------------------------\nWS.prototype.close = function() {\n var self = this;\n self.pubnub['unsubscribe']({ 'channel' : self.pubnub.setup['channel'] });\n self['readyState'] = self['CLOSED'];\n self['onclose']({});\n};\n\n})();\n/*\nCryptoJS v3.1.2\ncode.google.com/p/crypto-js\n(c) 2009-2013 by Jeff Mott. All rights reserved.\ncode.google.com/p/crypto-js/wiki/License\n*/\nvar CryptoJS=CryptoJS||function(h,s){var f={},g=f.lib={},q=function(){},m=g.Base={extend:function(a){q.prototype=this;var c=new q;a&&c.mixIn(a);c.hasOwnProperty(\"init\")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty(\"toString\")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},\nr=g.WordArray=m.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=s?c:4*a.length},toString:function(a){return(a||k).stringify(this)},concat:function(a){var c=this.words,d=a.words,b=this.sigBytes;a=a.sigBytes;this.clamp();if(b%4)for(var e=0;e>>2]|=(d[e>>>2]>>>24-8*(e%4)&255)<<24-8*((b+e)%4);else if(65535>>2]=d[e>>>2];else c.push.apply(c,d);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<\n32-8*(c%4);a.length=h.ceil(c/4)},clone:function(){var a=m.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],d=0;d>>2]>>>24-8*(b%4)&255;d.push((e>>>4).toString(16));d.push((e&15).toString(16))}return d.join(\"\")},parse:function(a){for(var c=a.length,d=[],b=0;b>>3]|=parseInt(a.substr(b,\n2),16)<<24-4*(b%8);return new r.init(d,c/2)}},n=l.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var d=[],b=0;b>>2]>>>24-8*(b%4)&255));return d.join(\"\")},parse:function(a){for(var c=a.length,d=[],b=0;b>>2]|=(a.charCodeAt(b)&255)<<24-8*(b%4);return new r.init(d,c)}},j=l.Utf8={stringify:function(a){try{return decodeURIComponent(escape(n.stringify(a)))}catch(c){throw Error(\"Malformed UTF-8 data\");}},parse:function(a){return n.parse(unescape(encodeURIComponent(a)))}},\nu=g.BufferedBlockAlgorithm=m.extend({reset:function(){this._data=new r.init;this._nDataBytes=0},_append:function(a){\"string\"==typeof a&&(a=j.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,d=c.words,b=c.sigBytes,e=this.blockSize,f=b/(4*e),f=a?h.ceil(f):h.max((f|0)-this._minBufferSize,0);a=f*e;b=h.min(4*a,b);if(a){for(var g=0;gn;){var j;a:{j=k;for(var u=h.sqrt(j),t=2;t<=u;t++)if(!(j%t)){j=!1;break a}j=!0}j&&(8>n&&(m[n]=l(h.pow(k,0.5))),r[n]=l(h.pow(k,1/3)),n++);k++}var a=[],f=f.SHA256=q.extend({_doReset:function(){this._hash=new g.init(m.slice(0))},_doProcessBlock:function(c,d){for(var b=this._hash.words,e=b[0],f=b[1],g=b[2],j=b[3],h=b[4],m=b[5],n=b[6],q=b[7],p=0;64>p;p++){if(16>p)a[p]=\nc[d+p]|0;else{var k=a[p-15],l=a[p-2];a[p]=((k<<25|k>>>7)^(k<<14|k>>>18)^k>>>3)+a[p-7]+((l<<15|l>>>17)^(l<<13|l>>>19)^l>>>10)+a[p-16]}k=q+((h<<26|h>>>6)^(h<<21|h>>>11)^(h<<7|h>>>25))+(h&m^~h&n)+r[p]+a[p];l=((e<<30|e>>>2)^(e<<19|e>>>13)^(e<<10|e>>>22))+(e&f^e&g^f&g);q=n;n=m;m=h;h=j+k|0;j=g;g=f;f=e;e=k+l|0}b[0]=b[0]+e|0;b[1]=b[1]+f|0;b[2]=b[2]+g|0;b[3]=b[3]+j|0;b[4]=b[4]+h|0;b[5]=b[5]+m|0;b[6]=b[6]+n|0;b[7]=b[7]+q|0},_doFinalize:function(){var a=this._data,d=a.words,b=8*this._nDataBytes,e=8*a.sigBytes;\nd[e>>>5]|=128<<24-e%32;d[(e+64>>>9<<4)+14]=h.floor(b/4294967296);d[(e+64>>>9<<4)+15]=b;a.sigBytes=4*d.length;this._process();return this._hash},clone:function(){var a=q.clone.call(this);a._hash=this._hash.clone();return a}});s.SHA256=q._createHelper(f);s.HmacSHA256=q._createHmacHelper(f)})(Math);\n\n// HMAC SHA256\n(function(){var h=CryptoJS,s=h.enc.Utf8;h.algo.HMAC=h.lib.Base.extend({init:function(f,g){f=this._hasher=new f.init;\"string\"==typeof g&&(g=s.parse(g));var h=f.blockSize,m=4*h;g.sigBytes>m&&(g=f.finalize(g));g.clamp();for(var r=this._oKey=g.clone(),l=this._iKey=g.clone(),k=r.words,n=l.words,j=0;j>>2]>>>24-8*(r%4)&255)<<16|(l[r+1>>>2]>>>24-8*((r+1)%4)&255)<<8|l[r+2>>>2]>>>24-8*((r+2)%4)&255,v=0;4>v&&r+0.75*v>>6*(3-v)&63));if(l=t.charAt(64))for(;d.length%4;)d.push(l);return d.join(\"\")},parse:function(d){var l=d.length,s=this._map,t=s.charAt(64);t&&(t=d.indexOf(t),-1!=t&&(l=t));for(var t=[],r=0,w=0;w<\nl;w++)if(w%4){var v=s.indexOf(d.charAt(w-1))<<2*(w%4),b=s.indexOf(d.charAt(w))>>>6-2*(w%4);t[r>>>2]|=(v|b)<<24-8*(r%4);r++}return p.create(t,r)},_map:\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\"}})();\n\n// BlockCipher\n(function(u){function p(b,n,a,c,e,j,k){b=b+(n&a|~n&c)+e+k;return(b<>>32-j)+n}function d(b,n,a,c,e,j,k){b=b+(n&c|a&~c)+e+k;return(b<>>32-j)+n}function l(b,n,a,c,e,j,k){b=b+(n^a^c)+e+k;return(b<>>32-j)+n}function s(b,n,a,c,e,j,k){b=b+(a^(n|~c))+e+k;return(b<>>32-j)+n}for(var t=CryptoJS,r=t.lib,w=r.WordArray,v=r.Hasher,r=t.algo,b=[],x=0;64>x;x++)b[x]=4294967296*u.abs(u.sin(x+1))|0;r=r.MD5=v.extend({_doReset:function(){this._hash=new w.init([1732584193,4023233417,2562383102,271733878])},\n_doProcessBlock:function(q,n){for(var a=0;16>a;a++){var c=n+a,e=q[c];q[c]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360}var a=this._hash.words,c=q[n+0],e=q[n+1],j=q[n+2],k=q[n+3],z=q[n+4],r=q[n+5],t=q[n+6],w=q[n+7],v=q[n+8],A=q[n+9],B=q[n+10],C=q[n+11],u=q[n+12],D=q[n+13],E=q[n+14],x=q[n+15],f=a[0],m=a[1],g=a[2],h=a[3],f=p(f,m,g,h,c,7,b[0]),h=p(h,f,m,g,e,12,b[1]),g=p(g,h,f,m,j,17,b[2]),m=p(m,g,h,f,k,22,b[3]),f=p(f,m,g,h,z,7,b[4]),h=p(h,f,m,g,r,12,b[5]),g=p(g,h,f,m,t,17,b[6]),m=p(m,g,h,f,w,22,b[7]),\nf=p(f,m,g,h,v,7,b[8]),h=p(h,f,m,g,A,12,b[9]),g=p(g,h,f,m,B,17,b[10]),m=p(m,g,h,f,C,22,b[11]),f=p(f,m,g,h,u,7,b[12]),h=p(h,f,m,g,D,12,b[13]),g=p(g,h,f,m,E,17,b[14]),m=p(m,g,h,f,x,22,b[15]),f=d(f,m,g,h,e,5,b[16]),h=d(h,f,m,g,t,9,b[17]),g=d(g,h,f,m,C,14,b[18]),m=d(m,g,h,f,c,20,b[19]),f=d(f,m,g,h,r,5,b[20]),h=d(h,f,m,g,B,9,b[21]),g=d(g,h,f,m,x,14,b[22]),m=d(m,g,h,f,z,20,b[23]),f=d(f,m,g,h,A,5,b[24]),h=d(h,f,m,g,E,9,b[25]),g=d(g,h,f,m,k,14,b[26]),m=d(m,g,h,f,v,20,b[27]),f=d(f,m,g,h,D,5,b[28]),h=d(h,f,\nm,g,j,9,b[29]),g=d(g,h,f,m,w,14,b[30]),m=d(m,g,h,f,u,20,b[31]),f=l(f,m,g,h,r,4,b[32]),h=l(h,f,m,g,v,11,b[33]),g=l(g,h,f,m,C,16,b[34]),m=l(m,g,h,f,E,23,b[35]),f=l(f,m,g,h,e,4,b[36]),h=l(h,f,m,g,z,11,b[37]),g=l(g,h,f,m,w,16,b[38]),m=l(m,g,h,f,B,23,b[39]),f=l(f,m,g,h,D,4,b[40]),h=l(h,f,m,g,c,11,b[41]),g=l(g,h,f,m,k,16,b[42]),m=l(m,g,h,f,t,23,b[43]),f=l(f,m,g,h,A,4,b[44]),h=l(h,f,m,g,u,11,b[45]),g=l(g,h,f,m,x,16,b[46]),m=l(m,g,h,f,j,23,b[47]),f=s(f,m,g,h,c,6,b[48]),h=s(h,f,m,g,w,10,b[49]),g=s(g,h,f,m,\nE,15,b[50]),m=s(m,g,h,f,r,21,b[51]),f=s(f,m,g,h,u,6,b[52]),h=s(h,f,m,g,k,10,b[53]),g=s(g,h,f,m,B,15,b[54]),m=s(m,g,h,f,e,21,b[55]),f=s(f,m,g,h,v,6,b[56]),h=s(h,f,m,g,x,10,b[57]),g=s(g,h,f,m,t,15,b[58]),m=s(m,g,h,f,D,21,b[59]),f=s(f,m,g,h,z,6,b[60]),h=s(h,f,m,g,C,10,b[61]),g=s(g,h,f,m,j,15,b[62]),m=s(m,g,h,f,A,21,b[63]);a[0]=a[0]+f|0;a[1]=a[1]+m|0;a[2]=a[2]+g|0;a[3]=a[3]+h|0},_doFinalize:function(){var b=this._data,n=b.words,a=8*this._nDataBytes,c=8*b.sigBytes;n[c>>>5]|=128<<24-c%32;var e=u.floor(a/\n4294967296);n[(c+64>>>9<<4)+15]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360;n[(c+64>>>9<<4)+14]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;b.sigBytes=4*(n.length+1);this._process();b=this._hash;n=b.words;for(a=0;4>a;a++)c=n[a],n[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return b},clone:function(){var b=v.clone.call(this);b._hash=this._hash.clone();return b}});t.MD5=v._createHelper(r);t.HmacMD5=v._createHmacHelper(r)})(Math);\n(function(){var u=CryptoJS,p=u.lib,d=p.Base,l=p.WordArray,p=u.algo,s=p.EvpKDF=d.extend({cfg:d.extend({keySize:4,hasher:p.MD5,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(d,r){for(var p=this.cfg,s=p.hasher.create(),b=l.create(),u=b.words,q=p.keySize,p=p.iterations;u.length>>2]&255}};d.BlockCipher=v.extend({cfg:v.cfg.extend({mode:b,padding:q}),reset:function(){v.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;this._mode=c.call(a,\nthis,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var n=d.CipherParams=l.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),b=(p.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;return(a?s.create([1398893684,\n1701076831]).concat(a).concat(b):b).toString(r)},parse:function(a){a=r.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=s.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return n.create({ciphertext:a,salt:c})}},a=d.SerializableCipher=l.extend({cfg:l.extend({format:b}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var l=a.createEncryptor(c,d);b=l.finalize(b);l=l.cfg;return n.create({ciphertext:b,key:c,iv:l.iv,algorithm:a,mode:l.mode,padding:l.padding,blockSize:a.blockSize,formatter:d.format})},\ndecrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return\"string\"==typeof a?b.parse(a,this):a}}),p=(p.kdf={}).OpenSSL={execute:function(a,b,c,d){d||(d=s.random(8));a=w.create({keySize:b+c}).compute(a,d);c=s.create(a.words.slice(b),4*c);a.sigBytes=4*b;return n.create({key:a,iv:c,salt:d})}},c=d.PasswordBasedCipher=a.extend({cfg:a.cfg.extend({kdf:p}),encrypt:function(b,c,d,l){l=this.cfg.extend(l);d=l.kdf.execute(d,\nb.keySize,b.ivSize);l.iv=d.iv;b=a.encrypt.call(this,b,c,d.key,l);b.mixIn(d);return b},decrypt:function(b,c,d,l){l=this.cfg.extend(l);c=this._parse(c,l.format);d=l.kdf.execute(d,b.keySize,b.ivSize,c.salt);l.iv=d.iv;return a.decrypt.call(this,b,c,d.key,l)}})}();\n\n// AES\n(function(){for(var u=CryptoJS,p=u.lib.BlockCipher,d=u.algo,l=[],s=[],t=[],r=[],w=[],v=[],b=[],x=[],q=[],n=[],a=[],c=0;256>c;c++)a[c]=128>c?c<<1:c<<1^283;for(var e=0,j=0,c=0;256>c;c++){var k=j^j<<1^j<<2^j<<3^j<<4,k=k>>>8^k&255^99;l[e]=k;s[k]=e;var z=a[e],F=a[z],G=a[F],y=257*a[k]^16843008*k;t[e]=y<<24|y>>>8;r[e]=y<<16|y>>>16;w[e]=y<<8|y>>>24;v[e]=y;y=16843009*G^65537*F^257*z^16843008*e;b[k]=y<<24|y>>>8;x[k]=y<<16|y>>>16;q[k]=y<<8|y>>>24;n[k]=y;e?(e=z^a[a[a[G^z]]],j^=a[a[j]]):e=j=1}var H=[0,1,2,4,8,\n16,32,64,128,27,54],d=d.AES=p.extend({_doReset:function(){for(var a=this._key,c=a.words,d=a.sigBytes/4,a=4*((this._nRounds=d+6)+1),e=this._keySchedule=[],j=0;j>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255]):(k=k<<8|k>>>24,k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255],k^=H[j/d|0]<<24);e[j]=e[j-d]^k}c=this._invKeySchedule=[];for(d=0;dd||4>=j?k:b[l[k>>>24]]^x[l[k>>>16&255]]^q[l[k>>>\n8&255]]^n[l[k&255]]},encryptBlock:function(a,b){this._doCryptBlock(a,b,this._keySchedule,t,r,w,v,l)},decryptBlock:function(a,c){var d=a[c+1];a[c+1]=a[c+3];a[c+3]=d;this._doCryptBlock(a,c,this._invKeySchedule,b,x,q,n,s);d=a[c+1];a[c+1]=a[c+3];a[c+3]=d},_doCryptBlock:function(a,b,c,d,e,j,l,f){for(var m=this._nRounds,g=a[b]^c[0],h=a[b+1]^c[1],k=a[b+2]^c[2],n=a[b+3]^c[3],p=4,r=1;r>>24]^e[h>>>16&255]^j[k>>>8&255]^l[n&255]^c[p++],s=d[h>>>24]^e[k>>>16&255]^j[n>>>8&255]^l[g&255]^c[p++],t=\nd[k>>>24]^e[n>>>16&255]^j[g>>>8&255]^l[h&255]^c[p++],n=d[n>>>24]^e[g>>>16&255]^j[h>>>8&255]^l[k&255]^c[p++],g=q,h=s,k=t;q=(f[g>>>24]<<24|f[h>>>16&255]<<16|f[k>>>8&255]<<8|f[n&255])^c[p++];s=(f[h>>>24]<<24|f[k>>>16&255]<<16|f[n>>>8&255]<<8|f[g&255])^c[p++];t=(f[k>>>24]<<24|f[n>>>16&255]<<16|f[g>>>8&255]<<8|f[h&255])^c[p++];n=(f[n>>>24]<<24|f[g>>>16&255]<<16|f[h>>>8&255]<<8|f[k&255])^c[p++];a[b]=q;a[b+1]=s;a[b+2]=t;a[b+3]=n},keySize:8});u.AES=p._createHelper(d)})();\n\n// Mode ECB\nCryptoJS.mode.ECB = (function () {\n var ECB = CryptoJS.lib.BlockCipherMode.extend();\n\n ECB.Encryptor = ECB.extend({\n processBlock: function (words, offset) {\n this._cipher.encryptBlock(words, offset);\n }\n });\n\n ECB.Decryptor = ECB.extend({\n processBlock: function (words, offset) {\n this._cipher.decryptBlock(words, offset);\n }\n });\n\n return ECB;\n}());// Moved to hmac-sha-256.js\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(7)(module)))\n\n/***/ },\n/* 11 */\n/***/ function(module, exports) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar Cache = (function () {\n _createClass(Cache, null, [{\n key: 'defaultPrefix',\n value: 'rc-',\n enumerable: true\n }]);\n\n function Cache(storage, prefix) {\n _classCallCheck(this, Cache);\n\n this.setPrefix(prefix);\n this._storage = storage;\n }\n\n Cache.prototype.setPrefix = function setPrefix(prefix) {\n this._prefix = prefix || Cache.defaultPrefix;\n return this;\n };\n\n Cache.prototype.setItem = function setItem(key, data) {\n this._storage[this._prefixKey(key)] = JSON.stringify(data);\n return this;\n };\n\n Cache.prototype.removeItem = function removeItem(key) {\n delete this._storage[this._prefixKey(key)];\n return this;\n };\n\n Cache.prototype.getItem = function getItem(key) {\n var item = this._storage[this._prefixKey(key)];\n if (!item) return null;\n return JSON.parse(item);\n };\n\n Cache.prototype.clean = function clean() {\n\n for (var key in this._storage) {\n\n if (!this._storage.hasOwnProperty(key)) continue;\n\n if (key.indexOf(this._prefix) === 0) {\n delete this._storage[key];\n }\n }\n\n return this;\n };\n\n Cache.prototype._prefixKey = function _prefixKey(key) {\n return this._prefix + key;\n };\n\n return Cache;\n})();\n\nexports['default'] = Cache;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 12 */\n/***/ function(module, exports) {\n\n'use strict';\n\nexports.__esModule = true;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar Observable = (function () {\n function Observable() {\n _classCallCheck(this, Observable);\n\n this.off();\n }\n\n Observable.prototype.hasListeners = function hasListeners(event) {\n return event in this._listeners;\n };\n\n Observable.prototype.on = function on(events, callback) {\n var _this = this;\n\n if (typeof events == 'string') events = [events];\n if (!events) throw new Error('No events to subscribe to');\n if (typeof callback !== 'function') throw new Error('Callback must be a function');\n\n events.forEach(function (event) {\n\n if (!_this.hasListeners(event)) _this._listeners[event] = [];\n\n _this._listeners[event].push(callback);\n });\n\n return this;\n };\n\n Observable.prototype.emit = function emit(event) {\n var _this2 = this;\n\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var result = null;\n\n if (!this.hasListeners(event)) return null;\n\n this._listeners[event].some(function (callback) {\n\n result = callback.apply(_this2, args);\n return result === false;\n });\n\n return result;\n };\n\n Observable.prototype.off = function off(event, callback) {\n var _this3 = this;\n\n if (!event) {\n\n this._listeners = {};\n } else {\n\n if (!callback) {\n\n delete this._listeners[event];\n } else {\n\n if (!this.hasListeners(event)) return this;\n\n this._listeners[event].forEach(function (cb, i) {\n\n if (cb === callback) delete _this3._listeners[event][i];\n });\n }\n }\n\n return this;\n };\n\n return Observable;\n})();\n\nexports['default'] = Observable;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 13 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _coreExternals = __webpack_require__(3);\n\nvar _Utils = __webpack_require__(2);\n\nvar Queue = (function () {\n _createClass(Queue, null, [{\n key: '_pollInterval',\n value: 250,\n enumerable: true\n }, {\n key: '_releaseTimeout',\n value: 5000,\n enumerable: true\n }]);\n\n function Queue(cache, cacheId) {\n _classCallCheck(this, Queue);\n\n this._cache = cache;\n this._cacheId = cacheId;\n this._promise = null;\n }\n\n Queue.prototype.isPaused = function isPaused() {\n\n var time = this._cache.getItem(this._cacheId);\n\n return !!time && Date.now() - parseInt(time) < Queue._releaseTimeout;\n };\n\n Queue.prototype.pause = function pause() {\n this._cache.setItem(this._cacheId, Date.now());\n return this;\n };\n\n Queue.prototype.resume = function resume() {\n this._cache.removeItem(this._cacheId);\n return this;\n };\n\n Queue.prototype.poll = function poll() {\n var _this = this;\n\n if (this._promise) return this._promise;\n\n this._promise = new _coreExternals.Promise(function (resolve, reject) {\n\n _Utils.poll(function (next) {\n\n if (_this.isPaused()) return next();\n\n _this._promise = null;\n\n _this.resume(); // this is actually not needed but why not\n\n resolve(null);\n }, Queue._pollInterval);\n });\n\n return this._promise;\n };\n\n return Queue;\n})();\n\nexports['default'] = Queue;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 14 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _coreExternals = __webpack_require__(3);\n\nvar _coreUtils = __webpack_require__(2);\n\nvar _Utils = __webpack_require__(15);\n\nvar _coreObservable = __webpack_require__(12);\n\nvar _coreObservable2 = _interopRequireDefault(_coreObservable);\n\nvar _ApiResponse = __webpack_require__(16);\n\nvar _ApiResponse2 = _interopRequireDefault(_ApiResponse);\n\nvar Client = (function (_Observable) {\n _inherits(Client, _Observable);\n\n function Client() {\n _classCallCheck(this, Client);\n\n _Observable.apply(this, arguments);\n\n this.events = {\n beforeRequest: 'beforeRequest',\n requestSuccess: 'requestSuccess',\n requestError: 'requestError'\n };\n }\n\n /**\n * @name IApiError\n * @property {string} stack\n * @property {string} originalMessage\n * @property {ApiResponse} apiResponse\n */\n\n /**\n * @param {Request} request\n * @return {Promise}\n */\n\n Client.prototype.sendRequest = function sendRequest(request) {\n var apiResponse;\n return regeneratorRuntime.async(function sendRequest$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n apiResponse = new _ApiResponse2['default'](request);\n context$2$0.prev = 1;\n\n //TODO Stop request if listeners return false\n this.emit(this.events.beforeRequest, apiResponse);\n\n context$2$0.next = 5;\n return regeneratorRuntime.awrap(this._loadResponse(request));\n\n case 5:\n apiResponse._response = context$2$0.sent;\n\n if (!(apiResponse._isMultipart() || apiResponse._isJson())) {\n context$2$0.next = 10;\n break;\n }\n\n context$2$0.next = 9;\n return regeneratorRuntime.awrap(apiResponse.response().text());\n\n case 9:\n apiResponse._text = context$2$0.sent;\n\n case 10:\n if (apiResponse.ok()) {\n context$2$0.next = 12;\n break;\n }\n\n throw new Error('Response has unsuccessful status');\n\n case 12:\n\n this.emit(this.events.requestSuccess, apiResponse);\n\n return context$2$0.abrupt('return', apiResponse);\n\n case 16:\n context$2$0.prev = 16;\n context$2$0.t0 = context$2$0['catch'](1);\n\n if (!context$2$0.t0.apiResponse) context$2$0.t0 = this.makeError(context$2$0.t0, apiResponse);\n\n this.emit(this.events.requestError, context$2$0.t0);\n\n throw context$2$0.t0;\n\n case 21:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[1, 16]]);\n };\n\n /**\n * @param {Request} request\n * @return {Promise}\n * @private\n */\n\n Client.prototype._loadResponse = function _loadResponse(request) {\n return regeneratorRuntime.async(function _loadResponse$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.next = 2;\n return regeneratorRuntime.awrap(_coreExternals.fetch.call(null, request));\n\n case 2:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 3:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n /**\n * Wraps the JS Error object with transaction information\n * @param {Error|IApiError} e\n * @param {ApiResponse} apiResponse\n * @return {IApiError}\n */\n\n Client.prototype.makeError = function makeError(e, apiResponse) {\n\n // Wrap only if regular error\n if (!e.hasOwnProperty('apiResponse') && !e.hasOwnProperty('originalMessage')) {\n\n e.apiResponse = apiResponse;\n e.originalMessage = e.message;\n e.message = apiResponse && apiResponse.error(true) || e.originalMessage;\n }\n\n return e;\n };\n\n /**\n *\n * @param {object} init\n * @param {object} [init.url]\n * @param {object} [init.body]\n * @param {string} [init.method]\n * @param {object} [init.query]\n * @param {object} [init.headers]\n * @return {Request}\n */\n\n Client.prototype.createRequest = function createRequest(init) {\n\n init = init || {};\n init.headers = init.headers || {};\n\n // Sanity checks\n if (!init.url) throw new Error('Url is not defined');\n if (!init.method) init.method = 'GET';\n if (init.method && Client._allowedMethods.indexOf(init.method) < 0) throw new Error('Method has wrong value: ' + init.method);\n\n // Defaults\n init.credentials = init.credentials || 'include';\n init.mode = init.mode || 'cors';\n\n // Append Query String\n if (init.query) {\n init.url = init.url + (init.url.indexOf('?') > -1 ? '&' : '?') + _coreUtils.queryStringify(init.query);\n }\n\n if (!_Utils.findHeaderName('Accept', init.headers)) {\n init.headers['Accept'] = _ApiResponse2['default']._jsonContentType;\n }\n\n // Serialize body\n //TODO Check that body is a plain object\n if (typeof init.body !== 'string' || !init.body) {\n\n var contentTypeHeaderName = _Utils.findHeaderName(_ApiResponse2['default']._contentType, init.headers);\n\n if (!contentTypeHeaderName) {\n contentTypeHeaderName = _ApiResponse2['default']._contentType;\n init.headers[contentTypeHeaderName] = _ApiResponse2['default']._jsonContentType;\n }\n\n var contentType = init.headers[contentTypeHeaderName];\n\n // Assign a new encoded body\n if (contentType.indexOf(_ApiResponse2['default']._jsonContentType) > -1) {\n init.body = JSON.stringify(init.body);\n } else if (contentType.indexOf(_ApiResponse2['default']._urlencodedContentType) > -1) {\n init.body = _coreUtils.queryStringify(init.body);\n }\n }\n\n // Create a request with encoded body\n var req = new _coreExternals.Request(init.url, init);\n\n // Keep the original body accessible directly (for mocks)\n req.originalBody = init.body;\n\n return req;\n };\n\n _createClass(Client, null, [{\n key: '_allowedMethods',\n value: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'],\n enumerable: true\n }]);\n\n return Client;\n})(_coreObservable2['default']);\n\nexports['default'] = Client;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 15 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\nexports.createResponse = createResponse;\nexports.findHeaderName = findHeaderName;\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nvar _coreExternals = __webpack_require__(3);\n\nvar _coreUtils = __webpack_require__(2);\n\nvar utils = _interopRequireWildcard(_coreUtils);\n\n/**\n * Creates a response\n * @param stringBody\n * @param init\n * @return {Response}\n */\n\nfunction createResponse(stringBody, init) {\n\n init = init || {};\n\n var response = new _coreExternals.Response(stringBody, init);\n\n //TODO Wait for https://github.com/bitinn/node-fetch/issues/38\n if (utils.isNodeJS()) {\n\n response._text = stringBody;\n response._decode = function () {\n return this._text;\n };\n }\n\n return response;\n}\n\nfunction findHeaderName(name, headers) {\n name = name.toLowerCase();\n return Object.keys(headers).reduce(function (res, key) {\n if (res) return res;\n if (name == key.toLowerCase()) return key;\n return res;\n }, null);\n}\n\n/***/ },\n/* 16 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _coreExternals = __webpack_require__(3);\n\nvar _Utils = __webpack_require__(15);\n\nvar utils = _interopRequireWildcard(_Utils);\n\nvar ApiResponse = (function () {\n _createClass(ApiResponse, null, [{\n key: '_contentType',\n value: 'Content-Type',\n enumerable: true\n }, {\n key: '_jsonContentType',\n value: 'application/json',\n enumerable: true\n }, {\n key: '_multipartContentType',\n value: 'multipart/mixed',\n enumerable: true\n }, {\n key: '_urlencodedContentType',\n value: 'application/x-www-form-urlencoded',\n enumerable: true\n }, {\n key: '_headerSeparator',\n value: ':',\n enumerable: true\n }, {\n key: '_bodySeparator',\n value: '\\n\\n',\n enumerable: true\n }, {\n key: '_boundarySeparator',\n value: '--',\n\n /**\n * @param {Request} request\n * @param {Response} response\n * @param {string} responseText\n */\n enumerable: true\n }]);\n\n function ApiResponse(request, response, responseText) {\n _classCallCheck(this, ApiResponse);\n\n /** @type {Request} */\n this._request = request;\n\n /** @type {Response} */\n this._response = response;\n\n this._text = responseText;\n this._json = null;\n this._multipart = [];\n }\n\n /**\n * @return {Response}\n */\n\n ApiResponse.prototype.response = function response() {\n return this._response;\n };\n\n /**\n * @return {Request}\n */\n\n ApiResponse.prototype.request = function request() {\n return this._request;\n };\n\n /**\n * @return {boolean}\n */\n\n ApiResponse.prototype.ok = function ok() {\n return this._response && this._response.ok;\n };\n\n /**\n * @return {string}\n */\n\n ApiResponse.prototype.text = function text() {\n if (!this._isJson() && !this._isMultipart()) throw new Error('Response is not text');\n return this._text;\n };\n\n /**\n * @return {object}\n */\n\n ApiResponse.prototype.json = function json() {\n if (!this._isJson()) throw new Error('Response is not JSON');\n if (!this._json) {\n this._json = this._text ? JSON.parse(this._text) : null;\n }\n return this._json;\n };\n\n /**\n * @param [skipOKCheck]\n * @return {string}\n */\n\n ApiResponse.prototype.error = function error(skipOKCheck) {\n\n if (this.ok() && !skipOKCheck) return null;\n\n var message = (this._response && this._response.status ? this._response.status + ' ' : '') + (this._response && this._response.statusText ? this._response.statusText : '');\n\n try {\n\n if (this.json().message) message = this.json().message;\n if (this.json().error_description) message = this.json().error_description;\n if (this.json().description) message = this.json().description;\n } catch (e) {}\n\n return message;\n };\n\n /**\n * @return {ApiResponse[]}\n */\n\n ApiResponse.prototype.multipart = function multipart() {\n\n if (!this._isMultipart()) throw new Error('Response is not multipart');\n\n if (!this._multipart.length) {\n\n // Step 1. Split multipart response\n\n var text = this.text();\n\n if (!text) throw new Error('No response body');\n\n var boundary = this._getContentType().match(/boundary=([^;]+)/i)[1];\n\n if (!boundary) throw new Error('Cannot find boundary');\n\n var parts = text.toString().split(ApiResponse._boundarySeparator + boundary);\n\n if (parts[0].trim() === '') parts.shift();\n if (parts[parts.length - 1].trim() == ApiResponse._boundarySeparator) parts.pop();\n\n if (parts.length < 1) throw new Error('No parts in body');\n\n // Step 2. Parse status info\n\n var statusInfo = ApiResponse.create(parts.shift(), this._response.status, this._response.statusText).json();\n\n // Step 3. Parse all other parts\n\n this._multipart = parts.map(function (part, i) {\n\n var status = statusInfo.response[i].status;\n\n return ApiResponse.create(part, status);\n });\n }\n\n return this._multipart;\n };\n\n ApiResponse.prototype._isContentType = function _isContentType(contentType) {\n return this._getContentType().indexOf(contentType) > -1;\n };\n\n ApiResponse.prototype._getContentType = function _getContentType() {\n return this._response.headers.get(ApiResponse._contentType) || '';\n };\n\n ApiResponse.prototype._isMultipart = function _isMultipart() {\n return this._isContentType(ApiResponse._multipartContentType);\n };\n\n ApiResponse.prototype._isUrlEncoded = function _isUrlEncoded() {\n return this._isContentType(ApiResponse._urlencodedContentType);\n };\n\n ApiResponse.prototype._isJson = function _isJson() {\n return this._isContentType(ApiResponse._jsonContentType);\n };\n\n /**\n * Method is used to create ApiResponse object from string parts of multipart/mixed response\n * @param {string} [text]\n * @param {number} [status]\n * @param {string} [statusText]\n * @return {ApiResponse}\n */\n\n ApiResponse.create = function create(text, status, statusText) {\n\n text = text || '';\n status = status || 200;\n statusText = statusText || 'OK';\n\n text = text.replace(/\\r/g, '');\n\n var headers = new _coreExternals.Headers(),\n headersAndBody = text.split(ApiResponse._bodySeparator),\n headersText = headersAndBody.length > 1 ? headersAndBody.shift() : '';\n\n text = headersAndBody.join(ApiResponse._bodySeparator);\n\n (headersText || '').split('\\n').forEach(function (header) {\n\n var split = header.trim().split(ApiResponse._headerSeparator),\n key = split.shift().trim(),\n value = split.join(ApiResponse._headerSeparator).trim();\n\n if (key) headers.append(key, value);\n });\n\n return new ApiResponse(null, utils.createResponse(text, {\n headers: headers,\n status: status,\n statusText: statusText\n }), text);\n };\n\n return ApiResponse;\n})();\n\nexports['default'] = ApiResponse;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 17 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _Registry = __webpack_require__(18);\n\nvar _Registry2 = _interopRequireDefault(_Registry);\n\nvar _httpClient = __webpack_require__(14);\n\nvar _httpClient2 = _interopRequireDefault(_httpClient);\n\nvar Client = (function (_HttpClient) {\n _inherits(Client, _HttpClient);\n\n function Client() {\n _classCallCheck(this, Client);\n\n _HttpClient.call(this);\n this._registry = new _Registry2['default']();\n }\n\n Client.prototype.registry = function registry() {\n return this._registry;\n };\n\n Client.prototype._loadResponse = function _loadResponse(request) {\n var mock;\n return regeneratorRuntime.async(function _loadResponse$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n mock = this._registry.find(request);\n context$2$0.next = 3;\n return regeneratorRuntime.awrap(mock.getResponse(request));\n\n case 3:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 4:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n return Client;\n})(_httpClient2['default']);\n\nexports['default'] = Client;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 18 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _Mock = __webpack_require__(19);\n\nvar _Mock2 = _interopRequireDefault(_Mock);\n\nvar Registry = (function () {\n function Registry() {\n _classCallCheck(this, Registry);\n\n this._mocks = [];\n }\n\n Registry.prototype.add = function add(mock) {\n this._mocks.push(mock);\n return this;\n };\n\n Registry.prototype.clear = function clear() {\n this._mocks = [];\n return this;\n };\n\n Registry.prototype.find = function find(request) {\n\n //console.log('Registry is looking for', request);\n\n var mock = this._mocks.shift();\n\n if (!mock) throw new Error('No mock in registry for request ' + request.method + ' ' + request.url);\n\n if (!mock.test(request)) throw new Error('Wrong request ' + request.method + ' ' + request.url + ' for expected mock ' + mock.method() + ' ' + mock.path());\n\n return mock;\n };\n\n Registry.prototype.apiCall = function apiCall(method, path, response, status, statusText) {\n\n this.add(new _Mock2['default'](method, path, response, status, statusText));\n\n return this;\n };\n\n Registry.prototype.authentication = function authentication() {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'access_token': 'ACCESS_TOKEN',\n 'token_type': 'bearer',\n 'expires_in': 3600,\n 'refresh_token': 'REFRESH_TOKEN',\n 'refresh_token_expires_in': 60480,\n 'scope': 'SMS RCM Foo Boo',\n 'expireTime': new Date().getTime() + 3600000\n });\n\n return this;\n };\n\n Registry.prototype.logout = function logout() {\n\n this.apiCall('POST', '/restapi/oauth/revoke', {});\n\n return this;\n };\n\n Registry.prototype.presenceLoad = function presenceLoad(id) {\n\n this.apiCall('GET', '/restapi/v1.0/account/~/extension/' + id + '/presence', {\n \"uri\": \"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/\" + id + \"/presence\",\n \"extension\": {\n \"uri\": \"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/\" + id,\n \"id\": id,\n \"extensionNumber\": \"101\"\n },\n \"activeCalls\": [],\n \"presenceStatus\": \"Available\",\n \"telephonyStatus\": \"Ringing\",\n \"userStatus\": \"Available\",\n \"dndStatus\": \"TakeAllCalls\",\n \"extensionId\": id\n });\n\n return this;\n };\n\n Registry.prototype.subscribeGeneric = function subscribeGeneric(expiresIn) {\n\n expiresIn = expiresIn || 15 * 60 * 60;\n\n var date = new Date();\n\n this.apiCall('POST', '/restapi/v1.0/subscription', {\n 'eventFilters': ['/restapi/v1.0/account/~/extension/~/presence'],\n 'expirationTime': new Date(date.getTime() + expiresIn * 1000).toISOString(),\n 'expiresIn': expiresIn,\n 'deliveryMode': {\n 'transportType': 'PubNub',\n 'encryption': false,\n 'address': '123_foo',\n 'subscriberKey': 'sub-c-foo',\n 'secretKey': 'sec-c-bar'\n },\n 'id': 'foo-bar-baz',\n 'creationTime': date.toISOString(),\n 'status': 'Active',\n 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz'\n });\n\n return this;\n };\n\n Registry.prototype.subscribeOnPresence = function subscribeOnPresence(id, detailed) {\n\n id = id || '1';\n\n var date = new Date();\n\n this.apiCall('POST', '/restapi/v1.0/subscription', {\n 'eventFilters': ['/restapi/v1.0/account/~/extension/' + id + '/presence' + (detailed ? '?detailedTelephonyState=true' : '')],\n 'expirationTime': new Date(date.getTime() + 15 * 60 * 60 * 1000).toISOString(),\n 'deliveryMode': {\n 'transportType': 'PubNub',\n 'encryption': true,\n 'address': '123_foo',\n 'subscriberKey': 'sub-c-foo',\n 'secretKey': 'sec-c-bar',\n 'encryptionAlgorithm': 'AES',\n 'encryptionKey': 'VQwb6EVNcQPBhE/JgFZ2zw=='\n },\n 'creationTime': date.toISOString(),\n 'id': 'foo-bar-baz',\n 'status': 'Active',\n 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz'\n });\n\n return this;\n };\n\n Registry.prototype.tokenRefresh = function tokenRefresh(failure) {\n\n if (!failure) {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'access_token': 'ACCESS_TOKEN_FROM_REFRESH',\n 'token_type': 'bearer',\n 'expires_in': 3600,\n 'refresh_token': 'REFRESH_TOKEN_FROM_REFRESH',\n 'refresh_token_expires_in': 60480,\n 'scope': 'SMS RCM Foo Boo'\n });\n } else {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'message': 'Wrong token',\n 'error_description': 'Wrong token',\n 'description': 'Wrong token'\n }, 400);\n }\n\n return this;\n };\n\n return Registry;\n})();\n\nexports['default'] = Registry;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 19 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _httpApiResponse = __webpack_require__(16);\n\nvar _httpApiResponse2 = _interopRequireDefault(_httpApiResponse);\n\nvar _coreUtils = __webpack_require__(2);\n\nvar _httpUtils = __webpack_require__(15);\n\nvar Mock = (function () {\n function Mock(method, path, json, status, statusText, delay) {\n _classCallCheck(this, Mock);\n\n this._method = method.toUpperCase();\n this._path = path;\n this._json = json || {};\n this._delay = delay || 10;\n this._status = status || 200;\n this._statusText = statusText || 'OK';\n }\n\n Mock.prototype.path = function path() {\n return this._path;\n };\n\n Mock.prototype.method = function method() {\n return this._method;\n };\n\n Mock.prototype.test = function test(request) {\n\n return request.url.indexOf(this._path) > -1 && request.method.toUpperCase() == this._method;\n };\n\n Mock.prototype.getResponse = function getResponse(request) {\n return regeneratorRuntime.async(function getResponse$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.next = 2;\n return regeneratorRuntime.awrap(_coreUtils.delay(this._delay));\n\n case 2:\n return context$2$0.abrupt('return', this.createResponse(this._json));\n\n case 3:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n Mock.prototype.createResponse = function createResponse(json, init) {\n\n init = init || {};\n\n init.status = init.status || this._status;\n init.statusText = init.statusText || this._statusText;\n\n var str = JSON.stringify(json),\n res = _httpUtils.createResponse(str, init);\n\n res.headers.set(_httpApiResponse2['default']._contentType, _httpApiResponse2['default']._jsonContentType);\n\n return res;\n };\n\n return Mock;\n})();\n\nexports['default'] = Mock;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 20 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _coreObservable = __webpack_require__(12);\n\nvar _coreObservable2 = _interopRequireDefault(_coreObservable);\n\nvar _coreQueue = __webpack_require__(13);\n\nvar _coreQueue2 = _interopRequireDefault(_coreQueue);\n\nvar _Auth = __webpack_require__(21);\n\nvar _Auth2 = _interopRequireDefault(_Auth);\n\nvar _coreExternals = __webpack_require__(3);\n\nvar _coreUtils = __webpack_require__(2);\n\nvar Platform = (function (_Observable) {\n _inherits(Platform, _Observable);\n\n _createClass(Platform, null, [{\n key: '_urlPrefix',\n value: '/restapi',\n enumerable: true\n }, {\n key: '_apiVersion',\n value: 'v1.0',\n enumerable: true\n }, {\n key: '_accessTokenTtl',\n value: null,\n // Platform server by default sets it to 60 * 60 = 1 hour\n enumerable: true\n }, {\n key: '_refreshTokenTtl',\n value: 10 * 60 * 60,\n // 10 hours\n enumerable: true\n }, {\n key: '_refreshTokenTtlRemember',\n value: 7 * 24 * 60 * 60,\n // 1 week\n enumerable: true\n }, {\n key: '_tokenEndpoint',\n value: '/restapi/oauth/token',\n enumerable: true\n }, {\n key: '_revokeEndpoint',\n value: '/restapi/oauth/revoke',\n enumerable: true\n }, {\n key: '_authorizeEndpoint',\n value: '/restapi/oauth/authorize',\n enumerable: true\n }, {\n key: '_refreshDelayMs',\n value: 100,\n enumerable: true\n }, {\n key: '_cacheId',\n value: 'platform',\n enumerable: true\n }, {\n key: '_clearCacheOnRefreshError',\n value: true,\n enumerable: true\n }]);\n\n function Platform(client, cache, server, appKey, appSecret) {\n _classCallCheck(this, Platform);\n\n _Observable.call(this);\n\n this.events = {\n beforeLogin: 'beforeLogin',\n loginSuccess: 'loginSuccess',\n loginError: 'loginError',\n beforeRefresh: 'beforeRefresh',\n refreshSuccess: 'refreshSuccess',\n refreshError: 'refreshError',\n beforeLogout: 'beforeLogout',\n logoutSuccess: 'logoutSuccess',\n logoutError: 'logoutError'\n };\n this._server = server;\n this._appKey = appKey;\n this._appSecret = appSecret;\n\n /** @type {Cache} */\n this._cache = cache;\n\n /** @type {Client} */\n this._client = client;\n\n this._queue = new _coreQueue2['default'](this._cache, Platform._cacheId + '-refresh');\n\n this._auth = new _Auth2['default'](this._cache, Platform._cacheId);\n }\n\n /**\n * @return {Auth}\n */\n\n Platform.prototype.auth = function auth() {\n return this._auth;\n };\n\n /**\n * @return {Client}\n */\n\n Platform.prototype.client = function client() {\n return this._client;\n };\n\n /**\n * @param {string} path\n * @param {object} [options]\n * @param {boolean} [options.addServer]\n * @param {string} [options.addMethod]\n * @param {boolean} [options.addToken]\n * @return {string}\n */\n\n Platform.prototype.createUrl = function createUrl(path, options) {\n\n path = path || '';\n options = options || {};\n\n var builtUrl = '',\n hasHttp = path.indexOf('http://') != -1 || path.indexOf('https://') != -1;\n\n if (options.addServer && !hasHttp) builtUrl += this._server;\n\n if (path.indexOf(Platform._urlPrefix) == -1 && !hasHttp) builtUrl += Platform._urlPrefix + '/' + Platform._apiVersion;\n\n builtUrl += path;\n\n if (options.addMethod || options.addToken) builtUrl += path.indexOf('?') > -1 ? '&' : '?';\n\n if (options.addMethod) builtUrl += '_method=' + options.addMethod;\n if (options.addToken) builtUrl += (options.addMethod ? '&' : '') + 'access_token=' + this._auth.accessToken();\n\n return builtUrl;\n };\n\n /**\n * @param {string} options.redirectUri\n * @param {string} options.state\n * @param {string} options.brandId\n * @param {string} options.display\n * @param {string} options.prompt\n * @return {string}\n */\n\n Platform.prototype.authUrl = function authUrl(options) {\n\n options = options || {};\n\n return this.createUrl(Platform._authorizeEndpoint + '?' + _coreUtils.queryStringify({\n 'response_type': 'code',\n 'redirect_uri': options.redirectUri || '',\n 'client_id': this._appKey,\n 'state': options.state || '',\n 'brand_id': options.brandId || '',\n 'display': options.display || '',\n 'prompt': options.prompt || ''\n }), { addServer: true });\n };\n\n /**\n * @param {string} url\n * @return {Object}\n */\n\n Platform.prototype.parseAuthRedirectUrl = function parseAuthRedirectUrl(url) {\n\n var qs = _coreUtils.parseQueryString(url.split('?').reverse()[0]),\n error = qs.error_description || qs.error;\n\n if (error) {\n var e = new Error(error);\n e.error = qs.error;\n throw e;\n }\n\n return qs;\n };\n\n /**\n * @return {Promise}\n */\n\n Platform.prototype.loggedIn = function loggedIn() {\n return regeneratorRuntime.async(function loggedIn$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n context$2$0.next = 3;\n return regeneratorRuntime.awrap(this._ensureAuthentication());\n\n case 3:\n return context$2$0.abrupt('return', true);\n\n case 6:\n context$2$0.prev = 6;\n context$2$0.t0 = context$2$0['catch'](0);\n return context$2$0.abrupt('return', false);\n\n case 9:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 6]]);\n };\n\n /**\n * @param {string} options.username\n * @param {string} options.password\n * @param {string} options.extension\n * @param {string} options.code\n * @param {string} options.redirectUri\n * @param {string} options.endpointId\n * @returns {Promise}\n */\n\n Platform.prototype.login = function login(options) {\n var body, apiResponse, json;\n return regeneratorRuntime.async(function login$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n\n options = options || {};\n\n options.remember = options.remember || false;\n\n this.emit(this.events.beforeLogin);\n\n body = {\n \"access_token_ttl\": Platform._accessTokenTtl,\n \"refresh_token_ttl\": options.remember ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl\n };\n\n if (!options.code) {\n\n body.grant_type = 'password';\n body.username = options.username;\n body.password = options.password;\n body.extension = options.extension || '';\n } else if (options.code) {\n\n body.grant_type = 'authorization_code';\n body.code = options.code;\n body.redirect_uri = options.redirectUri;\n //body.client_id = this.getCredentials().key; // not needed\n }\n\n if (options.endpointId) body.endpoint_id = options.endpointId;\n\n context$2$0.next = 9;\n return regeneratorRuntime.awrap(this._tokenRequest(Platform._tokenEndpoint, body));\n\n case 9:\n apiResponse = context$2$0.sent;\n json = apiResponse.json();\n\n this._auth.setData(json).setRemember(options.remember);\n\n this.emit(this.events.loginSuccess, apiResponse);\n\n return context$2$0.abrupt('return', apiResponse);\n\n case 16:\n context$2$0.prev = 16;\n context$2$0.t0 = context$2$0['catch'](0);\n\n this._cache.clean();\n\n this.emit(this.events.loginError, context$2$0.t0);\n\n throw context$2$0.t0;\n\n case 21:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 16]]);\n };\n\n /**\n * @returns {Promise}\n */\n\n Platform.prototype.refresh = function refresh() {\n var res, json;\n return regeneratorRuntime.async(function refresh$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n\n this.emit(this.events.beforeRefresh);\n\n if (!this._queue.isPaused()) {\n context$2$0.next = 9;\n break;\n }\n\n context$2$0.next = 5;\n return regeneratorRuntime.awrap(this._queue.poll());\n\n case 5:\n if (this._isAccessTokenValid()) {\n context$2$0.next = 7;\n break;\n }\n\n throw new Error('Automatic authentification timeout');\n\n case 7:\n\n this.emit(this.events.refreshSuccess, null);\n\n return context$2$0.abrupt('return', null);\n\n case 9:\n\n this._queue.pause();\n\n // Make sure all existing AJAX calls had a chance to reach the server\n context$2$0.next = 12;\n return regeneratorRuntime.awrap(_coreUtils.delay(Platform._refreshDelayMs));\n\n case 12:\n if (this._auth.refreshToken()) {\n context$2$0.next = 14;\n break;\n }\n\n throw new Error('Refresh token is missing');\n\n case 14:\n if (this._auth.refreshTokenValid()) {\n context$2$0.next = 16;\n break;\n }\n\n throw new Error('Refresh token has expired');\n\n case 16:\n if (this._queue.isPaused()) {\n context$2$0.next = 18;\n break;\n }\n\n throw new Error('Queue was resumed before refresh call');\n\n case 18:\n context$2$0.next = 20;\n return regeneratorRuntime.awrap(this._tokenRequest(Platform._tokenEndpoint, {\n \"grant_type\": \"refresh_token\",\n \"refresh_token\": this._auth.refreshToken(),\n \"access_token_ttl\": Platform._accessTokenTtl,\n \"refresh_token_ttl\": this._auth.remember() ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl\n }));\n\n case 20:\n res = context$2$0.sent;\n json = res.json();\n\n if (json.access_token) {\n context$2$0.next = 24;\n break;\n }\n\n throw this._client.makeError(new Error('Malformed OAuth response'), res);\n\n case 24:\n\n this._auth.setData(json);\n this._queue.resume();\n\n this.emit(this.events.refreshSuccess, res);\n\n return context$2$0.abrupt('return', res);\n\n case 30:\n context$2$0.prev = 30;\n context$2$0.t0 = context$2$0['catch'](0);\n\n context$2$0.t0 = this._client.makeError(context$2$0.t0);\n\n if (Platform._clearCacheOnRefreshError) {\n this._cache.clean();\n }\n\n this.emit(this.events.refreshError, context$2$0.t0);\n\n throw context$2$0.t0;\n\n case 36:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 30]]);\n };\n\n /**\n * @returns {Promise}\n */\n\n Platform.prototype.logout = function logout() {\n var res;\n return regeneratorRuntime.async(function logout$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n\n this.emit(this.events.beforeLogout);\n\n this._queue.pause();\n\n context$2$0.next = 5;\n return regeneratorRuntime.awrap(this._tokenRequest(Platform._revokeEndpoint, {\n token: this._auth.accessToken()\n }));\n\n case 5:\n res = context$2$0.sent;\n\n this._queue.resume();\n this._cache.clean();\n\n this.emit(this.events.logoutSuccess, res);\n\n return context$2$0.abrupt('return', res);\n\n case 12:\n context$2$0.prev = 12;\n context$2$0.t0 = context$2$0['catch'](0);\n\n this._queue.resume();\n\n this.emit(this.events.logoutError, context$2$0.t0);\n\n throw context$2$0.t0;\n\n case 17:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 12]]);\n };\n\n /**\n * @param {Request} request\n * @param {object} [options]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n\n Platform.prototype.inflateRequest = function inflateRequest(request, options) {\n return regeneratorRuntime.async(function inflateRequest$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n\n options = options || {};\n\n if (!options.skipAuthCheck) {\n context$2$0.next = 3;\n break;\n }\n\n return context$2$0.abrupt('return', request);\n\n case 3:\n context$2$0.next = 5;\n return regeneratorRuntime.awrap(this._ensureAuthentication());\n\n case 5:\n\n request.headers.set('Authorization', this._authHeader());\n //request.url = this.createUrl(request.url, {addServer: true}); //FIXME Spec prevents this...\n\n //TODO Add User-Agent here\n\n return context$2$0.abrupt('return', request);\n\n case 7:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n /**\n * @param {Request} request\n * @param {object} [options]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n\n Platform.prototype.sendRequest = function sendRequest(request, options) {\n return regeneratorRuntime.async(function sendRequest$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n context$2$0.next = 3;\n return regeneratorRuntime.awrap(this.inflateRequest(request, options));\n\n case 3:\n request = context$2$0.sent;\n context$2$0.next = 6;\n return regeneratorRuntime.awrap(this._client.sendRequest(request));\n\n case 6:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 9:\n context$2$0.prev = 9;\n context$2$0.t0 = context$2$0['catch'](0);\n\n if (!(!context$2$0.t0.apiResponse || !context$2$0.t0.apiResponse.response() || context$2$0.t0.apiResponse.response().status != 401)) {\n context$2$0.next = 13;\n break;\n }\n\n throw context$2$0.t0;\n\n case 13:\n\n this._auth.cancelAccessToken();\n\n context$2$0.next = 16;\n return regeneratorRuntime.awrap(this.sendRequest(request, options));\n\n case 16:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 17:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 9]]);\n };\n\n /**\n * General purpose function to send anything to server\n * @param {string} options.url\n * @param {object} [options.body]\n * @param {string} [options.method]\n * @param {object} [options.query]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n\n Platform.prototype.send = function send() {\n var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n return regeneratorRuntime.async(function send$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n\n //FIXME https://github.com/bitinn/node-fetch/issues/43\n options.url = this.createUrl(options.url, { addServer: true });\n\n context$2$0.next = 3;\n return regeneratorRuntime.awrap(this.sendRequest(this._client.createRequest(options), options));\n\n case 3:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 4:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n /**\n * @param {string} url\n * @param {object} [query]\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n\n Platform.prototype.get = function get(url, query, options) {\n return regeneratorRuntime.async(function get$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n options = options || {};\n options.method = 'GET';\n options.url = url;\n options.query = query;\n context$2$0.next = 6;\n return regeneratorRuntime.awrap(this.send(options));\n\n case 6:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 7:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n /**\n * @param {string} url\n * @param {object} body\n * @param {object} [query]\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n\n Platform.prototype.post = function post(url, body, query, options) {\n return regeneratorRuntime.async(function post$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n options = options || {};\n options.method = 'POST';\n options.url = url;\n options.query = query;\n options.body = body;\n context$2$0.next = 7;\n return regeneratorRuntime.awrap(this.send(options));\n\n case 7:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 8:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n /**\n * @param {string} url\n * @param {object} [body]\n * @param {object} [query]\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n\n Platform.prototype.put = function put(url, body, query, options) {\n return regeneratorRuntime.async(function put$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n options = options || {};\n options.method = 'PUT';\n options.url = url;\n options.query = query;\n options.body = body;\n context$2$0.next = 7;\n return regeneratorRuntime.awrap(this.send(options));\n\n case 7:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 8:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n /**\n * @param {string} url\n * @param {string} [query]\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n\n Platform.prototype['delete'] = function _delete(url, query, options) {\n return regeneratorRuntime.async(function _delete$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n options = options || {};\n options.method = 'DELETE';\n options.url = url;\n options.query = query;\n context$2$0.next = 6;\n return regeneratorRuntime.awrap(this.send(options));\n\n case 6:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 7:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n Platform.prototype._tokenRequest = function _tokenRequest(path, body) {\n return regeneratorRuntime.async(function _tokenRequest$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.next = 2;\n return regeneratorRuntime.awrap(this.send({\n url: path,\n skipAuthCheck: true,\n body: body,\n method: 'POST',\n headers: {\n 'Authorization': 'Basic ' + this._apiKey(),\n 'Content-Type': 'application/x-www-form-urlencoded'\n }\n }));\n\n case 2:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 3:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n Platform.prototype._ensureAuthentication = function _ensureAuthentication() {\n return regeneratorRuntime.async(function _ensureAuthentication$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n if (!this._isAccessTokenValid()) {\n context$2$0.next = 2;\n break;\n }\n\n return context$2$0.abrupt('return', null);\n\n case 2:\n context$2$0.next = 4;\n return regeneratorRuntime.awrap(this.refresh());\n\n case 4:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 5:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n Platform.prototype._isAccessTokenValid = function _isAccessTokenValid() {\n\n return this._auth.accessTokenValid() && !this._queue.isPaused();\n };\n\n Platform.prototype._apiKey = function _apiKey() {\n var apiKey = this._appKey + ':' + this._appSecret;\n return typeof btoa == 'function' ? btoa(apiKey) : new Buffer(apiKey).toString('base64');\n };\n\n Platform.prototype._authHeader = function _authHeader() {\n var token = this._auth.accessToken();\n return this._auth.tokenType() + (token ? ' ' + token : '');\n };\n\n return Platform;\n})(_coreObservable2['default']);\n\nexports['default'] = Platform;\nmodule.exports = exports['default'];\n\n// Perform sanity checks\n\n/** @type {ApiResponse} */\n\n// Guard is for errors that come from polling\n\n/***/ },\n/* 21 */\n/***/ function(module, exports) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar Auth = (function () {\n _createClass(Auth, null, [{\n key: 'refreshHandicapMs',\n value: 60 * 1000,\n // 1 minute\n enumerable: true\n }, {\n key: 'forcedTokenType',\n value: 'forced',\n enumerable: true\n }]);\n\n function Auth(cache, cacheId) {\n _classCallCheck(this, Auth);\n\n /** @type {Cache} */\n this._cache = cache;\n this._cacheId = cacheId;\n }\n\n //export interface IAuthData {\n // remember?:boolean;\n // token_type?:string;\n // access_token?:string;\n // expires_in?:number; // actually it's string\n // expire_time?:number;\n // refresh_token?:string;\n // refresh_token_expires_in?:number; // actually it's string\n // refresh_token_expire_time?:number;\n // scope?:string;\n //}\n\n Auth.prototype.accessToken = function accessToken() {\n return this.data().access_token;\n };\n\n Auth.prototype.refreshToken = function refreshToken() {\n return this.data().refresh_token;\n };\n\n Auth.prototype.tokenType = function tokenType() {\n return this.data().token_type;\n };\n\n /**\n * @return {{token_type: string, access_token: string, expires_in: number, refresh_token: string, refresh_token_expires_in: number}}\n */\n\n Auth.prototype.data = function data() {\n\n return this._cache.getItem(this._cacheId) || {\n token_type: '',\n access_token: '',\n expires_in: 0,\n refresh_token: '',\n refresh_token_expires_in: 0\n };\n };\n\n /**\n * @param {object} newData\n * @return {Auth}\n */\n\n Auth.prototype.setData = function setData(newData) {\n\n newData = newData || {};\n\n var data = this.data();\n\n Object.keys(newData).forEach(function (key) {\n data[key] = newData[key];\n });\n\n data.expire_time = Date.now() + data.expires_in * 1000;\n data.refresh_token_expire_time = Date.now() + data.refresh_token_expires_in * 1000;\n\n this._cache.setItem(this._cacheId, data);\n\n return this;\n };\n\n /**\n * Check if there is a valid (not expired) access token\n * @return {boolean}\n */\n\n Auth.prototype.accessTokenValid = function accessTokenValid() {\n\n var authData = this.data();\n return authData.token_type === Auth.forcedTokenType || authData.expire_time - Auth.refreshHandicapMs > Date.now();\n };\n\n /**\n * Check if there is a valid (not expired) access token\n * @return {boolean}\n */\n\n Auth.prototype.refreshTokenValid = function refreshTokenValid() {\n\n return this.data().refresh_token_expire_time > Date.now();\n };\n\n /**\n * @return {Auth}\n */\n\n Auth.prototype.cancelAccessToken = function cancelAccessToken() {\n\n return this.setData({\n access_token: '',\n expires_in: 0\n });\n };\n\n /**\n * This method sets a special authentication mode used in Service Web\n * @return {Auth}\n */\n\n Auth.prototype.forceAuthentication = function forceAuthentication() {\n\n this.setData({\n token_type: Auth.forcedTokenType,\n access_token: '',\n expires_in: 0,\n refresh_token: '',\n refresh_token_expires_in: 0\n });\n\n return this;\n };\n\n /**\n * @param remember\n * @return {Auth}\n */\n\n Auth.prototype.setRemember = function setRemember(remember) {\n\n return this.setData({ remember: remember });\n };\n\n /**\n * @return {boolean}\n */\n\n Auth.prototype.remember = function remember() {\n\n return !!this.data().remember;\n };\n\n return Auth;\n})();\n\nexports['default'] = Auth;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 22 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _PubnubMockJs = __webpack_require__(23);\n\nvar _PubnubMockJs2 = _interopRequireDefault(_PubnubMockJs);\n\nvar _coreExternals = __webpack_require__(3);\n\nvar PubnubMockFactory = (function () {\n function PubnubMockFactory() {\n _classCallCheck(this, PubnubMockFactory);\n\n this.crypto_obj = _coreExternals.PUBNUB.crypto_obj;\n }\n\n PubnubMockFactory.prototype.init = function init(options) {\n return new _PubnubMockJs2['default'](options);\n };\n\n return PubnubMockFactory;\n})();\n\nexports['default'] = PubnubMockFactory;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 23 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _coreObservable = __webpack_require__(12);\n\nvar _coreObservable2 = _interopRequireDefault(_coreObservable);\n\nvar _coreExternals = __webpack_require__(3);\n\nvar PubnubMock = (function (_Observable) {\n _inherits(PubnubMock, _Observable);\n\n function PubnubMock(options) {\n _classCallCheck(this, PubnubMock);\n\n _Observable.call(this);\n this.options = options;\n this.crypto_obj = _coreExternals.PUBNUB.crypto_obj;\n }\n\n PubnubMock.prototype.ready = function ready() {};\n\n PubnubMock.prototype.subscribe = function subscribe(options) {\n this.on('message-' + options.channel, options.message);\n };\n\n PubnubMock.prototype.unsubscribe = function unsubscribe(options) {\n this.off('message-' + options.channel);\n };\n\n PubnubMock.prototype.receiveMessage = function receiveMessage(msg, channel) {\n this.emit('message-' + channel, msg, 'env', channel);\n };\n\n return PubnubMock;\n})(_coreObservable2['default']);\n\nexports['default'] = PubnubMock;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 24 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _coreObservable = __webpack_require__(12);\n\nvar _coreObservable2 = _interopRequireDefault(_coreObservable);\n\nvar _httpClient = __webpack_require__(14);\n\nvar _httpClient2 = _interopRequireDefault(_httpClient);\n\nvar _coreUtils = __webpack_require__(2);\n\nvar Subscription = (function (_Observable) {\n _inherits(Subscription, _Observable);\n\n _createClass(Subscription, null, [{\n key: '_renewHandicapMs',\n value: 2 * 60 * 1000,\n enumerable: true\n }, {\n key: '_pollInterval',\n value: 10 * 1000,\n enumerable: true\n }]);\n\n function Subscription(pubnubFactory, platform) {\n _classCallCheck(this, Subscription);\n\n _Observable.call(this);\n\n this.events = {\n notification: 'notification',\n removeSuccess: 'removeSuccess',\n removeError: 'removeError',\n renewSuccess: 'renewSuccess',\n renewError: 'renewError',\n subscribeSuccess: 'subscribeSuccess',\n subscribeError: 'subscribeError'\n };\n this._pubnubFactory = pubnubFactory;\n this._platform = platform;\n this._pubnub = null;\n this._timeout = null;\n this._subscription = {};\n }\n\n //export interface ISubscription {\n // id?:string;\n // uri?: string;\n // eventFilters?:string[];\n // expirationTime?:string; // 2014-03-12T19:54:35.613Z\n // expiresIn?:number;\n // deliveryMode?: {\n // transportType?:string;\n // encryption?:boolean;\n // address?:string;\n // subscriberKey?:string;\n // encryptionKey?:string;\n // secretKey?:string;\n // };\n // creationTime?:string; // 2014-03-12T19:54:35.613Z\n // status?:string; // Active\n //}\n\n Subscription.prototype.subscribed = function subscribed() {\n\n return !!(this._subscription.id && this._subscription.deliveryMode && this._subscription.deliveryMode.subscriberKey && this._subscription.deliveryMode.address);\n };\n\n /**\n * @return {boolean}\n */\n\n Subscription.prototype.alive = function alive() {\n\n return this.subscribed() && Date.now() < this.expirationTime();\n };\n\n Subscription.prototype.expirationTime = function expirationTime() {\n return new Date(this._subscription.expirationTime || 0).getTime() - Subscription._renewHandicapMs;\n };\n\n Subscription.prototype.setSubscription = function setSubscription(subscription) {\n\n subscription = subscription || {};\n\n this._clearTimeout();\n\n this._subscription = subscription;\n\n if (!this._pubnub) this._subscribeAtPubnub();\n\n this._setTimeout();\n\n return this;\n };\n\n Subscription.prototype.subscription = function subscription() {\n return this._subscription;\n };\n\n /**\n * Creates or updates subscription if there is an active one\n * @returns {Promise}\n */\n\n Subscription.prototype.register = function register() {\n return regeneratorRuntime.async(function register$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n if (!this.alive()) {\n context$2$0.next = 6;\n break;\n }\n\n context$2$0.next = 3;\n return regeneratorRuntime.awrap(this.renew());\n\n case 3:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 6:\n context$2$0.next = 8;\n return regeneratorRuntime.awrap(this.subscribe());\n\n case 8:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 9:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n Subscription.prototype.eventFilters = function eventFilters() {\n return this._subscription.eventFilters || [];\n };\n\n /**\n * @param {string[]} events\n * @return {Subscription}\n */\n\n Subscription.prototype.addEventFilters = function addEventFilters(events) {\n this.setEventFilters(this.eventFilters().concat(events));\n return this;\n };\n\n /**\n * @param {string[]} events\n * @return {Subscription}\n */\n\n Subscription.prototype.setEventFilters = function setEventFilters(events) {\n this._subscription.eventFilters = events;\n return this;\n };\n\n /**\n * @returns {Promise}\n */\n\n Subscription.prototype.subscribe = function subscribe() {\n var response, json;\n return regeneratorRuntime.async(function subscribe$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n\n this._clearTimeout();\n\n if (this.eventFilters().length) {\n context$2$0.next = 4;\n break;\n }\n\n throw new Error('Events are undefined');\n\n case 4:\n context$2$0.next = 6;\n return regeneratorRuntime.awrap(this._platform.post('/restapi/v1.0/subscription', {\n eventFilters: this._getFullEventFilters(),\n deliveryMode: {\n transportType: 'PubNub'\n }\n }));\n\n case 6:\n response = context$2$0.sent;\n json = response.json();\n\n this.setSubscription(json).emit(this.events.subscribeSuccess, response);\n\n return context$2$0.abrupt('return', response);\n\n case 12:\n context$2$0.prev = 12;\n context$2$0.t0 = context$2$0['catch'](0);\n\n context$2$0.t0 = this._platform.client().makeError(context$2$0.t0);\n\n this.reset().emit(this.events.subscribeError, context$2$0.t0);\n\n throw context$2$0.t0;\n\n case 17:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 12]]);\n };\n\n /**\n * @returns {Promise}\n */\n\n Subscription.prototype.renew = function renew() {\n var response, json;\n return regeneratorRuntime.async(function renew$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n\n this._clearTimeout();\n\n if (this.alive()) {\n context$2$0.next = 4;\n break;\n }\n\n throw new Error('Subscription is not alive');\n\n case 4:\n if (this.eventFilters().length) {\n context$2$0.next = 6;\n break;\n }\n\n throw new Error('Events are undefined');\n\n case 6:\n context$2$0.next = 8;\n return regeneratorRuntime.awrap(this._platform.put('/restapi/v1.0/subscription/' + this._subscription.id, {\n eventFilters: this._getFullEventFilters()\n }));\n\n case 8:\n response = context$2$0.sent;\n json = response.json();\n\n this.setSubscription(json).emit(this.events.renewSuccess, response);\n\n return context$2$0.abrupt('return', response);\n\n case 14:\n context$2$0.prev = 14;\n context$2$0.t0 = context$2$0['catch'](0);\n\n context$2$0.t0 = this._platform.client().makeError(context$2$0.t0);\n\n this.reset().emit(this.events.renewError, context$2$0.t0);\n\n throw context$2$0.t0;\n\n case 19:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 14]]);\n };\n\n /**\n * @returns {Promise}\n */\n\n Subscription.prototype.remove = function remove() {\n var response;\n return regeneratorRuntime.async(function remove$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n\n if (this.subscribed()) {\n context$2$0.next = 3;\n break;\n }\n\n throw new Error('No subscription');\n\n case 3:\n context$2$0.next = 5;\n return regeneratorRuntime.awrap(this._platform['delete']('/restapi/v1.0/subscription/' + this._subscription.id));\n\n case 5:\n response = context$2$0.sent;\n\n this.reset().emit(this.events.removeSuccess, response);\n\n return context$2$0.abrupt('return', response);\n\n case 10:\n context$2$0.prev = 10;\n context$2$0.t0 = context$2$0['catch'](0);\n\n context$2$0.t0 = this._platform.client().makeError(context$2$0.t0);\n\n this.emit(this.events.removeError, context$2$0.t0);\n\n throw context$2$0.t0;\n\n case 15:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 10]]);\n };\n\n /**\n * @returns {Promise}\n */\n\n Subscription.prototype.resubscribe = function resubscribe() {\n\n return this.reset().setEventFilters(this.eventFilters()).subscribe();\n };\n\n /**\n * Remove subscription and disconnect from PUBNUB\n * This method resets subscription at client side but backend is not notified\n */\n\n Subscription.prototype.reset = function reset() {\n this._clearTimeout();\n if (this.subscribed() && this._pubnub) this._pubnub.unsubscribe({ channel: this._subscription.deliveryMode.address });\n this._subscription = {};\n return this;\n };\n\n Subscription.prototype._getFullEventFilters = function _getFullEventFilters() {\n var _this = this;\n\n return this.eventFilters().map(function (event) {\n return _this._platform.createUrl(event);\n });\n };\n\n Subscription.prototype._setTimeout = function _setTimeout() {\n var _this2 = this;\n\n this._clearTimeout();\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n _coreUtils.poll(function (next) {\n\n if (_this2.alive()) return next();\n\n _this2.renew();\n }, Subscription._pollInterval, this._timeout);\n\n return this;\n };\n\n Subscription.prototype._clearTimeout = function _clearTimeout() {\n\n _coreUtils.stopPolling(this._timeout);\n\n return this;\n };\n\n Subscription.prototype._decrypt = function _decrypt(message) {\n\n if (!this.subscribed()) throw new Error('No subscription');\n\n if (this._subscription.deliveryMode.encryptionKey) {\n\n var PUBNUB = this._pubnubFactory;\n\n message = PUBNUB.crypto_obj.decrypt(message, this._subscription.deliveryMode.encryptionKey, {\n encryptKey: false,\n keyEncoding: 'base64',\n keyLength: 128,\n mode: 'ecb'\n });\n }\n\n return message;\n };\n\n Subscription.prototype._notify = function _notify(message) {\n\n this.emit(this.events.notification, this._decrypt(message));\n\n return this;\n };\n\n Subscription.prototype._subscribeAtPubnub = function _subscribeAtPubnub() {\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n var PUBNUB = this._pubnubFactory;\n\n this._pubnub = PUBNUB.init({\n ssl: true,\n subscribe_key: this._subscription.deliveryMode.subscriberKey\n });\n\n this._pubnub.ready();\n\n this._pubnub.subscribe({\n channel: this._subscription.deliveryMode.address,\n message: this._notify.bind(this),\n connect: function connect() {}\n });\n\n return this;\n };\n\n return Subscription;\n})(_coreObservable2['default']);\n\nexports['default'] = Subscription;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 25 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _Subscription2 = __webpack_require__(24);\n\nvar _Subscription3 = _interopRequireDefault(_Subscription2);\n\nvar _coreQueue = __webpack_require__(13);\n\nvar _coreQueue2 = _interopRequireDefault(_coreQueue);\n\nvar CachedSubscription = (function (_Subscription) {\n _inherits(CachedSubscription, _Subscription);\n\n function CachedSubscription(pubnubFactory, platform, cache, cacheKey) {\n var _this = this;\n\n _classCallCheck(this, CachedSubscription);\n\n _Subscription.call(this, pubnubFactory, platform);\n\n this._cache = cache;\n this._cacheKey = cacheKey;\n this._renewQueue = new _coreQueue2['default'](this._cache, cacheKey + '-renew');\n this._resubscribeQueue = new _coreQueue2['default'](this._cache, cacheKey + '-resubscribe');\n\n this.events = _extends({}, this.events, {\n queuedRenewSuccess: 'queuedRenewSuccess',\n queuedRenewError: 'queuedRenewError',\n queuedResubscribeSuccess: 'queuedResubscribeSuccess',\n queuedResubscribeError: 'queuedResubscribeError'\n });\n\n this.on(this.events.renewError, function () {\n _this.resubscribe();\n });\n\n this.on([this.events.subscribeSuccess, this.events.renewSuccess], function () {\n _this._cache.setItem(_this._cacheKey, _this.subscription());\n });\n\n this.on(this.events.removeSuccess, function () {\n _this._cache.removeItem(_this._cacheKey);\n });\n }\n\n /**\n * TODO Combine with Platform.refresh and move elsewhere\n * @param actionCb\n * @param queue\n * @param successEvent\n * @param errorEvent\n * @param errorMessage\n * @return {*}\n * @private\n */\n\n CachedSubscription.prototype._queue = function _queue(actionCb, queue, successEvent, errorEvent, errorMessage) {\n var res;\n return regeneratorRuntime.async(function _queue$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n\n if (!queue.isPaused()) {\n context$2$0.next = 8;\n break;\n }\n\n context$2$0.next = 4;\n return regeneratorRuntime.awrap(queue.poll());\n\n case 4:\n if (this.alive()) {\n context$2$0.next = 6;\n break;\n }\n\n throw new Error(errorMessage);\n\n case 6:\n\n this.emit(successEvent, null);\n\n return context$2$0.abrupt('return', null);\n\n case 8:\n\n queue.pause();\n\n context$2$0.next = 11;\n return regeneratorRuntime.awrap(actionCb.call(this));\n\n case 11:\n res = context$2$0.sent;\n\n queue.resume();\n\n this.emit(successEvent, res);\n\n return context$2$0.abrupt('return', res);\n\n case 17:\n context$2$0.prev = 17;\n context$2$0.t0 = context$2$0['catch'](0);\n\n this.emit(errorEvent, context$2$0.t0);\n\n throw context$2$0.t0;\n\n case 21:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 17]]);\n };\n\n /**\n * @returns {Promise}\n */\n\n CachedSubscription.prototype.renew = function renew() {\n\n return this._queue(_Subscription.prototype.renew, this._renewQueue, this.events.queuedRenewSuccess, this.events.queuedRenewError, 'Subscription is not alive after renew timeout');\n };\n\n /**\n * @returns {Promise}\n */\n\n CachedSubscription.prototype.resubscribe = function resubscribe() {\n\n return this._queue(_Subscription.prototype.resubscribe, this._resubscribeQueue, this.events.queuedResubscribeSuccess, this.events.queuedResubscribeError, 'Subscription is not alive after resubscribe timeout');\n };\n\n /**\n * @param {string[]} events\n * @return {CachedSubscription}\n */\n\n CachedSubscription.prototype.restore = function restore(events) {\n\n var cachedSubscriptionData = this._cache.getItem(this._cacheKey);\n\n if (cachedSubscriptionData) {\n try {\n this.setSubscription(cachedSubscriptionData);\n } catch (e) {}\n } else {\n this.setEventFilters(events);\n }\n\n return this;\n };\n\n return CachedSubscription;\n})(_Subscription3['default']);\n\nexports['default'] = CachedSubscription;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 26 */\n/***/ function(module, exports) {\n\n/* WEBPACK VAR INJECTION */(function(global) {/**\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 // This invoke function is written in a style that assumes some\n // calling function (or Promise) will handle exceptions.\n function invoke(method, arg) {\n var result = generator[method](arg);\n var value = result.value;\n return value instanceof AwaitArgument\n ? Promise.resolve(value.arg).then(invokeNext, invokeThrow)\n : 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 return result;\n });\n }\n\n if (typeof process === \"object\" && process.domain) {\n invoke = process.domain.bind(invoke);\n }\n\n var invokeNext = invoke.bind(generator, \"next\");\n var invokeThrow = invoke.bind(generator, \"throw\");\n var invokeReturn = invoke.bind(generator, \"return\");\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return invoke(method, arg);\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 ) : new Promise(function (resolve) {\n resolve(callInvokeWithMethodAndArg());\n });\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/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ }\n/******/ ])\n});\n;\n//# sourceMappingURL=ringcentral-bundle.js.map"," \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 = \"/build/\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 376cc765ad2cf3304422\n **/","import * as Utils from './core/Utils';\nimport Cache from './core/Cache';\nimport * as Externals from './core/Externals';\nimport Observable from './core/Observable';\nimport Queue from './core/Queue';\n\nimport Client from './http/Client';\nimport ApiResponse from './http/ApiResponse';\nimport * as HttpUtils from './http/Utils';\n\nimport {default as ClientMock} from './mocks/ClientMock';\nimport Mock from './mocks/Mock';\nimport Registry from './mocks/Registry';\n\nimport Platform from './platform/Platform';\nimport Auth from './platform/Auth';\n\nimport PubnubMockFactory from './pubnub/PubnubFactory';\n\nimport Subscription from './subscription/Subscription';\nimport CachedSubscription from './subscription/CachedSubscription';\n\nrequire(\"regenerator/runtime\");\n\nexport default class SDK {\n\n static version = '2.0.0';\n\n static server = {\n sandbox: 'https://platform.devtest.ringcentral.com',\n production: 'https://platform.ringcentral.com'\n };\n\n /**\n * @constructor\n * @param {object} [options]\n * @param {string} [options.server]\n * @param {string} [options.cachePrefix]\n * @param {string} [options.appSecret]\n * @param {string} [options.appKey]\n * @param {string} [options.appName]\n * @param {string} [options.appVersion]\n * @param {string} [options.pubnubFactory]\n * @param {string} [options.client]\n */\n constructor(options) {\n\n options = options || {};\n\n this._cache = new Cache(Externals.localStorage, options.cachePrefix);\n\n this._client = options.client || new Client();\n\n this._platform = new Platform(this._client, this._cache, options.server, options.appKey, options.appSecret);\n\n this._pubnubFactory = options.pubnubFactory || Externals.PUBNUB;\n\n }\n\n /**\n * @return {Platform}\n */\n platform() {\n return this._platform;\n }\n\n /**\n * @return {Subscription}\n */\n createSubscription() {\n return new Subscription(this._pubnubFactory, this._platform);\n }\n\n /**\n * @return {CachedSubscription}\n */\n createCachedSubscription(cacheKey) {\n return new CachedSubscription(this._pubnubFactory, this._platform, this._cache, cacheKey);\n }\n\n /**\n * @return {Cache}\n */\n cache() {\n return this._cache;\n }\n\n static core = {\n Cache: Cache,\n Observable: Observable,\n Utils: Utils,\n Externals: Externals,\n Queue: Queue\n };\n\n static http = {\n Client: Client,\n ApiResponse: ApiResponse,\n Utils: HttpUtils\n };\n\n static platform = {\n Auth: Auth,\n Platform: Platform\n };\n\n static subscription = {\n Subscription: Subscription\n };\n\n static mocks = {\n Client: ClientMock,\n Registry: Registry,\n Mock: Mock\n };\n\n static pubnub = {\n PubnubMockFactory: PubnubMockFactory\n };\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/SDK.js\n **/","import {Promise} from './Externals.js';\n\n/**\n * TODO Replace with something better\n * @see https://github.com/joyent/node/blob/master/lib/querystring.js\n * @param {object} parameters\n * @returns {string}\n */\nexport function queryStringify(parameters) {\n\n var array = [];\n\n parameters = parameters || {};\n\n Object.keys(parameters).forEach((k) => {\n\n var v = parameters[k];\n\n if (isArray(v)) {\n v.forEach((vv) => {\n array.push(encodeURIComponent(k) + '=' + encodeURIComponent(vv));\n });\n } else {\n array.push(encodeURIComponent(k) + '=' + encodeURIComponent(v));\n }\n\n });\n\n return array.join('&');\n\n}\n\n/**\n * TODO Replace with something better\n * @see https://github.com/joyent/node/blob/master/lib/querystring.js\n * @param {string} queryString\n * @returns {object}\n */\nexport function parseQueryString(queryString) {\n\n var argsParsed = {};\n\n queryString.split('&').forEach((arg) => {\n\n arg = decodeURIComponent(arg);\n\n if (arg.indexOf('=') == -1) {\n\n argsParsed[arg.trim()] = true;\n\n } else {\n\n var pair = arg.split('='),\n key = pair[0].trim(),\n value = pair[1].trim();\n\n if (key in argsParsed) {\n if (key in argsParsed && !isArray(argsParsed[key])) argsParsed[key] = [argsParsed[key]];\n argsParsed[key].push(value);\n } else {\n argsParsed[key] = value;\n }\n\n }\n\n });\n\n return argsParsed;\n\n}\n\n/**\n * @param obj\n * @return {boolean}\n */\nexport function isFunction(obj) {\n return typeof obj === \"function\";\n}\n\n/**\n * @param obj\n * @return {boolean}\n */\nexport function isArray(obj) {\n return Array.isArray ? Array.isArray(obj) : typeof obj === \"array\";\n}\n\n/**\n * @param fn\n * @param interval\n * @param timeout\n */\nexport function poll(fn, interval, timeout) { //NodeJS.Timer|number\n\n module.exports.stopPolling(timeout);\n\n interval = interval || 1000;\n\n var next = (delay) => {\n\n delay = delay || interval;\n\n interval = delay;\n\n return setTimeout(() => {\n\n fn(next, delay);\n\n }, delay);\n\n };\n\n return next();\n\n}\n\nexport function stopPolling(timeout) {\n if (timeout) clearTimeout(timeout);\n}\n\nexport function isNodeJS() {\n return (typeof process !== 'undefined');\n}\n\nexport function isBrowser() {\n return (typeof window !== 'undefined');\n}\n\nexport function delay(timeout) {\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n resolve(null);\n }, timeout);\n });\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Utils.js\n **/","import ES6Promise from 'es6-promise';\nimport nodeFetch from 'node-fetch';\nimport pubnub from 'pubnub';\n\nvar root = (new Function('return this'))();\n\nexport var Promise = (ES6Promise && ES6Promise.Promise) || root.Promise;\n\nexport var fetch = root.fetch || nodeFetch;\nexport var Request = root.Request || fetch.Request;\nexport var Response = root.Response || fetch.Response;\nexport var Headers = root.Headers || fetch.Headers;\n\nexport var PUBNUB = root.PUBNUB || pubnub;\n\nexport var localStorage = (typeof root.localStorage !== 'undefined') ? root.localStorage : {};\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Externals.js\n **/","/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license Licensed under MIT license\n * See https://raw.githubusercontent.com/jakearchibald/es6-promise/master/LICENSE\n * @version 2.2.0\n */\n\n(function() {\n \"use strict\";\n function lib$es6$promise$utils$$objectOrFunction(x) {\n return typeof x === 'function' || (typeof x === 'object' && x !== null);\n }\n\n function lib$es6$promise$utils$$isFunction(x) {\n return typeof x === 'function';\n }\n\n function lib$es6$promise$utils$$isMaybeThenable(x) {\n return typeof x === 'object' && x !== null;\n }\n\n var lib$es6$promise$utils$$_isArray;\n if (!Array.isArray) {\n lib$es6$promise$utils$$_isArray = function (x) {\n return Object.prototype.toString.call(x) === '[object Array]';\n };\n } else {\n lib$es6$promise$utils$$_isArray = Array.isArray;\n }\n\n var lib$es6$promise$utils$$isArray = lib$es6$promise$utils$$_isArray;\n var lib$es6$promise$asap$$len = 0;\n var lib$es6$promise$asap$$toString = {}.toString;\n var lib$es6$promise$asap$$vertxNext;\n var lib$es6$promise$asap$$customSchedulerFn;\n\n function lib$es6$promise$asap$$asap(callback, arg) {\n lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len] = callback;\n lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len + 1] = arg;\n lib$es6$promise$asap$$len += 2;\n if (lib$es6$promise$asap$$len === 2) {\n // If len is 2, 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 if (lib$es6$promise$asap$$customSchedulerFn) {\n lib$es6$promise$asap$$customSchedulerFn(lib$es6$promise$asap$$flush);\n } else {\n lib$es6$promise$asap$$scheduleFlush();\n }\n }\n }\n\n var lib$es6$promise$asap$$default = lib$es6$promise$asap$$asap;\n function lib$es6$promise$asap$$setScheduler(scheduleFn) {\n lib$es6$promise$asap$$customSchedulerFn = scheduleFn;\n }\n\n var lib$es6$promise$asap$$browserWindow = (typeof window !== 'undefined') ? window : undefined;\n var lib$es6$promise$asap$$browserGlobal = lib$es6$promise$asap$$browserWindow || {};\n var lib$es6$promise$asap$$BrowserMutationObserver = lib$es6$promise$asap$$browserGlobal.MutationObserver || lib$es6$promise$asap$$browserGlobal.WebKitMutationObserver;\n var lib$es6$promise$asap$$isNode = typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n // test for web worker but not in IE10\n var lib$es6$promise$asap$$isWorker = typeof Uint8ClampedArray !== 'undefined' &&\n typeof importScripts !== 'undefined' &&\n typeof MessageChannel !== 'undefined';\n\n // node\n function lib$es6$promise$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$es6$promise$asap$$flush);\n };\n }\n\n // vertx\n function lib$es6$promise$asap$$useVertxTimer() {\n return function() {\n lib$es6$promise$asap$$vertxNext(lib$es6$promise$asap$$flush);\n };\n }\n\n function lib$es6$promise$asap$$useMutationObserver() {\n var iterations = 0;\n var observer = new lib$es6$promise$asap$$BrowserMutationObserver(lib$es6$promise$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$es6$promise$asap$$useMessageChannel() {\n var channel = new MessageChannel();\n channel.port1.onmessage = lib$es6$promise$asap$$flush;\n return function () {\n channel.port2.postMessage(0);\n };\n }\n\n function lib$es6$promise$asap$$useSetTimeout() {\n return function() {\n setTimeout(lib$es6$promise$asap$$flush, 1);\n };\n }\n\n var lib$es6$promise$asap$$queue = new Array(1000);\n function lib$es6$promise$asap$$flush() {\n for (var i = 0; i < lib$es6$promise$asap$$len; i+=2) {\n var callback = lib$es6$promise$asap$$queue[i];\n var arg = lib$es6$promise$asap$$queue[i+1];\n\n callback(arg);\n\n lib$es6$promise$asap$$queue[i] = undefined;\n lib$es6$promise$asap$$queue[i+1] = undefined;\n }\n\n lib$es6$promise$asap$$len = 0;\n }\n\n function lib$es6$promise$asap$$attemptVertex() {\n try {\n var r = require;\n var vertx = r('vertx');\n lib$es6$promise$asap$$vertxNext = vertx.runOnLoop || vertx.runOnContext;\n return lib$es6$promise$asap$$useVertxTimer();\n } catch(e) {\n return lib$es6$promise$asap$$useSetTimeout();\n }\n }\n\n var lib$es6$promise$asap$$scheduleFlush;\n // Decide what async method to use to triggering processing of queued callbacks:\n if (lib$es6$promise$asap$$isNode) {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useNextTick();\n } else if (lib$es6$promise$asap$$BrowserMutationObserver) {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMutationObserver();\n } else if (lib$es6$promise$asap$$isWorker) {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMessageChannel();\n } else if (lib$es6$promise$asap$$browserWindow === undefined && typeof require === 'function') {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$attemptVertex();\n } else {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useSetTimeout();\n }\n\n function lib$es6$promise$$internal$$noop() {}\n\n var lib$es6$promise$$internal$$PENDING = void 0;\n var lib$es6$promise$$internal$$FULFILLED = 1;\n var lib$es6$promise$$internal$$REJECTED = 2;\n\n var lib$es6$promise$$internal$$GET_THEN_ERROR = new lib$es6$promise$$internal$$ErrorObject();\n\n function lib$es6$promise$$internal$$selfFullfillment() {\n return new TypeError(\"You cannot resolve a promise with itself\");\n }\n\n function lib$es6$promise$$internal$$cannotReturnOwn() {\n return new TypeError('A promises callback cannot return that same promise.');\n }\n\n function lib$es6$promise$$internal$$getThen(promise) {\n try {\n return promise.then;\n } catch(error) {\n lib$es6$promise$$internal$$GET_THEN_ERROR.error = error;\n return lib$es6$promise$$internal$$GET_THEN_ERROR;\n }\n }\n\n function lib$es6$promise$$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$es6$promise$$internal$$handleForeignThenable(promise, thenable, then) {\n lib$es6$promise$asap$$default(function(promise) {\n var sealed = false;\n var error = lib$es6$promise$$internal$$tryThen(then, thenable, function(value) {\n if (sealed) { return; }\n sealed = true;\n if (thenable !== value) {\n lib$es6$promise$$internal$$resolve(promise, value);\n } else {\n lib$es6$promise$$internal$$fulfill(promise, value);\n }\n }, function(reason) {\n if (sealed) { return; }\n sealed = true;\n\n lib$es6$promise$$internal$$reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && error) {\n sealed = true;\n lib$es6$promise$$internal$$reject(promise, error);\n }\n }, promise);\n }\n\n function lib$es6$promise$$internal$$handleOwnThenable(promise, thenable) {\n if (thenable._state === lib$es6$promise$$internal$$FULFILLED) {\n lib$es6$promise$$internal$$fulfill(promise, thenable._result);\n } else if (thenable._state === lib$es6$promise$$internal$$REJECTED) {\n lib$es6$promise$$internal$$reject(promise, thenable._result);\n } else {\n lib$es6$promise$$internal$$subscribe(thenable, undefined, function(value) {\n lib$es6$promise$$internal$$resolve(promise, value);\n }, function(reason) {\n lib$es6$promise$$internal$$reject(promise, reason);\n });\n }\n }\n\n function lib$es6$promise$$internal$$handleMaybeThenable(promise, maybeThenable) {\n if (maybeThenable.constructor === promise.constructor) {\n lib$es6$promise$$internal$$handleOwnThenable(promise, maybeThenable);\n } else {\n var then = lib$es6$promise$$internal$$getThen(maybeThenable);\n\n if (then === lib$es6$promise$$internal$$GET_THEN_ERROR) {\n lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$GET_THEN_ERROR.error);\n } else if (then === undefined) {\n lib$es6$promise$$internal$$fulfill(promise, maybeThenable);\n } else if (lib$es6$promise$utils$$isFunction(then)) {\n lib$es6$promise$$internal$$handleForeignThenable(promise, maybeThenable, then);\n } else {\n lib$es6$promise$$internal$$fulfill(promise, maybeThenable);\n }\n }\n }\n\n function lib$es6$promise$$internal$$resolve(promise, value) {\n if (promise === value) {\n lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$selfFullfillment());\n } else if (lib$es6$promise$utils$$objectOrFunction(value)) {\n lib$es6$promise$$internal$$handleMaybeThenable(promise, value);\n } else {\n lib$es6$promise$$internal$$fulfill(promise, value);\n }\n }\n\n function lib$es6$promise$$internal$$publishRejection(promise) {\n if (promise._onerror) {\n promise._onerror(promise._result);\n }\n\n lib$es6$promise$$internal$$publish(promise);\n }\n\n function lib$es6$promise$$internal$$fulfill(promise, value) {\n if (promise._state !== lib$es6$promise$$internal$$PENDING) { return; }\n\n promise._result = value;\n promise._state = lib$es6$promise$$internal$$FULFILLED;\n\n if (promise._subscribers.length !== 0) {\n lib$es6$promise$asap$$default(lib$es6$promise$$internal$$publish, promise);\n }\n }\n\n function lib$es6$promise$$internal$$reject(promise, reason) {\n if (promise._state !== lib$es6$promise$$internal$$PENDING) { return; }\n promise._state = lib$es6$promise$$internal$$REJECTED;\n promise._result = reason;\n\n lib$es6$promise$asap$$default(lib$es6$promise$$internal$$publishRejection, promise);\n }\n\n function lib$es6$promise$$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$es6$promise$$internal$$FULFILLED] = onFulfillment;\n subscribers[length + lib$es6$promise$$internal$$REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n lib$es6$promise$asap$$default(lib$es6$promise$$internal$$publish, parent);\n }\n }\n\n function lib$es6$promise$$internal$$publish(promise) {\n var subscribers = promise._subscribers;\n var settled = promise._state;\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$es6$promise$$internal$$invokeCallback(settled, child, callback, detail);\n } else {\n callback(detail);\n }\n }\n\n promise._subscribers.length = 0;\n }\n\n function lib$es6$promise$$internal$$ErrorObject() {\n this.error = null;\n }\n\n var lib$es6$promise$$internal$$TRY_CATCH_ERROR = new lib$es6$promise$$internal$$ErrorObject();\n\n function lib$es6$promise$$internal$$tryCatch(callback, detail) {\n try {\n return callback(detail);\n } catch(e) {\n lib$es6$promise$$internal$$TRY_CATCH_ERROR.error = e;\n return lib$es6$promise$$internal$$TRY_CATCH_ERROR;\n }\n }\n\n function lib$es6$promise$$internal$$invokeCallback(settled, promise, callback, detail) {\n var hasCallback = lib$es6$promise$utils$$isFunction(callback),\n value, error, succeeded, failed;\n\n if (hasCallback) {\n value = lib$es6$promise$$internal$$tryCatch(callback, detail);\n\n if (value === lib$es6$promise$$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$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$cannotReturnOwn());\n return;\n }\n\n } else {\n value = detail;\n succeeded = true;\n }\n\n if (promise._state !== lib$es6$promise$$internal$$PENDING) {\n // noop\n } else if (hasCallback && succeeded) {\n lib$es6$promise$$internal$$resolve(promise, value);\n } else if (failed) {\n lib$es6$promise$$internal$$reject(promise, error);\n } else if (settled === lib$es6$promise$$internal$$FULFILLED) {\n lib$es6$promise$$internal$$fulfill(promise, value);\n } else if (settled === lib$es6$promise$$internal$$REJECTED) {\n lib$es6$promise$$internal$$reject(promise, value);\n }\n }\n\n function lib$es6$promise$$internal$$initializePromise(promise, resolver) {\n try {\n resolver(function resolvePromise(value){\n lib$es6$promise$$internal$$resolve(promise, value);\n }, function rejectPromise(reason) {\n lib$es6$promise$$internal$$reject(promise, reason);\n });\n } catch(e) {\n lib$es6$promise$$internal$$reject(promise, e);\n }\n }\n\n function lib$es6$promise$enumerator$$Enumerator(Constructor, input) {\n var enumerator = this;\n\n enumerator._instanceConstructor = Constructor;\n enumerator.promise = new Constructor(lib$es6$promise$$internal$$noop);\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$es6$promise$$internal$$fulfill(enumerator.promise, enumerator._result);\n } else {\n enumerator.length = enumerator.length || 0;\n enumerator._enumerate();\n if (enumerator._remaining === 0) {\n lib$es6$promise$$internal$$fulfill(enumerator.promise, enumerator._result);\n }\n }\n } else {\n lib$es6$promise$$internal$$reject(enumerator.promise, enumerator._validationError());\n }\n }\n\n lib$es6$promise$enumerator$$Enumerator.prototype._validateInput = function(input) {\n return lib$es6$promise$utils$$isArray(input);\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._validationError = function() {\n return new Error('Array Methods must be provided an Array');\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._init = function() {\n this._result = new Array(this.length);\n };\n\n var lib$es6$promise$enumerator$$default = lib$es6$promise$enumerator$$Enumerator;\n\n lib$es6$promise$enumerator$$Enumerator.prototype._enumerate = function() {\n var enumerator = this;\n\n var length = enumerator.length;\n var promise = enumerator.promise;\n var input = enumerator._input;\n\n for (var i = 0; promise._state === lib$es6$promise$$internal$$PENDING && i < length; i++) {\n enumerator._eachEntry(input[i], i);\n }\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._eachEntry = function(entry, i) {\n var enumerator = this;\n var c = enumerator._instanceConstructor;\n\n if (lib$es6$promise$utils$$isMaybeThenable(entry)) {\n if (entry.constructor === c && entry._state !== lib$es6$promise$$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] = entry;\n }\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._settledAt = function(state, i, value) {\n var enumerator = this;\n var promise = enumerator.promise;\n\n if (promise._state === lib$es6$promise$$internal$$PENDING) {\n enumerator._remaining--;\n\n if (state === lib$es6$promise$$internal$$REJECTED) {\n lib$es6$promise$$internal$$reject(promise, value);\n } else {\n enumerator._result[i] = value;\n }\n }\n\n if (enumerator._remaining === 0) {\n lib$es6$promise$$internal$$fulfill(promise, enumerator._result);\n }\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._willSettleAt = function(promise, i) {\n var enumerator = this;\n\n lib$es6$promise$$internal$$subscribe(promise, undefined, function(value) {\n enumerator._settledAt(lib$es6$promise$$internal$$FULFILLED, i, value);\n }, function(reason) {\n enumerator._settledAt(lib$es6$promise$$internal$$REJECTED, i, reason);\n });\n };\n function lib$es6$promise$promise$all$$all(entries) {\n return new lib$es6$promise$enumerator$$default(this, entries).promise;\n }\n var lib$es6$promise$promise$all$$default = lib$es6$promise$promise$all$$all;\n function lib$es6$promise$promise$race$$race(entries) {\n /*jshint validthis:true */\n var Constructor = this;\n\n var promise = new Constructor(lib$es6$promise$$internal$$noop);\n\n if (!lib$es6$promise$utils$$isArray(entries)) {\n lib$es6$promise$$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$es6$promise$$internal$$resolve(promise, value);\n }\n\n function onRejection(reason) {\n lib$es6$promise$$internal$$reject(promise, reason);\n }\n\n for (var i = 0; promise._state === lib$es6$promise$$internal$$PENDING && i < length; i++) {\n lib$es6$promise$$internal$$subscribe(Constructor.resolve(entries[i]), undefined, onFulfillment, onRejection);\n }\n\n return promise;\n }\n var lib$es6$promise$promise$race$$default = lib$es6$promise$promise$race$$race;\n function lib$es6$promise$promise$resolve$$resolve(object) {\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$es6$promise$$internal$$noop);\n lib$es6$promise$$internal$$resolve(promise, object);\n return promise;\n }\n var lib$es6$promise$promise$resolve$$default = lib$es6$promise$promise$resolve$$resolve;\n function lib$es6$promise$promise$reject$$reject(reason) {\n /*jshint validthis:true */\n var Constructor = this;\n var promise = new Constructor(lib$es6$promise$$internal$$noop);\n lib$es6$promise$$internal$$reject(promise, reason);\n return promise;\n }\n var lib$es6$promise$promise$reject$$default = lib$es6$promise$promise$reject$$reject;\n\n var lib$es6$promise$promise$$counter = 0;\n\n function lib$es6$promise$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$es6$promise$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 var lib$es6$promise$promise$$default = lib$es6$promise$promise$$Promise;\n /**\n Promise objects represent the eventual result of an asynchronous operation. The\n primary way of interacting with a promise is through its `then` method, which\n registers callbacks to receive either a promise’s eventual value or the reason\n why the promise cannot be fulfilled.\n\n Terminology\n -----------\n\n - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n - `thenable` is an object or function that defines a `then` method.\n - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n - `exception` is a value that is thrown using the throw statement.\n - `reason` is a value that indicates why a promise was rejected.\n - `settled` the final resting state of a promise, fulfilled or rejected.\n\n A promise can be in one of three states: pending, fulfilled, or rejected.\n\n Promises that are fulfilled have a fulfillment value and are in the fulfilled\n state. Promises that are rejected have a rejection reason and are in the\n rejected state. A fulfillment value is never a thenable.\n\n Promises can also be said to *resolve* a value. If this value is also a\n promise, then the original promise's settled state will match the value's\n settled state. So a promise that *resolves* a promise that rejects will\n itself reject, and a promise that *resolves* a promise that fulfills will\n itself fulfill.\n\n\n Basic Usage:\n ------------\n\n ```js\n var promise = new Promise(function(resolve, reject) {\n // on success\n resolve(value);\n\n // on failure\n reject(reason);\n });\n\n promise.then(function(value) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Advanced Usage:\n ---------------\n\n Promises shine when abstracting away asynchronous interactions such as\n `XMLHttpRequest`s.\n\n ```js\n function getJSON(url) {\n return new Promise(function(resolve, reject){\n var xhr = new XMLHttpRequest();\n\n xhr.open('GET', url);\n xhr.onreadystatechange = handler;\n xhr.responseType = 'json';\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send();\n\n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200) {\n resolve(this.response);\n } else {\n reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n }\n }\n };\n });\n }\n\n getJSON('/posts.json').then(function(json) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Unlike callbacks, promises are great composable primitives.\n\n ```js\n Promise.all([\n getJSON('/posts'),\n getJSON('/comments')\n ]).then(function(values){\n values[0] // => postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class Promise\n @param {function} resolver\n Useful for tooling.\n @constructor\n */\n function lib$es6$promise$promise$$Promise(resolver) {\n this._id = lib$es6$promise$promise$$counter++;\n this._state = undefined;\n this._result = undefined;\n this._subscribers = [];\n\n if (lib$es6$promise$$internal$$noop !== resolver) {\n if (!lib$es6$promise$utils$$isFunction(resolver)) {\n lib$es6$promise$promise$$needsResolver();\n }\n\n if (!(this instanceof lib$es6$promise$promise$$Promise)) {\n lib$es6$promise$promise$$needsNew();\n }\n\n lib$es6$promise$$internal$$initializePromise(this, resolver);\n }\n }\n\n lib$es6$promise$promise$$Promise.all = lib$es6$promise$promise$all$$default;\n lib$es6$promise$promise$$Promise.race = lib$es6$promise$promise$race$$default;\n lib$es6$promise$promise$$Promise.resolve = lib$es6$promise$promise$resolve$$default;\n lib$es6$promise$promise$$Promise.reject = lib$es6$promise$promise$reject$$default;\n lib$es6$promise$promise$$Promise._setScheduler = lib$es6$promise$asap$$setScheduler;\n lib$es6$promise$promise$$Promise._asap = lib$es6$promise$asap$$default;\n\n lib$es6$promise$promise$$Promise.prototype = {\n constructor: lib$es6$promise$promise$$Promise,\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 Useful for tooling.\n @return {Promise}\n */\n then: function(onFulfillment, onRejection) {\n var parent = this;\n var state = parent._state;\n\n if (state === lib$es6$promise$$internal$$FULFILLED && !onFulfillment || state === lib$es6$promise$$internal$$REJECTED && !onRejection) {\n return this;\n }\n\n var child = new this.constructor(lib$es6$promise$$internal$$noop);\n var result = parent._result;\n\n if (state) {\n var callback = arguments[state - 1];\n lib$es6$promise$asap$$default(function(){\n lib$es6$promise$$internal$$invokeCallback(state, child, callback, result);\n });\n } else {\n lib$es6$promise$$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 Useful for tooling.\n @return {Promise}\n */\n 'catch': function(onRejection) {\n return this.then(null, onRejection);\n }\n };\n function lib$es6$promise$polyfill$$polyfill() {\n var local;\n\n if (typeof global !== 'undefined') {\n local = global;\n } else if (typeof self !== 'undefined') {\n local = self;\n } else {\n try {\n local = Function('return this')();\n } catch (e) {\n throw new Error('polyfill failed because global object is unavailable in this environment');\n }\n }\n\n var P = local.Promise;\n\n if (P && Object.prototype.toString.call(P.resolve()) === '[object Promise]' && !P.cast) {\n return;\n }\n\n local.Promise = lib$es6$promise$promise$$default;\n }\n var lib$es6$promise$polyfill$$default = lib$es6$promise$polyfill$$polyfill;\n\n var lib$es6$promise$umd$$ES6Promise = {\n 'Promise': lib$es6$promise$promise$$default,\n 'polyfill': lib$es6$promise$polyfill$$default\n };\n\n /* global define:true module:true window: true */\n if (typeof define === 'function' && define['amd']) {\n define(function() { return lib$es6$promise$umd$$ES6Promise; });\n } else if (typeof module !== 'undefined' && module['exports']) {\n module['exports'] = lib$es6$promise$umd$$ES6Promise;\n } else if (typeof this !== 'undefined') {\n this['ES6Promise'] = lib$es6$promise$umd$$ES6Promise;\n }\n\n lib$es6$promise$polyfill$$default();\n}).call(this);\n\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./bower_components/es6-promise/promise.js\n ** module id = 4\n ** module chunks = 0\n **/","var nextTick = require('process/browser.js').nextTick;\nvar apply = Function.prototype.apply;\nvar slice = Array.prototype.slice;\nvar immediateIds = {};\nvar nextImmediateId = 0;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n return new Timeout(apply.call(setInterval, window, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) { timeout.close(); };\n\nfunction Timeout(id, clearFn) {\n this._id = id;\n this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n this._clearFn.call(window, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n clearTimeout(item._idleTimeoutId);\n\n var msecs = item._idleTimeout;\n if (msecs >= 0) {\n item._idleTimeoutId = setTimeout(function onTimeout() {\n if (item._onTimeout)\n item._onTimeout();\n }, msecs);\n }\n};\n\n// That's not how node.js implements it but the exposed api is the same.\nexports.setImmediate = typeof setImmediate === \"function\" ? setImmediate : function(fn) {\n var id = nextImmediateId++;\n var args = arguments.length < 2 ? false : slice.call(arguments, 1);\n\n immediateIds[id] = true;\n\n nextTick(function onNextTick() {\n if (immediateIds[id]) {\n // fn.call() is faster so we optimize for the common use-case\n // @see http://jsperf.com/call-apply-segu\n if (args) {\n fn.apply(null, args);\n } else {\n fn.call(null);\n }\n // Prevent ids from leaking\n exports.clearImmediate(id);\n }\n });\n\n return id;\n};\n\nexports.clearImmediate = typeof clearImmediate === \"function\" ? clearImmediate : function(id) {\n delete immediateIds[id];\n};\n\n\n/*****************\n ** WEBPACK FOOTER\n ** (webpack)/~/node-libs-browser/~/timers-browserify/main.js\n ** module id = 5\n ** module chunks = 0\n **/","// shim for using process in browser\n\nvar process = module.exports = {};\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = setTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n clearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n setTimeout(drainQueue, 0);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** (webpack)/~/node-libs-browser/~/process/browser.js\n ** module id = 6\n ** module chunks = 0\n **/","module.exports = function(module) {\r\n\tif(!module.webpackPolyfill) {\r\n\t\tmodule.deprecate = function() {};\r\n\t\tmodule.paths = [];\r\n\t\t// module.parent = undefined by default\r\n\t\tmodule.children = [];\r\n\t\tmodule.webpackPolyfill = 1;\r\n\t}\r\n\treturn module;\r\n}\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** (webpack)/buildin/module.js\n ** module id = 7\n ** module chunks = 0\n **/","module.exports = function() { throw new Error(\"define cannot be used indirect\"); };\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** (webpack)/buildin/amd-define.js\n ** module id = 8\n ** module chunks = 0\n **/","(function() {\n 'use strict';\n\n if (self.fetch) {\n return\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n }\n\n function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var list = this.map[name]\n if (!list) {\n list = []\n this.map[name] = list\n }\n list.push(value)\n }\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n }\n\n Headers.prototype.get = function(name) {\n var values = this.map[normalizeName(name)]\n return values ? values[0] : null\n }\n\n Headers.prototype.getAll = function(name) {\n return this.map[normalizeName(name)] || []\n }\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n }\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = [normalizeValue(value)]\n }\n\n Headers.prototype.forEach = function(callback, thisArg) {\n Object.getOwnPropertyNames(this.map).forEach(function(name) {\n this.map[name].forEach(function(value) {\n callback.call(thisArg, value, name, this)\n }, this)\n }, this)\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n reader.readAsArrayBuffer(blob)\n return fileReaderReady(reader)\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader()\n reader.readAsText(blob)\n return fileReaderReady(reader)\n }\n\n var support = {\n blob: 'FileReader' in self && 'Blob' in self && (function() {\n try {\n new Blob();\n return true\n } catch(e) {\n return false\n }\n })(),\n formData: 'FormData' in self\n }\n\n function Body() {\n this.bodyUsed = false\n\n\n this._initBody = function(body) {\n this._bodyInit = body\n if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (!body) {\n this._bodyText = ''\n } else {\n throw new Error('unsupported BodyInit type')\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n } else {\n this.text = function() {\n var rejected = consumed(this)\n return rejected ? rejected : Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return (methods.indexOf(upcased) > -1) ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {}\n var body = options.body\n if (Request.prototype.isPrototypeOf(input)) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n if (!body) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n } else {\n this.url = input\n }\n\n this.credentials = options.credentials || this.credentials || 'omit'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n }\n\n function decode(body) {\n var form = new FormData()\n body.trim().split('&').forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n }\n\n function headers(xhr) {\n var head = new Headers()\n var pairs = xhr.getAllResponseHeaders().trim().split('\\n')\n pairs.forEach(function(header) {\n var split = header.trim().split(':')\n var key = split.shift().trim()\n var value = split.join(':').trim()\n head.append(key, value)\n })\n return head\n }\n\n Body.call(Request.prototype)\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {}\n }\n\n this._initBody(bodyInit)\n this.type = 'default'\n this.url = null\n this.status = options.status\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = options.statusText\n this.headers = options.headers instanceof Headers ? options.headers : new Headers(options.headers)\n this.url = options.url || ''\n }\n\n Body.call(Response.prototype)\n\n self.Headers = Headers;\n self.Request = Request;\n self.Response = Response;\n\n self.fetch = function(input, init) {\n var request\n if (Request.prototype.isPrototypeOf(input) && !init) {\n request = input\n } else {\n request = new Request(input, init)\n }\n\n return new Promise(function(resolve, reject) {\n var xhr = new XMLHttpRequest()\n\n function responseURL() {\n if ('responseURL' in xhr) {\n return xhr.responseURL\n }\n\n // Avoid security warnings on getResponseHeader when not allowed by CORS\n if (/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())) {\n return xhr.getResponseHeader('X-Request-URL')\n }\n\n return;\n }\n\n xhr.onload = function() {\n var status = (xhr.status === 1223) ? 204 : xhr.status\n if (status < 100 || status > 599) {\n reject(new TypeError('Network request failed'))\n return\n }\n var options = {\n status: status,\n statusText: xhr.statusText,\n headers: headers(xhr),\n url: responseURL()\n }\n var body = 'response' in xhr ? xhr.response : xhr.responseText;\n resolve(new Response(body, options))\n }\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.open(request.method, request.url, true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob'\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n }\n self.fetch.polyfill = true\n})();\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./bower_components/fetch/fetch.js\n ** module id = 9\n ** module chunks = 0\n **/","// Version: 3.7.14\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n/* =-========================= JSON =============================-= */\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n\n(window['JSON'] && window['JSON']['stringify']) || (function () {\n window['JSON'] || (window['JSON'] = {});\n\n function toJSON(key) {\n try { return this.valueOf() }\n catch(e) { return null }\n }\n\n var cx = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n escapable = /[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n gap,\n indent,\n meta = { // table of character substitutions\n '\\b': '\\\\b',\n '\\t': '\\\\t',\n '\\n': '\\\\n',\n '\\f': '\\\\f',\n '\\r': '\\\\r',\n '\"' : '\\\\\"',\n '\\\\': '\\\\\\\\'\n },\n rep;\n\n function quote(string) {\n escapable.lastIndex = 0;\n return escapable.test(string) ?\n '\"' + string.replace(escapable, function (a) {\n var c = meta[a];\n return typeof c === 'string' ? c :\n '\\\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n }) + '\"' :\n '\"' + string + '\"';\n }\n\n function str(key, holder) {\n var i, // The loop counter.\n k, // The member key.\n v, // The member value.\n length,\n partial,\n mind = gap,\n value = holder[key];\n\n if (value && typeof value === 'object') {\n value = toJSON.call( value, key );\n }\n\n if (typeof rep === 'function') {\n value = rep.call(holder, key, value);\n }\n\n switch (typeof value) {\n case 'string':\n return quote(value);\n\n case 'number':\n return isFinite(value) ? String(value) : 'null';\n\n case 'boolean':\n case 'null':\n return String(value);\n\n case 'object':\n\n if (!value) {\n return 'null';\n }\n\n gap += indent;\n partial = [];\n\n if (Object.prototype.toString.apply(value) === '[object Array]') {\n\n length = value.length;\n for (i = 0; i < length; i += 1) {\n partial[i] = str(i, value) || 'null';\n }\n\n v = partial.length === 0 ? '[]' :\n gap ? '[\\n' + gap +\n partial.join(',\\n' + gap) + '\\n' +\n mind + ']' :\n '[' + partial.join(',') + ']';\n gap = mind;\n return v;\n }\n if (rep && typeof rep === 'object') {\n length = rep.length;\n for (i = 0; i < length; i += 1) {\n k = rep[i];\n if (typeof k === 'string') {\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? ': ' : ':') + v);\n }\n }\n }\n } else {\n for (k in value) {\n if (Object.hasOwnProperty.call(value, k)) {\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? ': ' : ':') + v);\n }\n }\n }\n }\n\n v = partial.length === 0 ? '{}' :\n gap ? '{\\n' + gap + partial.join(',\\n' + gap) + '\\n' +\n mind + '}' : '{' + partial.join(',') + '}';\n gap = mind;\n return v;\n }\n }\n\n if (typeof JSON['stringify'] !== 'function') {\n JSON['stringify'] = function (value, replacer, space) {\n var i;\n gap = '';\n indent = '';\n\n if (typeof space === 'number') {\n for (i = 0; i < space; i += 1) {\n indent += ' ';\n }\n } else if (typeof space === 'string') {\n indent = space;\n }\n rep = replacer;\n if (replacer && typeof replacer !== 'function' &&\n (typeof replacer !== 'object' ||\n typeof replacer.length !== 'number')) {\n throw new Error('JSON.stringify');\n }\n return str('', {'': value});\n };\n }\n\n if (typeof JSON['parse'] !== 'function') {\n // JSON is parsed on the server for security.\n JSON['parse'] = function (text) {return eval('('+text+')')};\n }\n}());\nvar NOW = 1\n, READY = false\n, READY_BUFFER = []\n, PRESENCE_SUFFIX = '-pnpres'\n, DEF_WINDOWING = 10 // MILLISECONDS.\n, DEF_TIMEOUT = 10000 // MILLISECONDS.\n, DEF_SUB_TIMEOUT = 310 // SECONDS.\n, DEF_KEEPALIVE = 60 // SECONDS (FOR TIMESYNC).\n, SECOND = 1000 // A THOUSAND MILLISECONDS.\n, URLBIT = '/'\n, PARAMSBIT = '&'\n, PRESENCE_HB_THRESHOLD = 5\n, PRESENCE_HB_DEFAULT = 30\n, SDK_VER = '3.7.14'\n, REPL = /{([\\w\\-]+)}/g;\n\n/**\n * UTILITIES\n */\nfunction unique() { return'x'+ ++NOW+''+(+new Date) }\nfunction rnow() { return+new Date }\n\n/**\n * NEXTORIGIN\n * ==========\n * var next_origin = nextorigin();\n */\nvar nextorigin = (function() {\n var max = 20\n , ori = Math.floor(Math.random() * max);\n return function( origin, failover ) {\n return origin.indexOf('pubsub.') > 0\n && origin.replace(\n 'pubsub', 'ps' + (\n failover ? generate_uuid().split('-')[0] :\n (++ori < max? ori : ori=1)\n ) ) || origin;\n }\n})();\n\n\n/**\n * Build Url\n * =======\n *\n */\nfunction build_url( url_components, url_params ) {\n var url = url_components.join(URLBIT)\n , params = [];\n\n if (!url_params) return url;\n\n each( url_params, function( key, value ) {\n var value_str = (typeof value == 'object')?JSON['stringify'](value):value;\n (typeof value != 'undefined' &&\n value != null && encode(value_str).length > 0\n ) && params.push(key + \"=\" + encode(value_str));\n } );\n\n url += \"?\" + params.join(PARAMSBIT);\n return url;\n}\n\n/**\n * UPDATER\n * =======\n * var timestamp = unique();\n */\nfunction updater( fun, rate ) {\n var timeout\n , last = 0\n , runnit = function() {\n if (last + rate > rnow()) {\n clearTimeout(timeout);\n timeout = setTimeout( runnit, rate );\n }\n else {\n last = rnow();\n fun();\n }\n };\n\n return runnit;\n}\n\n/**\n * GREP\n * ====\n * var list = grep( [1,2,3], function(item) { return item % 2 } )\n */\nfunction grep( list, fun ) {\n var fin = [];\n each( list || [], function(l) { fun(l) && fin.push(l) } );\n return fin\n}\n\n/**\n * SUPPLANT\n * ========\n * var text = supplant( 'Hello {name}!', { name : 'John' } )\n */\nfunction supplant( str, values ) {\n return str.replace( REPL, function( _, match ) {\n return values[match] || _\n } );\n}\n\n/**\n * timeout\n * =======\n * timeout( function(){}, 100 );\n */\nfunction timeout( fun, wait ) {\n return setTimeout( fun, wait );\n}\n\n/**\n * uuid\n * ====\n * var my_uuid = generate_uuid();\n */\nfunction generate_uuid(callback) {\n var u = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,\n function(c) {\n var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);\n return v.toString(16);\n });\n if (callback) callback(u);\n return u;\n}\n\nfunction isArray(arg) {\n return !!arg && typeof arg !== 'string' && (Array.isArray && Array.isArray(arg) || typeof(arg.length) === \"number\")\n //return !!arg && (Array.isArray && Array.isArray(arg) || typeof(arg.length) === \"number\")\n}\n\n/**\n * EACH\n * ====\n * each( [1,2,3], function(item) { } )\n */\nfunction each( o, f) {\n if ( !o || !f ) return;\n\n if ( isArray(o) )\n for ( var i = 0, l = o.length; i < l; )\n f.call( o[i], o[i], i++ );\n else\n for ( var i in o )\n o.hasOwnProperty &&\n o.hasOwnProperty(i) &&\n f.call( o[i], i, o[i] );\n}\n\n/**\n * MAP\n * ===\n * var list = map( [1,2,3], function(item) { return item + 1 } )\n */\nfunction map( list, fun ) {\n var fin = [];\n each( list || [], function( k, v ) { fin.push(fun( k, v )) } );\n return fin;\n}\n\n\nfunction pam_encode(str) {\n return encodeURIComponent(str).replace(/[!'()*~]/g, function(c) {\n return '%' + c.charCodeAt(0).toString(16).toUpperCase();\n });\n}\n\n/**\n * ENCODE\n * ======\n * var encoded_data = encode('path');\n */\nfunction encode(path) { return encodeURIComponent(path) }\n\n/**\n * Generate Subscription Channel List\n * ==================================\n * generate_channel_list(channels_object);\n */\nfunction generate_channel_list(channels, nopresence) {\n var list = [];\n each( channels, function( channel, status ) {\n if (nopresence) {\n if(channel.search('-pnpres') < 0) {\n if (status.subscribed) list.push(channel);\n }\n } else {\n if (status.subscribed) list.push(channel);\n }\n });\n return list.sort();\n}\n\n/**\n * Generate Subscription Channel Groups List\n * ==================================\n * generate_channel_group_list(channels_groups object);\n */\nfunction generate_channel_group_list(channel_groups, nopresence) {\n var list = [];\n each(channel_groups, function( channel_group, status ) {\n if (nopresence) {\n if(channel_group.search('-pnpres') < 0) {\n if (status.subscribed) list.push(channel_group);\n }\n } else {\n if (status.subscribed) list.push(channel_group);\n }\n });\n return list.sort();\n}\n\n// PUBNUB READY TO CONNECT\nfunction ready() { timeout( function() {\n if (READY) return;\n READY = 1;\n each( READY_BUFFER, function(connect) { connect() } );\n}, SECOND ); }\n\nfunction PNmessage(args) {\n msg = args || {'apns' : {}},\n msg['getPubnubMessage'] = function() {\n var m = {};\n\n if (Object.keys(msg['apns']).length) {\n m['pn_apns'] = {\n 'aps' : {\n 'alert' : msg['apns']['alert'] ,\n 'badge' : msg['apns']['badge']\n }\n }\n for (var k in msg['apns']) {\n m['pn_apns'][k] = msg['apns'][k];\n }\n var exclude1 = ['badge','alert'];\n for (var k in exclude1) {\n delete m['pn_apns'][exclude1[k]];\n }\n }\n\n\n\n if (msg['gcm']) {\n m['pn_gcm'] = {\n 'data' : msg['gcm']\n }\n }\n\n for (var k in msg) {\n m[k] = msg[k];\n }\n var exclude = ['apns','gcm','publish', 'channel','callback','error'];\n for (var k in exclude) {\n delete m[exclude[k]];\n }\n\n return m;\n };\n msg['publish'] = function() {\n\n var m = msg.getPubnubMessage();\n\n if (msg['pubnub'] && msg['channel']) {\n msg['pubnub'].publish({\n 'message' : m,\n 'channel' : msg['channel'],\n 'callback' : msg['callback'],\n 'error' : msg['error']\n })\n }\n };\n return msg;\n}\n\nfunction PN_API(setup) {\n var SUB_WINDOWING = +setup['windowing'] || DEF_WINDOWING\n , SUB_TIMEOUT = (+setup['timeout'] || DEF_SUB_TIMEOUT) * SECOND\n , KEEPALIVE = (+setup['keepalive'] || DEF_KEEPALIVE) * SECOND\n , TIME_CHECK = setup['timecheck'] || 0\n , NOLEAVE = setup['noleave'] || 0\n , PUBLISH_KEY = setup['publish_key']\n , SUBSCRIBE_KEY = setup['subscribe_key']\n , AUTH_KEY = setup['auth_key'] || ''\n , SECRET_KEY = setup['secret_key'] || ''\n , hmac_SHA256 = setup['hmac_SHA256']\n , SSL = setup['ssl'] ? 's' : ''\n , ORIGIN = 'http'+SSL+'://'+(setup['origin']||'pubsub.pubnub.com')\n , STD_ORIGIN = nextorigin(ORIGIN)\n , SUB_ORIGIN = nextorigin(ORIGIN)\n , CONNECT = function(){}\n , PUB_QUEUE = []\n , CLOAK = true\n , TIME_DRIFT = 0\n , SUB_CALLBACK = 0\n , SUB_CHANNEL = 0\n , SUB_RECEIVER = 0\n , SUB_RESTORE = setup['restore'] || 0\n , SUB_BUFF_WAIT = 0\n , TIMETOKEN = 0\n , RESUMED = false\n , CHANNELS = {}\n , CHANNEL_GROUPS = {}\n , SUB_ERROR = function(){}\n , STATE = {}\n , PRESENCE_HB_TIMEOUT = null\n , PRESENCE_HB = validate_presence_heartbeat(\n setup['heartbeat'] || setup['pnexpires'] || 0, setup['error']\n )\n , PRESENCE_HB_INTERVAL = setup['heartbeat_interval'] || (PRESENCE_HB / 2) -1\n , PRESENCE_HB_RUNNING = false\n , NO_WAIT_FOR_PENDING = setup['no_wait_for_pending']\n , COMPATIBLE_35 = setup['compatible_3.5'] || false\n , xdr = setup['xdr']\n , params = setup['params'] || {}\n , error = setup['error'] || function() {}\n , _is_online = setup['_is_online'] || function() { return 1 }\n , jsonp_cb = setup['jsonp_cb'] || function() { return 0 }\n , db = setup['db'] || {'get': function(){}, 'set': function(){}}\n , CIPHER_KEY = setup['cipher_key']\n , UUID = setup['uuid'] || ( !setup['unique_uuid'] && db && db['get'](SUBSCRIBE_KEY+'uuid') || '')\n , USE_INSTANCEID = setup['instance_id'] || false\n , INSTANCEID = ''\n , shutdown = setup['shutdown']\n , use_send_beacon = (typeof setup['use_send_beacon'] != 'undefined')?setup['use_send_beacon']:true\n , sendBeacon = (use_send_beacon)?setup['sendBeacon']:null\n , _poll_timer\n , _poll_timer2;\n\n if (PRESENCE_HB === 2) PRESENCE_HB_INTERVAL = 1;\n\n var crypto_obj = setup['crypto_obj'] ||\n {\n 'encrypt' : function(a,key){ return a},\n 'decrypt' : function(b,key){return b}\n };\n\n function _get_url_params(data) {\n if (!data) data = {};\n each( params , function( key, value ) {\n if (!(key in data)) data[key] = value;\n });\n return data;\n }\n\n function _object_to_key_list(o) {\n var l = []\n each( o , function( key, value ) {\n l.push(key);\n });\n return l;\n }\n function _object_to_key_list_sorted(o) {\n return _object_to_key_list(o).sort();\n }\n\n function _get_pam_sign_input_from_params(params) {\n var si = \"\";\n var l = _object_to_key_list_sorted(params);\n\n for (var i in l) {\n var k = l[i]\n si += k + \"=\" + pam_encode(params[k]) ;\n if (i != l.length - 1) si += \"&\"\n }\n return si;\n }\n\n function validate_presence_heartbeat(heartbeat, cur_heartbeat, error) {\n var err = false;\n\n if (typeof heartbeat === 'undefined') {\n return cur_heartbeat;\n }\n\n if (typeof heartbeat === 'number') {\n if (heartbeat > PRESENCE_HB_THRESHOLD || heartbeat == 0)\n err = false;\n else\n err = true;\n } else if(typeof heartbeat === 'boolean'){\n if (!heartbeat) {\n return 0;\n } else {\n return PRESENCE_HB_DEFAULT;\n }\n } else {\n err = true;\n }\n\n if (err) {\n error && error(\"Presence Heartbeat value invalid. Valid range ( x > \" + PRESENCE_HB_THRESHOLD + \" or x = 0). Current Value : \" + (cur_heartbeat || PRESENCE_HB_THRESHOLD));\n return cur_heartbeat || PRESENCE_HB_THRESHOLD;\n } else return heartbeat;\n }\n\n function encrypt(input, key) {\n return crypto_obj['encrypt'](input, key || CIPHER_KEY) || input;\n }\n function decrypt(input, key) {\n return crypto_obj['decrypt'](input, key || CIPHER_KEY) ||\n crypto_obj['decrypt'](input, CIPHER_KEY) ||\n input;\n }\n\n function error_common(message, callback) {\n callback && callback({ 'error' : message || \"error occurred\"});\n error && error(message);\n }\n function _presence_heartbeat() {\n\n clearTimeout(PRESENCE_HB_TIMEOUT);\n\n if (!PRESENCE_HB_INTERVAL || PRESENCE_HB_INTERVAL >= 500 ||\n PRESENCE_HB_INTERVAL < 1 ||\n (!generate_channel_list(CHANNELS,true).length && !generate_channel_group_list(CHANNEL_GROUPS, true).length ) )\n {\n PRESENCE_HB_RUNNING = false;\n return;\n }\n\n PRESENCE_HB_RUNNING = true;\n SELF['presence_heartbeat']({\n 'callback' : function(r) {\n PRESENCE_HB_TIMEOUT = timeout( _presence_heartbeat, (PRESENCE_HB_INTERVAL) * SECOND );\n },\n 'error' : function(e) {\n error && error(\"Presence Heartbeat unable to reach Pubnub servers.\" + JSON.stringify(e));\n PRESENCE_HB_TIMEOUT = timeout( _presence_heartbeat, (PRESENCE_HB_INTERVAL) * SECOND );\n }\n });\n }\n\n function start_presence_heartbeat() {\n !PRESENCE_HB_RUNNING && _presence_heartbeat();\n }\n\n function publish(next) {\n\n if (NO_WAIT_FOR_PENDING) {\n if (!PUB_QUEUE.length) return;\n } else {\n if (next) PUB_QUEUE.sending = 0;\n if ( PUB_QUEUE.sending || !PUB_QUEUE.length ) return;\n PUB_QUEUE.sending = 1;\n }\n\n xdr(PUB_QUEUE.shift());\n }\n function each_channel_group(callback) {\n var count = 0;\n\n each( generate_channel_group_list(CHANNEL_GROUPS), function(channel_group) {\n var chang = CHANNEL_GROUPS[channel_group];\n\n if (!chang) return;\n\n count++;\n (callback||function(){})(chang);\n } );\n\n return count;\n }\n\n function each_channel(callback) {\n var count = 0;\n\n each( generate_channel_list(CHANNELS), function(channel) {\n var chan = CHANNELS[channel];\n\n if (!chan) return;\n\n count++;\n (callback||function(){})(chan);\n } );\n\n return count;\n }\n function _invoke_callback(response, callback, err) {\n if (typeof response == 'object') {\n if (response['error']) {\n var callback_data = {};\n\n if (response['message']) {\n callback_data['message'] = response['message'];\n }\n\n if (response['payload']) {\n callback_data['payload'] = response['payload'];\n }\n\n err && err(callback_data);\n return;\n\n }\n if (response['payload']) {\n if (response['next_page'])\n callback && callback(response['payload'], response['next_page']);\n else\n callback && callback(response['payload']);\n return;\n }\n }\n callback && callback(response);\n }\n\n function _invoke_error(response,err) {\n\n if (typeof response == 'object' && response['error']) {\n var callback_data = {};\n\n if (response['message']) {\n callback_data['message'] = response['message'];\n }\n\n if (response['payload']) {\n callback_data['payload'] = response['payload'];\n }\n \n err && err(callback_data);\n return;\n } else {\n err && err(response);\n }\n }\n function CR(args, callback, url1, data) {\n var callback = args['callback'] || callback\n , err = args['error'] || error\n , jsonp = jsonp_cb();\n\n data = data || {};\n \n if (!data['auth']) {\n data['auth'] = args['auth_key'] || AUTH_KEY;\n }\n \n var url = [\n STD_ORIGIN, 'v1', 'channel-registration',\n 'sub-key', SUBSCRIBE_KEY\n ];\n\n url.push.apply(url,url1);\n \n if (jsonp) data['callback'] = jsonp;\n \n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : url\n });\n\n }\n\n // Announce Leave Event\n var SELF = {\n 'LEAVE' : function( channel, blocking, auth_key, callback, error ) {\n\n var data = { 'uuid' : UUID, 'auth' : auth_key || AUTH_KEY }\n , origin = nextorigin(ORIGIN)\n , callback = callback || function(){}\n , err = error || function(){}\n , url\n , jsonp = jsonp_cb();\n\n\n\n // Prevent Leaving a Presence Channel\n if (channel.indexOf(PRESENCE_SUFFIX) > 0) return true;\n\n\n\n\n if (COMPATIBLE_35) {\n if (!SSL) return false;\n if (jsonp == '0') return false;\n }\n\n if (NOLEAVE) return false;\n\n if (jsonp != '0') data['callback'] = jsonp;\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n url = [\n origin, 'v2', 'presence', 'sub_key',\n SUBSCRIBE_KEY, 'channel', encode(channel), 'leave'\n ];\n\n params = _get_url_params(data);\n\n\n if (sendBeacon) {\n url_string = build_url(url, params);\n if (sendBeacon(url_string)) {\n callback && callback({\"status\": 200, \"action\": \"leave\", \"message\": \"OK\", \"service\": \"Presence\"});\n return true;\n }\n }\n\n\n xdr({\n blocking : blocking || SSL,\n timeout : 2000,\n callback : jsonp,\n data : params,\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : url\n });\n return true;\n },\n 'LEAVE_GROUP' : function( channel_group, blocking, auth_key, callback, error ) {\n\n var data = { 'uuid' : UUID, 'auth' : auth_key || AUTH_KEY }\n , origin = nextorigin(ORIGIN)\n , callback = callback || function(){}\n , err = error || function(){}\n , jsonp = jsonp_cb();\n\n // Prevent Leaving a Presence Channel Group\n if (channel_group.indexOf(PRESENCE_SUFFIX) > 0) return true;\n\n if (COMPATIBLE_35) {\n if (!SSL) return false;\n if (jsonp == '0') return false;\n }\n\n if (NOLEAVE) return false;\n\n if (jsonp != '0') data['callback'] = jsonp;\n\n if (channel_group && channel_group.length > 0) data['channel-group'] = channel_group;\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n blocking : blocking || SSL,\n timeout : 5000,\n callback : jsonp,\n data : _get_url_params(data),\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : [\n origin, 'v2', 'presence', 'sub_key',\n SUBSCRIBE_KEY, 'channel', encode(','), 'leave'\n ]\n });\n return true;\n },\n 'set_resumed' : function(resumed) {\n RESUMED = resumed;\n },\n 'get_cipher_key' : function() {\n return CIPHER_KEY;\n },\n 'set_cipher_key' : function(key) {\n CIPHER_KEY = key;\n },\n 'raw_encrypt' : function(input, key) {\n return encrypt(input, key);\n },\n 'raw_decrypt' : function(input, key) {\n return decrypt(input, key);\n },\n 'get_heartbeat' : function() {\n return PRESENCE_HB;\n },\n \n 'set_heartbeat' : function(heartbeat, heartbeat_interval) {\n PRESENCE_HB = validate_presence_heartbeat(heartbeat, PRESENCE_HB, error);\n PRESENCE_HB_INTERVAL = heartbeat_interval || (PRESENCE_HB / 2) - 1;\n if (PRESENCE_HB == 2) {\n PRESENCE_HB_INTERVAL = 1;\n }\n CONNECT();\n _presence_heartbeat();\n },\n \n 'get_heartbeat_interval' : function() {\n return PRESENCE_HB_INTERVAL;\n },\n \n 'set_heartbeat_interval' : function(heartbeat_interval) {\n PRESENCE_HB_INTERVAL = heartbeat_interval;\n _presence_heartbeat();\n },\n \n 'get_version' : function() {\n return SDK_VER;\n },\n 'getGcmMessageObject' : function(obj) {\n return {\n 'data' : obj\n }\n },\n 'getApnsMessageObject' : function(obj) {\n var x = {\n 'aps' : { 'badge' : 1, 'alert' : ''}\n }\n for (k in obj) {\n k[x] = obj[k];\n }\n return x;\n },\n 'newPnMessage' : function() {\n var x = {};\n if (gcm) x['pn_gcm'] = gcm;\n if (apns) x['pn_apns'] = apns;\n for ( k in n ) {\n x[k] = n[k];\n }\n return x;\n },\n\n '_add_param' : function(key,val) {\n params[key] = val;\n },\n\n 'channel_group' : function(args, callback) {\n var ns_ch = args['channel_group']\n , callback = callback || args['callback']\n , channels = args['channels'] || args['channel']\n , cloak = args['cloak']\n , namespace\n , channel_group\n , url = []\n , data = {}\n , mode = args['mode'] || 'add';\n\n\n if (ns_ch) {\n var ns_ch_a = ns_ch.split(':');\n\n if (ns_ch_a.length > 1) {\n namespace = (ns_ch_a[0] === '*')?null:ns_ch_a[0];\n\n channel_group = ns_ch_a[1];\n } else {\n channel_group = ns_ch_a[0];\n }\n }\n\n namespace && url.push('namespace') && url.push(encode(namespace));\n\n url.push('channel-group');\n\n if (channel_group && channel_group !== '*') {\n url.push(channel_group);\n }\n\n if (channels ) {\n if (isArray(channels)) {\n channels = channels.join(',');\n }\n data[mode] = channels;\n data['cloak'] = (CLOAK)?'true':'false';\n } else {\n if (mode === 'remove') url.push('remove');\n }\n\n if (typeof cloak != 'undefined') data['cloak'] = (cloak)?'true':'false';\n\n CR(args, callback, url, data);\n },\n\n 'channel_group_list_groups' : function(args, callback) {\n var namespace;\n\n namespace = args['namespace'] || args['ns'] || args['channel_group'] || null;\n if (namespace) {\n args[\"channel_group\"] = namespace + \":*\";\n }\n\n SELF['channel_group'](args, callback);\n },\n\n 'channel_group_list_channels' : function(args, callback) {\n if (!args['channel_group']) return error('Missing Channel Group');\n SELF['channel_group'](args, callback);\n },\n\n 'channel_group_remove_channel' : function(args, callback) {\n if (!args['channel_group']) return error('Missing Channel Group');\n if (!args['channel'] && !args['channels'] ) return error('Missing Channel');\n\n args['mode'] = 'remove';\n SELF['channel_group'](args,callback);\n },\n\n 'channel_group_remove_group' : function(args, callback) {\n if (!args['channel_group']) return error('Missing Channel Group');\n if (args['channel']) return error('Use channel_group_remove_channel if you want to remove a channel from a group.');\n\n args['mode'] = 'remove';\n SELF['channel_group'](args,callback);\n },\n\n 'channel_group_add_channel' : function(args, callback) {\n if (!args['channel_group']) return error('Missing Channel Group');\n if (!args['channel'] && !args['channels'] ) return error('Missing Channel');\n SELF['channel_group'](args,callback);\n },\n\n 'channel_group_cloak' : function(args, callback) {\n if (typeof args['cloak'] == 'undefined') {\n callback(CLOAK);\n return;\n }\n CLOAK = args['cloak'];\n SELF['channel_group'](args,callback);\n },\n\n 'channel_group_list_namespaces' : function(args, callback) {\n var url = ['namespace'];\n CR(args, callback, url);\n },\n 'channel_group_remove_namespace' : function(args, callback) {\n var url = ['namespace',args['namespace'],'remove'];\n CR(args, callback, url);\n },\n\n /*\n PUBNUB.history({\n channel : 'my_chat_channel',\n limit : 100,\n callback : function(history) { }\n });\n */\n 'history' : function( args, callback ) {\n var callback = args['callback'] || callback\n , count = args['count'] || args['limit'] || 100\n , reverse = args['reverse'] || \"false\"\n , err = args['error'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , cipher_key = args['cipher_key']\n , channel = args['channel']\n , channel_group = args['channel_group']\n , start = args['start']\n , end = args['end']\n , include_token = args['include_token']\n , string_msg_token = args['string_message_token'] || false\n , params = {}\n , jsonp = jsonp_cb();\n\n // Make sure we have a Channel\n if (!channel && !channel_group) return error('Missing Channel');\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n params['stringtoken'] = 'true';\n params['count'] = count;\n params['reverse'] = reverse;\n params['auth'] = auth_key;\n\n if (channel_group) {\n params['channel-group'] = channel_group;\n if (!channel) {\n channel = ','; \n }\n }\n if (jsonp) params['callback'] = jsonp;\n if (start) params['start'] = start;\n if (end) params['end'] = end;\n if (include_token) params['include_token'] = 'true';\n if (string_msg_token) params['string_message_token'] = 'true';\n\n // Send Message\n xdr({\n callback : jsonp,\n data : _get_url_params(params),\n success : function(response) {\n if (typeof response == 'object' && response['error']) {\n err({'message' : response['message'], 'payload' : response['payload']});\n return;\n }\n var messages = response[0];\n var decrypted_messages = [];\n for (var a = 0; a < messages.length; a++) {\n var new_message = decrypt(messages[a],cipher_key);\n try {\n decrypted_messages['push'](JSON['parse'](new_message));\n } catch (e) {\n decrypted_messages['push']((new_message));\n }\n }\n callback([decrypted_messages, response[1], response[2]]);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : [\n STD_ORIGIN, 'v2', 'history', 'sub-key',\n SUBSCRIBE_KEY, 'channel', encode(channel)\n ]\n });\n },\n\n /*\n PUBNUB.replay({\n source : 'my_channel',\n destination : 'new_channel'\n });\n */\n 'replay' : function(args, callback) {\n var callback = callback || args['callback'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , source = args['source']\n , destination = args['destination']\n , stop = args['stop']\n , start = args['start']\n , end = args['end']\n , reverse = args['reverse']\n , limit = args['limit']\n , jsonp = jsonp_cb()\n , data = {}\n , url;\n\n // Check User Input\n if (!source) return error('Missing Source Channel');\n if (!destination) return error('Missing Destination Channel');\n if (!PUBLISH_KEY) return error('Missing Publish Key');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n // Setup URL Params\n if (jsonp != '0') data['callback'] = jsonp;\n if (stop) data['stop'] = 'all';\n if (reverse) data['reverse'] = 'true';\n if (start) data['start'] = start;\n if (end) data['end'] = end;\n if (limit) data['count'] = limit;\n\n data['auth'] = auth_key;\n\n // Compose URL Parts\n url = [\n STD_ORIGIN, 'v1', 'replay',\n PUBLISH_KEY, SUBSCRIBE_KEY,\n source, destination\n ];\n\n // Start (or Stop) Replay!\n xdr({\n callback : jsonp,\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function() { callback([ 0, 'Disconnected' ]) },\n url : url,\n data : _get_url_params(data)\n });\n },\n\n /*\n PUBNUB.auth('AJFLKAJSDKLA');\n */\n 'auth' : function(auth) {\n AUTH_KEY = auth;\n CONNECT();\n },\n\n /*\n PUBNUB.time(function(time){ });\n */\n 'time' : function(callback) {\n var jsonp = jsonp_cb();\n\n var data = { 'uuid' : UUID, 'auth' : AUTH_KEY }\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n timeout : SECOND * 5,\n url : [STD_ORIGIN, 'time', jsonp],\n success : function(response) { callback(response[0]) },\n fail : function() { callback(0) }\n });\n },\n\n /*\n PUBNUB.publish({\n channel : 'my_chat_channel',\n message : 'hello!'\n });\n */\n 'publish' : function( args, callback ) {\n var msg = args['message'];\n if (!msg) return error('Missing Message');\n\n var callback = callback || args['callback'] || msg['callback'] || function(){}\n , channel = args['channel'] || msg['channel']\n , auth_key = args['auth_key'] || AUTH_KEY\n , cipher_key = args['cipher_key']\n , err = args['error'] || msg['error'] || function() {}\n , post = args['post'] || false\n , store = ('store_in_history' in args) ? args['store_in_history']: true\n , jsonp = jsonp_cb()\n , add_msg = 'push'\n , params\n , url;\n\n if (args['prepend']) add_msg = 'unshift'\n\n if (!channel) return error('Missing Channel');\n if (!PUBLISH_KEY) return error('Missing Publish Key');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n if (msg['getPubnubMessage']) {\n msg = msg['getPubnubMessage']();\n }\n\n // If trying to send Object\n msg = JSON['stringify'](encrypt(msg, cipher_key));\n\n // Create URL\n url = [\n STD_ORIGIN, 'publish',\n PUBLISH_KEY, SUBSCRIBE_KEY,\n 0, encode(channel),\n jsonp, encode(msg)\n ];\n\n params = { 'uuid' : UUID, 'auth' : auth_key }\n\n if (!store) params['store'] =\"0\"\n\n if (USE_INSTANCEID) params['instanceid'] = INSTANCEID;\n\n // Queue Message Send\n PUB_QUEUE[add_msg]({\n callback : jsonp,\n timeout : SECOND * 5,\n url : url,\n data : _get_url_params(params),\n fail : function(response){\n _invoke_error(response, err);\n publish(1);\n },\n success : function(response) {\n _invoke_callback(response, callback, err);\n publish(1);\n },\n mode : (post)?'POST':'GET'\n });\n\n // Send Message\n publish();\n },\n\n /*\n PUBNUB.unsubscribe({ channel : 'my_chat' });\n */\n 'unsubscribe' : function(args, callback) {\n var channel = args['channel']\n , channel_group = args['channel_group']\n , auth_key = args['auth_key'] || AUTH_KEY\n , callback = callback || args['callback'] || function(){}\n , err = args['error'] || function(){};\n\n TIMETOKEN = 0;\n //SUB_RESTORE = 1; REVISIT !!!!\n\n if (channel) {\n // Prepare Channel(s)\n channel = map( (\n channel.join ? channel.join(',') : ''+channel\n ).split(','), function(channel) {\n if (!CHANNELS[channel]) return;\n return channel + ',' + channel + PRESENCE_SUFFIX;\n } ).join(',');\n\n // Iterate over Channels\n each( channel.split(','), function(ch) {\n var CB_CALLED = true;\n if (!ch) return;\n CHANNELS[ch] = 0;\n if (ch in STATE) delete STATE[ch];\n if (READY) {\n CB_CALLED = SELF['LEAVE']( ch, 0 , auth_key, callback, err);\n }\n if (!CB_CALLED) callback({action : \"leave\"});\n\n \n } );\n }\n\n if (channel_group) {\n // Prepare channel group(s)\n channel_group = map( (\n channel_group.join ? channel_group.join(',') : ''+channel_group\n ).split(','), function(channel_group) {\n if (!CHANNEL_GROUPS[channel_group]) return;\n return channel_group + ',' + channel_group + PRESENCE_SUFFIX;\n } ).join(',');\n\n // Iterate over channel groups\n each( channel_group.split(','), function(chg) {\n var CB_CALLED = true;\n if (!chg) return;\n CHANNEL_GROUPS[chg] = 0;\n if (chg in STATE) delete STATE[chg];\n if (READY) {\n CB_CALLED = SELF['LEAVE_GROUP']( chg, 0 , auth_key, callback, err);\n }\n if (!CB_CALLED) callback({action : \"leave\"});\n\n } );\n }\n\n // Reset Connection if Count Less\n CONNECT();\n },\n\n /*\n PUBNUB.subscribe({\n channel : 'my_chat'\n callback : function(message) { }\n });\n */\n 'subscribe' : function( args, callback ) {\n var channel = args['channel']\n , channel_group = args['channel_group']\n , callback = callback || args['callback']\n , callback = callback || args['message']\n , connect = args['connect'] || function(){}\n , reconnect = args['reconnect'] || function(){}\n , disconnect = args['disconnect'] || function(){}\n , SUB_ERROR = args['error'] || SUB_ERROR || function(){}\n , idlecb = args['idle'] || function(){}\n , presence = args['presence'] || 0\n , noheresync = args['noheresync'] || 0\n , backfill = args['backfill'] || 0\n , timetoken = args['timetoken'] || 0\n , sub_timeout = args['timeout'] || SUB_TIMEOUT\n , windowing = args['windowing'] || SUB_WINDOWING\n , state = args['state']\n , heartbeat = args['heartbeat'] || args['pnexpires']\n , heartbeat_interval = args['heartbeat_interval']\n , restore = args['restore'] || SUB_RESTORE;\n\n AUTH_KEY = args['auth_key'] || AUTH_KEY;\n\n // Restore Enabled?\n SUB_RESTORE = restore;\n\n // Always Reset the TT\n TIMETOKEN = timetoken;\n\n // Make sure we have a Channel\n if (!channel && !channel_group) {\n return error('Missing Channel');\n }\n\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n if (heartbeat || heartbeat === 0 || heartbeat_interval || heartbeat_interval === 0) {\n SELF['set_heartbeat'](heartbeat, heartbeat_interval);\n }\n\n // Setup Channel(s)\n if (channel) {\n each( (channel.join ? channel.join(',') : ''+channel).split(','),\n function(channel) {\n var settings = CHANNELS[channel] || {};\n\n // Store Channel State\n CHANNELS[SUB_CHANNEL = channel] = {\n name : channel,\n connected : settings.connected,\n disconnected : settings.disconnected,\n subscribed : 1,\n callback : SUB_CALLBACK = callback,\n 'cipher_key' : args['cipher_key'],\n connect : connect,\n disconnect : disconnect,\n reconnect : reconnect\n };\n\n if (state) {\n if (channel in state) {\n STATE[channel] = state[channel];\n } else {\n STATE[channel] = state;\n }\n }\n\n // Presence Enabled?\n if (!presence) return;\n\n // Subscribe Presence Channel\n SELF['subscribe']({\n 'channel' : channel + PRESENCE_SUFFIX,\n 'callback' : presence,\n 'restore' : restore\n });\n\n // Presence Subscribed?\n if (settings.subscribed) return;\n\n // See Who's Here Now?\n if (noheresync) return;\n SELF['here_now']({\n 'channel' : channel,\n 'data' : _get_url_params({ 'uuid' : UUID, 'auth' : AUTH_KEY }),\n 'callback' : function(here) {\n each( 'uuids' in here ? here['uuids'] : [],\n function(uid) { presence( {\n 'action' : 'join',\n 'uuid' : uid,\n 'timestamp' : Math.floor(rnow() / 1000),\n 'occupancy' : here['occupancy'] || 1\n }, here, channel ); } );\n }\n });\n } );\n }\n\n // Setup Channel Groups\n if (channel_group) {\n each( (channel_group.join ? channel_group.join(',') : ''+channel_group).split(','),\n function(channel_group) {\n var settings = CHANNEL_GROUPS[channel_group] || {};\n\n CHANNEL_GROUPS[channel_group] = {\n name : channel_group,\n connected : settings.connected,\n disconnected : settings.disconnected,\n subscribed : 1,\n callback : SUB_CALLBACK = callback,\n 'cipher_key' : args['cipher_key'],\n connect : connect,\n disconnect : disconnect,\n reconnect : reconnect\n };\n\n // Presence Enabled?\n if (!presence) return;\n\n // Subscribe Presence Channel\n SELF['subscribe']({\n 'channel_group' : channel_group + PRESENCE_SUFFIX,\n 'callback' : presence,\n 'restore' : restore,\n 'auth_key' : AUTH_KEY\n });\n\n // Presence Subscribed?\n if (settings.subscribed) return;\n\n // See Who's Here Now?\n if (noheresync) return;\n SELF['here_now']({\n 'channel_group' : channel_group,\n 'data' : _get_url_params({ 'uuid' : UUID, 'auth' : AUTH_KEY }),\n 'callback' : function(here) {\n each( 'uuids' in here ? here['uuids'] : [],\n function(uid) { presence( {\n 'action' : 'join',\n 'uuid' : uid,\n 'timestamp' : Math.floor(rnow() / 1000),\n 'occupancy' : here['occupancy'] || 1\n }, here, channel_group ); } );\n }\n });\n } );\n }\n\n\n // Test Network Connection\n function _test_connection(success) {\n if (success) {\n // Begin Next Socket Connection\n timeout( CONNECT, windowing);\n }\n else {\n // New Origin on Failed Connection\n STD_ORIGIN = nextorigin( ORIGIN, 1 );\n SUB_ORIGIN = nextorigin( ORIGIN, 1 );\n\n // Re-test Connection\n timeout( function() {\n SELF['time'](_test_connection);\n }, SECOND );\n }\n\n // Disconnect & Reconnect\n each_channel(function(channel){\n // Reconnect\n if (success && channel.disconnected) {\n channel.disconnected = 0;\n return channel.reconnect(channel.name);\n }\n\n // Disconnect\n if (!success && !channel.disconnected) {\n channel.disconnected = 1;\n channel.disconnect(channel.name);\n }\n });\n \n // Disconnect & Reconnect for channel groups\n each_channel_group(function(channel_group){\n // Reconnect\n if (success && channel_group.disconnected) {\n channel_group.disconnected = 0;\n return channel_group.reconnect(channel_group.name);\n }\n\n // Disconnect\n if (!success && !channel_group.disconnected) {\n channel_group.disconnected = 1;\n channel_group.disconnect(channel_group.name);\n }\n });\n }\n\n // Evented Subscribe\n function _connect() {\n var jsonp = jsonp_cb()\n , channels = generate_channel_list(CHANNELS).join(',')\n , channel_groups = generate_channel_group_list(CHANNEL_GROUPS).join(',');\n\n // Stop Connection\n if (!channels && !channel_groups) return;\n\n if (!channels) channels = ',';\n\n // Connect to PubNub Subscribe Servers\n _reset_offline();\n\n var data = _get_url_params({ 'uuid' : UUID, 'auth' : AUTH_KEY });\n\n if (channel_groups) {\n data['channel-group'] = channel_groups;\n }\n\n\n var st = JSON.stringify(STATE);\n if (st.length > 2) data['state'] = JSON.stringify(STATE);\n\n if (PRESENCE_HB) data['heartbeat'] = PRESENCE_HB;\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n start_presence_heartbeat();\n SUB_RECEIVER = xdr({\n timeout : sub_timeout,\n callback : jsonp,\n fail : function(response) {\n if (response && response['error'] && response['service']) {\n _invoke_error(response, SUB_ERROR);\n _test_connection(1);\n } else {\n SELF['time'](function(success){\n !success && ( _invoke_error(response, SUB_ERROR));\n _test_connection(success);\n });\n }\n },\n data : _get_url_params(data),\n url : [\n SUB_ORIGIN, 'subscribe',\n SUBSCRIBE_KEY, encode(channels),\n jsonp, TIMETOKEN\n ],\n success : function(messages) {\n\n // Check for Errors\n if (!messages || (\n typeof messages == 'object' &&\n 'error' in messages &&\n messages['error']\n )) {\n SUB_ERROR(messages['error']);\n return timeout( CONNECT, SECOND );\n }\n\n // User Idle Callback\n idlecb(messages[1]);\n\n // Restore Previous Connection Point if Needed\n TIMETOKEN = !TIMETOKEN &&\n SUB_RESTORE &&\n db['get'](SUBSCRIBE_KEY) || messages[1];\n\n /*\n // Connect\n each_channel_registry(function(registry){\n if (registry.connected) return;\n registry.connected = 1;\n registry.connect(channel.name);\n });\n */\n\n // Connect\n each_channel(function(channel){\n if (channel.connected) return;\n channel.connected = 1;\n channel.connect(channel.name);\n });\n\n // Connect for channel groups\n each_channel_group(function(channel_group){\n if (channel_group.connected) return;\n channel_group.connected = 1;\n channel_group.connect(channel_group.name);\n });\n\n if (RESUMED && !SUB_RESTORE) {\n TIMETOKEN = 0;\n RESUMED = false;\n // Update Saved Timetoken\n db['set']( SUBSCRIBE_KEY, 0 );\n timeout( _connect, windowing );\n return;\n }\n\n // Invoke Memory Catchup and Receive Up to 100\n // Previous Messages from the Queue.\n if (backfill) {\n TIMETOKEN = 10000;\n backfill = 0;\n }\n\n // Update Saved Timetoken\n db['set']( SUBSCRIBE_KEY, messages[1] );\n\n // Route Channel <---> Callback for Message\n var next_callback = (function() {\n var channels = '';\n var channels2 = '';\n\n if (messages.length > 3) {\n channels = messages[3];\n channels2 = messages[2];\n } else if (messages.length > 2) {\n channels = messages[2];\n } else {\n channels = map(\n generate_channel_list(CHANNELS), function(chan) { return map(\n Array(messages[0].length)\n .join(',').split(','),\n function() { return chan; }\n ) }).join(',')\n }\n\n var list = channels.split(',');\n var list2 = (channels2)?channels2.split(','):[];\n\n return function() {\n var channel = list.shift()||SUB_CHANNEL;\n var channel2 = list2.shift();\n\n var chobj = {};\n\n if (channel2) {\n if (channel && channel.indexOf('-pnpres') >= 0 \n && channel2.indexOf('-pnpres') < 0) {\n channel2 += '-pnpres';\n }\n chobj = CHANNEL_GROUPS[channel2] || CHANNELS[channel2] || {'callback' : function(){}};\n } else {\n chobj = CHANNELS[channel];\n }\n\n var r = [\n chobj\n .callback||SUB_CALLBACK,\n channel.split(PRESENCE_SUFFIX)[0]\n ];\n channel2 && r.push(channel2.split(PRESENCE_SUFFIX)[0]);\n return r;\n };\n })();\n\n var latency = detect_latency(+messages[1]);\n each( messages[0], function(msg) {\n var next = next_callback();\n var decrypted_msg = decrypt(msg,\n (CHANNELS[next[1]])?CHANNELS[next[1]]['cipher_key']:null);\n next[0] && next[0]( decrypted_msg, messages, next[2] || next[1], latency, next[1]);\n });\n\n timeout( _connect, windowing );\n }\n });\n }\n\n CONNECT = function() {\n _reset_offline();\n timeout( _connect, windowing );\n };\n\n // Reduce Status Flicker\n if (!READY) return READY_BUFFER.push(CONNECT);\n\n // Connect Now\n CONNECT();\n },\n\n /*\n PUBNUB.here_now({ channel : 'my_chat', callback : fun });\n */\n 'here_now' : function( args, callback ) {\n var callback = args['callback'] || callback\n , err = args['error'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , channel = args['channel']\n , channel_group = args['channel_group']\n , jsonp = jsonp_cb()\n , uuids = ('uuids' in args) ? args['uuids'] : true\n , state = args['state']\n , data = { 'uuid' : UUID, 'auth' : auth_key };\n\n if (!uuids) data['disable_uuids'] = 1;\n if (state) data['state'] = 1;\n\n // Make sure we have a Channel\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n var url = [\n STD_ORIGIN, 'v2', 'presence',\n 'sub_key', SUBSCRIBE_KEY\n ];\n\n channel && url.push('channel') && url.push(encode(channel));\n\n if (jsonp != '0') { data['callback'] = jsonp; }\n\n if (channel_group) {\n data['channel-group'] = channel_group;\n !channel && url.push('channel') && url.push(','); \n }\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : url\n });\n },\n\n /*\n PUBNUB.current_channels_by_uuid({ channel : 'my_chat', callback : fun });\n */\n 'where_now' : function( args, callback ) {\n var callback = args['callback'] || callback\n , err = args['error'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , jsonp = jsonp_cb()\n , uuid = args['uuid'] || UUID\n , data = { 'auth' : auth_key };\n\n // Make sure we have a Channel\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n if (jsonp != '0') { data['callback'] = jsonp; }\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : [\n STD_ORIGIN, 'v2', 'presence',\n 'sub_key', SUBSCRIBE_KEY,\n 'uuid', encode(uuid)\n ]\n });\n },\n\n 'state' : function(args, callback) {\n var callback = args['callback'] || callback || function(r) {}\n , err = args['error'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , jsonp = jsonp_cb()\n , state = args['state']\n , uuid = args['uuid'] || UUID\n , channel = args['channel']\n , channel_group = args['channel_group']\n , url\n , data = _get_url_params({ 'auth' : auth_key });\n\n // Make sure we have a Channel\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n if (!uuid) return error('Missing UUID');\n if (!channel && !channel_group) return error('Missing Channel');\n\n if (jsonp != '0') { data['callback'] = jsonp; }\n\n if (typeof channel != 'undefined'\n && CHANNELS[channel] && CHANNELS[channel].subscribed ) {\n if (state) STATE[channel] = state;\n }\n\n if (typeof channel_group != 'undefined'\n && CHANNEL_GROUPS[channel_group]\n && CHANNEL_GROUPS[channel_group].subscribed\n ) {\n if (state) STATE[channel_group] = state;\n data['channel-group'] = channel_group;\n\n if (!channel) {\n channel = ',';\n }\n }\n\n data['state'] = JSON.stringify(state);\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n if (state) {\n url = [\n STD_ORIGIN, 'v2', 'presence',\n 'sub-key', SUBSCRIBE_KEY,\n 'channel', channel,\n 'uuid', uuid, 'data'\n ]\n } else {\n url = [\n STD_ORIGIN, 'v2', 'presence',\n 'sub-key', SUBSCRIBE_KEY,\n 'channel', channel,\n 'uuid', encode(uuid)\n ]\n }\n\n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : url\n\n });\n\n },\n\n /*\n PUBNUB.grant({\n channel : 'my_chat',\n callback : fun,\n error : fun,\n ttl : 24 * 60, // Minutes\n read : true,\n write : true,\n auth_key : '3y8uiajdklytowsj'\n });\n */\n 'grant' : function( args, callback ) {\n var callback = args['callback'] || callback\n , err = args['error'] || function(){}\n , channel = args['channel'] || args['channels']\n , channel_group = args['channel_group']\n , jsonp = jsonp_cb()\n , ttl = args['ttl']\n , r = (args['read'] )?\"1\":\"0\"\n , w = (args['write'])?\"1\":\"0\"\n , m = (args['manage'])?\"1\":\"0\"\n , auth_key = args['auth_key'] || args['auth_keys'];\n\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n if (!PUBLISH_KEY) return error('Missing Publish Key');\n if (!SECRET_KEY) return error('Missing Secret Key');\n\n var timestamp = Math.floor(new Date().getTime() / 1000)\n , sign_input = SUBSCRIBE_KEY + \"\\n\" + PUBLISH_KEY + \"\\n\"\n + \"grant\" + \"\\n\";\n\n var data = {\n 'w' : w,\n 'r' : r,\n 'timestamp' : timestamp\n };\n if (args['manage']) {\n data['m'] = m;\n }\n if (isArray(channel)) {\n channel = channel['join'](',');\n }\n if (isArray(auth_key)) {\n auth_key = auth_key['join'](',');\n }\n if (typeof channel != 'undefined' && channel != null && channel.length > 0) data['channel'] = channel;\n if (typeof channel_group != 'undefined' && channel_group != null && channel_group.length > 0) {\n data['channel-group'] = channel_group;\n }\n if (jsonp != '0') { data['callback'] = jsonp; }\n if (ttl || ttl === 0) data['ttl'] = ttl;\n\n if (auth_key) data['auth'] = auth_key;\n\n data = _get_url_params(data)\n\n if (!auth_key) delete data['auth'];\n\n sign_input += _get_pam_sign_input_from_params(data);\n\n var signature = hmac_SHA256( sign_input, SECRET_KEY );\n\n signature = signature.replace( /\\+/g, \"-\" );\n signature = signature.replace( /\\//g, \"_\" );\n\n data['signature'] = signature;\n\n xdr({\n callback : jsonp,\n data : data,\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : [\n STD_ORIGIN, 'v1', 'auth', 'grant' ,\n 'sub-key', SUBSCRIBE_KEY\n ]\n });\n },\n\n /*\n PUBNUB.mobile_gw_provision ({\n device_id: 'A655FBA9931AB',\n op : 'add' | 'remove',\n gw_type : 'apns' | 'gcm',\n channel : 'my_chat',\n callback : fun,\n error : fun,\n });\n */\n\n 'mobile_gw_provision' : function( args ) {\n\n var callback = args['callback'] || function(){}\n , auth_key = args['auth_key'] || AUTH_KEY\n , err = args['error'] || function() {}\n , jsonp = jsonp_cb()\n , channel = args['channel']\n , op = args['op']\n , gw_type = args['gw_type']\n , device_id = args['device_id']\n , params\n , url;\n\n if (!device_id) return error('Missing Device ID (device_id)');\n if (!gw_type) return error('Missing GW Type (gw_type: gcm or apns)');\n if (!op) return error('Missing GW Operation (op: add or remove)');\n if (!channel) return error('Missing gw destination Channel (channel)');\n if (!PUBLISH_KEY) return error('Missing Publish Key');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n\n // Create URL\n url = [\n STD_ORIGIN, 'v1/push/sub-key',\n SUBSCRIBE_KEY, 'devices', device_id\n ];\n\n params = { 'uuid' : UUID, 'auth' : auth_key, 'type': gw_type};\n\n if (op == \"add\") {\n params['add'] = channel;\n } else if (op == \"remove\") {\n params['remove'] = channel;\n }\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n callback : jsonp,\n data : params,\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : url\n });\n\n },\n\n /*\n PUBNUB.audit({\n channel : 'my_chat',\n callback : fun,\n error : fun,\n read : true,\n write : true,\n auth_key : '3y8uiajdklytowsj'\n });\n */\n 'audit' : function( args, callback ) {\n var callback = args['callback'] || callback\n , err = args['error'] || function(){}\n , channel = args['channel']\n , channel_group = args['channel_group']\n , auth_key = args['auth_key']\n , jsonp = jsonp_cb();\n\n // Make sure we have a Channel\n if (!callback) return error('Missing Callback');\n if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');\n if (!PUBLISH_KEY) return error('Missing Publish Key');\n if (!SECRET_KEY) return error('Missing Secret Key');\n\n var timestamp = Math.floor(new Date().getTime() / 1000)\n , sign_input = SUBSCRIBE_KEY + \"\\n\"\n + PUBLISH_KEY + \"\\n\"\n + \"audit\" + \"\\n\";\n\n var data = {'timestamp' : timestamp };\n if (jsonp != '0') { data['callback'] = jsonp; }\n if (typeof channel != 'undefined' && channel != null && channel.length > 0) data['channel'] = channel;\n if (typeof channel_group != 'undefined' && channel_group != null && channel_group.length > 0) {\n data['channel-group'] = channel_group;\n }\n if (auth_key) data['auth'] = auth_key;\n\n data = _get_url_params(data);\n\n if (!auth_key) delete data['auth'];\n\n sign_input += _get_pam_sign_input_from_params(data);\n\n var signature = hmac_SHA256( sign_input, SECRET_KEY );\n\n signature = signature.replace( /\\+/g, \"-\" );\n signature = signature.replace( /\\//g, \"_\" );\n\n data['signature'] = signature;\n xdr({\n callback : jsonp,\n data : data,\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) {\n _invoke_error(response, err);\n },\n url : [\n STD_ORIGIN, 'v1', 'auth', 'audit' ,\n 'sub-key', SUBSCRIBE_KEY\n ]\n });\n },\n\n /*\n PUBNUB.revoke({\n channel : 'my_chat',\n callback : fun,\n error : fun,\n auth_key : '3y8uiajdklytowsj'\n });\n */\n 'revoke' : function( args, callback ) {\n args['read'] = false;\n args['write'] = false;\n SELF['grant']( args, callback );\n },\n 'set_uuid' : function(uuid) {\n UUID = uuid;\n CONNECT();\n },\n 'get_uuid' : function() {\n return UUID;\n },\n 'isArray' : function(arg) {\n return isArray(arg);\n },\n 'get_subscibed_channels' : function() {\n return generate_channel_list(CHANNELS, true);\n },\n 'presence_heartbeat' : function(args) {\n var callback = args['callback'] || function() {}\n var err = args['error'] || function() {}\n var jsonp = jsonp_cb();\n var data = { 'uuid' : UUID, 'auth' : AUTH_KEY };\n\n var st = JSON['stringify'](STATE);\n if (st.length > 2) data['state'] = JSON['stringify'](STATE);\n\n if (PRESENCE_HB > 0 && PRESENCE_HB < 320) data['heartbeat'] = PRESENCE_HB;\n\n if (jsonp != '0') { data['callback'] = jsonp; }\n\n var channels = encode(generate_channel_list(CHANNELS, true)['join'](','));\n var channel_groups = generate_channel_group_list(CHANNEL_GROUPS, true)['join'](',');\n\n if (!channels) channels = ',';\n if (channel_groups) data['channel-group'] = channel_groups;\n\n if (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n callback : jsonp,\n data : _get_url_params(data),\n timeout : SECOND * 5,\n url : [\n STD_ORIGIN, 'v2', 'presence',\n 'sub-key', SUBSCRIBE_KEY,\n 'channel' , channels,\n 'heartbeat'\n ],\n success : function(response) {\n _invoke_callback(response, callback, err);\n },\n fail : function(response) { _invoke_error(response, err); }\n });\n },\n 'stop_timers': function () {\n clearTimeout(_poll_timer);\n clearTimeout(_poll_timer2);\n clearTimeout(PRESENCE_HB_TIMEOUT);\n },\n 'shutdown': function () {\n SELF['stop_timers']();\n shutdown && shutdown();\n },\n\n // Expose PUBNUB Functions\n 'xdr' : xdr,\n 'ready' : ready,\n 'db' : db,\n 'uuid' : generate_uuid,\n 'map' : map,\n 'each' : each,\n 'each-channel' : each_channel,\n 'grep' : grep,\n 'offline' : function(){ _reset_offline(\n 1, { \"message\" : \"Offline. Please check your network settings.\" })\n },\n 'supplant' : supplant,\n 'now' : rnow,\n 'unique' : unique,\n 'updater' : updater\n };\n\n function _poll_online() {\n _is_online() || _reset_offline( 1, {\n \"error\" : \"Offline. Please check your network settings. \"\n });\n _poll_timer && clearTimeout(_poll_timer);\n _poll_timer = timeout( _poll_online, SECOND );\n }\n\n function _poll_online2() {\n if (!TIME_CHECK) return;\n SELF['time'](function(success){\n detect_time_detla( function(){}, success );\n success || _reset_offline( 1, {\n \"error\" : \"Heartbeat failed to connect to Pubnub Servers.\" +\n \"Please check your network settings.\"\n });\n _poll_timer2 && clearTimeout(_poll_timer2);\n _poll_timer2 = timeout( _poll_online2, KEEPALIVE );\n });\n }\n\n function _reset_offline(err, msg) {\n SUB_RECEIVER && SUB_RECEIVER(err, msg);\n SUB_RECEIVER = null;\n\n clearTimeout(_poll_timer);\n clearTimeout(_poll_timer2);\n }\n \n if (!UUID) UUID = SELF['uuid']();\n if (!INSTANCEID) INSTANCEID = SELF['uuid']();\n db['set']( SUBSCRIBE_KEY + 'uuid', UUID );\n\n _poll_timer = timeout( _poll_online, SECOND );\n _poll_timer2 = timeout( _poll_online2, KEEPALIVE );\n PRESENCE_HB_TIMEOUT = timeout(\n start_presence_heartbeat,\n ( PRESENCE_HB_INTERVAL - 3 ) * SECOND\n );\n\n // Detect Age of Message\n function detect_latency(tt) {\n var adjusted_time = rnow() - TIME_DRIFT;\n return adjusted_time - tt / 10000;\n }\n\n detect_time_detla();\n function detect_time_detla( cb, time ) {\n var stime = rnow();\n\n time && calculate(time) || SELF['time'](calculate);\n\n function calculate(time) {\n if (!time) return;\n var ptime = time / 10000\n , latency = (rnow() - stime) / 2;\n TIME_DRIFT = rnow() - (ptime + latency);\n cb && cb(TIME_DRIFT);\n }\n }\n\n return SELF;\n}\nfunction crypto_obj() {\n\n function SHA256(s) {\n return CryptoJS['SHA256'](s)['toString'](CryptoJS['enc']['Hex']);\n }\n\n var iv = \"0123456789012345\";\n\n var allowedKeyEncodings = ['hex', 'utf8', 'base64', 'binary'];\n var allowedKeyLengths = [128, 256];\n var allowedModes = ['ecb', 'cbc'];\n\n var defaultOptions = {\n 'encryptKey': true,\n 'keyEncoding': 'utf8',\n 'keyLength': 256,\n 'mode': 'cbc'\n };\n\n function parse_options(options) {\n\n // Defaults\n options = options || {};\n if (!options['hasOwnProperty']('encryptKey')) options['encryptKey'] = defaultOptions['encryptKey'];\n if (!options['hasOwnProperty']('keyEncoding')) options['keyEncoding'] = defaultOptions['keyEncoding'];\n if (!options['hasOwnProperty']('keyLength')) options['keyLength'] = defaultOptions['keyLength'];\n if (!options['hasOwnProperty']('mode')) options['mode'] = defaultOptions['mode'];\n\n // Validation\n if (allowedKeyEncodings['indexOf'](options['keyEncoding']['toLowerCase']()) == -1) options['keyEncoding'] = defaultOptions['keyEncoding'];\n if (allowedKeyLengths['indexOf'](parseInt(options['keyLength'], 10)) == -1) options['keyLength'] = defaultOptions['keyLength'];\n if (allowedModes['indexOf'](options['mode']['toLowerCase']()) == -1) options['mode'] = defaultOptions['mode'];\n\n return options;\n\n }\n\n function decode_key(key, options) {\n if (options['keyEncoding'] == 'base64') {\n return CryptoJS['enc']['Base64']['parse'](key);\n } else if (options['keyEncoding'] == 'hex') {\n return CryptoJS['enc']['Hex']['parse'](key);\n } else {\n return key;\n }\n }\n\n function get_padded_key(key, options) {\n key = decode_key(key, options);\n if (options['encryptKey']) {\n return CryptoJS['enc']['Utf8']['parse'](SHA256(key)['slice'](0, 32));\n } else {\n return key;\n }\n }\n\n function get_mode(options) {\n if (options['mode'] == 'ecb') {\n return CryptoJS['mode']['ECB'];\n } else {\n return CryptoJS['mode']['CBC'];\n }\n }\n\n function get_iv(options) {\n return (options['mode'] == 'cbc') ? CryptoJS['enc']['Utf8']['parse'](iv) : null;\n }\n\n return {\n\n 'encrypt': function(data, key, options) {\n if (!key) return data;\n options = parse_options(options);\n var iv = get_iv(options);\n var mode = get_mode(options);\n var cipher_key = get_padded_key(key, options);\n var hex_message = JSON['stringify'](data);\n var encryptedHexArray = CryptoJS['AES']['encrypt'](hex_message, cipher_key, {'iv': iv, 'mode': mode})['ciphertext'];\n var base_64_encrypted = encryptedHexArray['toString'](CryptoJS['enc']['Base64']);\n return base_64_encrypted || data;\n },\n\n 'decrypt': function(data, key, options) {\n if (!key) return data;\n options = parse_options(options);\n var iv = get_iv(options);\n var mode = get_mode(options);\n var cipher_key = get_padded_key(key, options);\n try {\n var binary_enc = CryptoJS['enc']['Base64']['parse'](data);\n var json_plain = CryptoJS['AES']['decrypt']({'ciphertext': binary_enc}, cipher_key, {'iv': iv, 'mode': mode})['toString'](CryptoJS['enc']['Utf8']);\n var plaintext = JSON['parse'](json_plain);\n return plaintext;\n }\n catch (e) {\n return undefined;\n }\n }\n };\n}\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n/* =-========================= UTIL =============================-= */\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n\nwindow['PUBNUB'] || (function() {\n\n/**\n * UTIL LOCALS\n */\n\nvar SWF = 'https://pubnub.a.ssl.fastly.net/pubnub.swf'\n, ASYNC = 'async'\n, UA = navigator.userAgent\n, PNSDK = 'PubNub-JS-' + 'Web' + '/' + '3.7.14'\n, XORIGN = UA.indexOf('MSIE 6') == -1;\n\n/**\n * CONSOLE COMPATIBILITY\n */\nwindow.console || (window.console=window.console||{});\nconsole.log || (\n console.log =\n console.error =\n ((window.opera||{}).postError||function(){})\n);\n\n/**\n * LOCAL STORAGE OR COOKIE\n */\nvar db = (function(){\n var store = {};\n var ls = false;\n try {\n ls = window['localStorage'];\n } catch (e) { }\n var cookieGet = function(key) {\n if (document.cookie.indexOf(key) == -1) return null;\n return ((document.cookie||'').match(\n RegExp(key+'=([^;]+)')\n )||[])[1] || null;\n };\n var cookieSet = function( key, value ) {\n document.cookie = key + '=' + value +\n '; expires=Thu, 1 Aug 2030 20:00:00 UTC; path=/';\n };\n var cookieTest = (function() {\n try {\n cookieSet('pnctest', '1');\n return cookieGet('pnctest') === '1';\n } catch (e) {\n return false;\n }\n }());\n return {\n 'get' : function(key) {\n try {\n if (ls) return ls.getItem(key);\n if (cookieTest) return cookieGet(key);\n return store[key];\n } catch(e) {\n return store[key];\n }\n },\n 'set' : function( key, value ) {\n try {\n if (ls) return ls.setItem( key, value ) && 0;\n if (cookieTest) cookieSet( key, value );\n store[key] = value;\n } catch(e) {\n store[key] = value;\n }\n }\n };\n})();\n\nfunction get_hmac_SHA256(data,key) {\n var hash = CryptoJS['HmacSHA256'](data, key);\n return hash.toString(CryptoJS['enc']['Base64']);\n}\n\n/**\n * $\n * =\n * var div = $('divid');\n */\nfunction $(id) { return document.getElementById(id) }\n\n/**\n * ERROR\n * =====\n * error('message');\n */\nfunction error(message) { console['error'](message) }\n\n/**\n * SEARCH\n * ======\n * var elements = search('a div span');\n */\nfunction search( elements, start) {\n var list = [];\n each( elements.split(/\\s+/), function(el) {\n each( (start || document).getElementsByTagName(el), function(node) {\n list.push(node);\n } );\n });\n return list;\n}\n\n/**\n * BIND\n * ====\n * bind( 'keydown', search('a')[0], function(element) {\n * ...\n * } );\n */\nfunction bind( type, el, fun ) {\n each( type.split(','), function(etype) {\n var rapfun = function(e) {\n if (!e) e = window.event;\n if (!fun(e)) {\n e.cancelBubble = true;\n e.preventDefault && e.preventDefault();\n e.stopPropagation && e.stopPropagation();\n }\n };\n\n if ( el.addEventListener ) el.addEventListener( etype, rapfun, false );\n else if ( el.attachEvent ) el.attachEvent( 'on' + etype, rapfun );\n else el[ 'on' + etype ] = rapfun;\n } );\n}\n\n/**\n * UNBIND\n * ======\n * unbind( 'keydown', search('a')[0] );\n */\nfunction unbind( type, el, fun ) {\n if ( el.removeEventListener ) el.removeEventListener( type, false );\n else if ( el.detachEvent ) el.detachEvent( 'on' + type, false );\n else el[ 'on' + type ] = null;\n}\n\n/**\n * HEAD\n * ====\n * head().appendChild(elm);\n */\nfunction head() { return search('head')[0] }\n\n/**\n * ATTR\n * ====\n * var attribute = attr( node, 'attribute' );\n */\nfunction attr( node, attribute, value ) {\n if (value) node.setAttribute( attribute, value );\n else return node && node.getAttribute && node.getAttribute(attribute);\n}\n\n/**\n * CSS\n * ===\n * var obj = create('div');\n */\nfunction css( element, styles ) {\n for (var style in styles) if (styles.hasOwnProperty(style))\n try {element.style[style] = styles[style] + (\n '|width|height|top|left|'.indexOf(style) > 0 &&\n typeof styles[style] == 'number'\n ? 'px' : ''\n )}catch(e){}\n}\n\n/**\n * CREATE\n * ======\n * var obj = create('div');\n */\nfunction create(element) { return document.createElement(element) }\n\n\n/**\n * jsonp_cb\n * ========\n * var callback = jsonp_cb();\n */\nfunction jsonp_cb() { return XORIGN || FDomainRequest() ? 0 : unique() }\n\n\n\n/**\n * EVENTS\n * ======\n * PUBNUB.events.bind( 'you-stepped-on-flower', function(message) {\n * // Do Stuff with message\n * } );\n *\n * PUBNUB.events.fire( 'you-stepped-on-flower', \"message-data\" );\n * PUBNUB.events.fire( 'you-stepped-on-flower', {message:\"data\"} );\n * PUBNUB.events.fire( 'you-stepped-on-flower', [1,2,3] );\n *\n */\nvar events = {\n 'list' : {},\n 'unbind' : function( name ) { events.list[name] = [] },\n 'bind' : function( name, fun ) {\n (events.list[name] = events.list[name] || []).push(fun);\n },\n 'fire' : function( name, data ) {\n each(\n events.list[name] || [],\n function(fun) { fun(data) }\n );\n }\n};\n\n/**\n * XDR Cross Domain Request\n * ========================\n * xdr({\n * url : ['http://www.blah.com/url'],\n * success : function(response) {},\n * fail : function() {}\n * });\n */\nfunction xdr( setup ) {\n if (XORIGN || FDomainRequest()) return ajax(setup);\n\n var script = create('script')\n , callback = setup.callback\n , id = unique()\n , finished = 0\n , xhrtme = setup.timeout || DEF_TIMEOUT\n , timer = timeout( function(){done(1, {\"message\" : \"timeout\"})}, xhrtme )\n , fail = setup.fail || function(){}\n , data = setup.data || {}\n , success = setup.success || function(){}\n , append = function() { head().appendChild(script) }\n , done = function( failed, response ) {\n if (finished) return;\n finished = 1;\n\n script.onerror = null;\n clearTimeout(timer);\n\n (failed || !response) || success(response);\n\n timeout( function() {\n failed && fail();\n var s = $(id)\n , p = s && s.parentNode;\n p && p.removeChild(s);\n }, SECOND );\n };\n\n window[callback] = function(response) {\n done( 0, response );\n };\n\n if (!setup.blocking) script[ASYNC] = ASYNC;\n\n script.onerror = function() { done(1) };\n script.src = build_url( setup.url, data );\n\n attr( script, 'id', id );\n\n append();\n return done;\n}\n\n/**\n * CORS XHR Request\n * ================\n * xdr({\n * url : ['http://www.blah.com/url'],\n * success : function(response) {},\n * fail : function() {}\n * });\n */\nfunction ajax( setup ) {\n var xhr, response\n , finished = function() {\n if (loaded) return;\n loaded = 1;\n\n clearTimeout(timer);\n\n try { response = JSON['parse'](xhr.responseText); }\n catch (r) { return done(1); }\n\n complete = 1;\n success(response);\n }\n , complete = 0\n , loaded = 0\n , xhrtme = setup.timeout || DEF_TIMEOUT\n , timer = timeout( function(){done(1, {\"message\" : \"timeout\"})}, xhrtme )\n , fail = setup.fail || function(){}\n , data = setup.data || {}\n , success = setup.success || function(){}\n , async = !(setup.blocking)\n , done = function(failed,response) {\n if (complete) return;\n complete = 1;\n\n clearTimeout(timer);\n\n if (xhr) {\n xhr.onerror = xhr.onload = null;\n xhr.abort && xhr.abort();\n xhr = null;\n }\n\n failed && fail(response);\n };\n\n // Send\n try {\n xhr = FDomainRequest() ||\n window.XDomainRequest &&\n new XDomainRequest() ||\n new XMLHttpRequest();\n\n xhr.onerror = xhr.onabort = function(e){ done(\n 1, e || (xhr && xhr.responseText) || { \"error\" : \"Network Connection Error\"}\n ) };\n xhr.onload = xhr.onloadend = finished;\n xhr.onreadystatechange = function() {\n if (xhr && xhr.readyState == 4) {\n switch(xhr.status) {\n case 200:\n break;\n default:\n try {\n response = JSON['parse'](xhr.responseText);\n done(1,response);\n }\n catch (r) { return done(1, {status : xhr.status, payload : null, message : xhr.responseText}); }\n return;\n }\n }\n }\n\n var url = build_url(setup.url,data);\n\n xhr.open( 'GET', url, async );\n if (async) xhr.timeout = xhrtme;\n xhr.send();\n }\n catch(eee) {\n done(0);\n XORIGN = 0;\n return xdr(setup);\n }\n\n // Return 'done'\n return done;\n}\n\n// Test Connection State\nfunction _is_online() {\n if (!('onLine' in navigator)) return 1;\n try { return navigator['onLine'] }\n catch (e) { return true }\n}\n\n\nfunction sendBeacon(url) {\n if (!('sendBeacon' in navigator)) return false;\n\n return navigator['sendBeacon'](url);\n}\n\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n/* =-========================= PUBNUB ===========================-= */\n/* =-====================================================================-= */\n/* =-====================================================================-= */\n\nvar PDIV = $('pubnub') || 0\n, CREATE_PUBNUB = function(setup) {\n\n // Force JSONP if requested from user.\n if (setup['jsonp']) XORIGN = 0;\n else XORIGN = UA.indexOf('MSIE 6') == -1;\n\n var SUBSCRIBE_KEY = setup['subscribe_key'] || ''\n , KEEPALIVE = (+setup['keepalive'] || DEF_KEEPALIVE) * SECOND\n , UUID = setup['uuid'] || db['get'](SUBSCRIBE_KEY+'uuid')||'';\n\n var leave_on_unload = setup['leave_on_unload'] || 0;\n\n setup['xdr'] = xdr;\n setup['db'] = db;\n setup['error'] = setup['error'] || error;\n setup['_is_online'] = _is_online;\n setup['jsonp_cb'] = jsonp_cb;\n setup['hmac_SHA256']= get_hmac_SHA256;\n setup['crypto_obj'] = crypto_obj();\n setup['sendBeacon'] = sendBeacon;\n setup['params'] = { 'pnsdk' : PNSDK }\n\n var SELF = function(setup) {\n return CREATE_PUBNUB(setup);\n };\n\n var PN = PN_API(setup);\n\n for (var prop in PN) {\n if (PN.hasOwnProperty(prop)) {\n SELF[prop] = PN[prop];\n }\n }\n SELF['css'] = css;\n SELF['$'] = $;\n SELF['create'] = create;\n SELF['bind'] = bind;\n SELF['head'] = head;\n SELF['search'] = search;\n SELF['attr'] = attr;\n SELF['events'] = events;\n SELF['init'] = SELF;\n SELF['secure'] = SELF;\n SELF['crypto_obj'] = crypto_obj(); // export to instance\n\n\n // Add Leave Functions\n bind( 'beforeunload', window, function() {\n if (leave_on_unload) SELF['each-channel'](function(ch){ SELF['LEAVE']( ch.name, 0 ) });\n return true;\n } );\n\n // Return without Testing\n if (setup['notest']) return SELF;\n\n bind( 'offline', window, SELF['offline'] );\n bind( 'offline', document, SELF['offline'] );\n\n // Return PUBNUB Socket Object\n return SELF;\n};\nCREATE_PUBNUB['init'] = CREATE_PUBNUB;\nCREATE_PUBNUB['secure'] = CREATE_PUBNUB;\nCREATE_PUBNUB['crypto_obj'] = crypto_obj(); // export to constructor\n\n// Bind for PUBNUB Readiness to Subscribe\nif (document.readyState === 'complete') {\n timeout( ready, 0 );\n}\nelse {\n bind( 'load', window, function(){ timeout( ready, 0 ) } );\n}\n\nvar pdiv = PDIV || {};\n\n// CREATE A PUBNUB GLOBAL OBJECT\nPUBNUB = CREATE_PUBNUB({\n 'notest' : 1,\n 'publish_key' : attr( pdiv, 'pub-key' ),\n 'subscribe_key' : attr( pdiv, 'sub-key' ),\n 'ssl' : !document.location.href.indexOf('https') ||\n attr( pdiv, 'ssl' ) == 'on',\n 'origin' : attr( pdiv, 'origin' ),\n 'uuid' : attr( pdiv, 'uuid' )\n});\n\n// jQuery Interface\nwindow['jQuery'] && (window['jQuery']['PUBNUB'] = CREATE_PUBNUB);\n\n// For Modern JS + Testling.js - http://testling.com/\ntypeof(module) !== 'undefined' && (module['exports'] = PUBNUB) && ready();\n\nvar pubnubs = $('pubnubs') || 0;\n\n// LEAVE NOW IF NO PDIV.\nif (!PDIV) return;\n\n// PUBNUB Flash Socket\ncss( PDIV, { 'position' : 'absolute', 'top' : -SECOND } );\n\nif ('opera' in window || attr( PDIV, 'flash' )) PDIV['innerHTML'] =\n '';\n\n// Create Interface for Opera Flash\nPUBNUB['rdx'] = function( id, data ) {\n if (!data) return FDomainRequest[id]['onerror']();\n FDomainRequest[id]['responseText'] = unescape(data);\n FDomainRequest[id]['onload']();\n};\n\nfunction FDomainRequest() {\n if (!pubnubs || !pubnubs['get']) return 0;\n\n var fdomainrequest = {\n 'id' : FDomainRequest['id']++,\n 'send' : function() {},\n 'abort' : function() { fdomainrequest['id'] = {} },\n 'open' : function( method, url ) {\n FDomainRequest[fdomainrequest['id']] = fdomainrequest;\n pubnubs['get']( fdomainrequest['id'], url );\n }\n };\n\n return fdomainrequest;\n}\nFDomainRequest['id'] = SECOND;\n\n})();\n(function(){\n\n// ---------------------------------------------------------------------------\n// WEBSOCKET INTERFACE\n// ---------------------------------------------------------------------------\nvar WS = PUBNUB['ws'] = function( url, protocols ) {\n if (!(this instanceof WS)) return new WS( url, protocols );\n\n var self = this\n , url = self.url = url || ''\n , protocol = self.protocol = protocols || 'Sec-WebSocket-Protocol'\n , bits = url.split('/')\n , setup = {\n 'ssl' : bits[0] === 'wss:'\n ,'origin' : bits[2]\n ,'publish_key' : bits[3]\n ,'subscribe_key' : bits[4]\n ,'channel' : bits[5]\n };\n\n // READY STATES\n self['CONNECTING'] = 0; // The connection is not yet open.\n self['OPEN'] = 1; // The connection is open and ready to communicate.\n self['CLOSING'] = 2; // The connection is in the process of closing.\n self['CLOSED'] = 3; // The connection is closed or couldn't be opened.\n\n // CLOSE STATES\n self['CLOSE_NORMAL'] = 1000; // Normal Intended Close; completed.\n self['CLOSE_GOING_AWAY'] = 1001; // Closed Unexpecttedly.\n self['CLOSE_PROTOCOL_ERROR'] = 1002; // Server: Not Supported.\n self['CLOSE_UNSUPPORTED'] = 1003; // Server: Unsupported Protocol.\n self['CLOSE_TOO_LARGE'] = 1004; // Server: Too Much Data.\n self['CLOSE_NO_STATUS'] = 1005; // Server: No reason.\n self['CLOSE_ABNORMAL'] = 1006; // Abnormal Disconnect.\n\n // Events Default\n self['onclose'] = self['onerror'] =\n self['onmessage'] = self['onopen'] =\n self['onsend'] = function(){};\n\n // Attributes\n self['binaryType'] = '';\n self['extensions'] = '';\n self['bufferedAmount'] = 0;\n self['trasnmitting'] = false;\n self['buffer'] = [];\n self['readyState'] = self['CONNECTING'];\n\n // Close if no setup.\n if (!url) {\n self['readyState'] = self['CLOSED'];\n self['onclose']({\n 'code' : self['CLOSE_ABNORMAL'],\n 'reason' : 'Missing URL',\n 'wasClean' : true\n });\n return self;\n }\n\n // PubNub WebSocket Emulation\n self.pubnub = PUBNUB['init'](setup);\n self.pubnub.setup = setup;\n self.setup = setup;\n\n self.pubnub['subscribe']({\n 'restore' : false,\n 'channel' : setup['channel'],\n 'disconnect' : self['onerror'],\n 'reconnect' : self['onopen'],\n 'error' : function() {\n self['onclose']({\n 'code' : self['CLOSE_ABNORMAL'],\n 'reason' : 'Missing URL',\n 'wasClean' : false\n });\n },\n 'callback' : function(message) {\n self['onmessage']({ 'data' : message });\n },\n 'connect' : function() {\n self['readyState'] = self['OPEN'];\n self['onopen']();\n }\n });\n};\n\n// ---------------------------------------------------------------------------\n// WEBSOCKET SEND\n// ---------------------------------------------------------------------------\nWS.prototype.send = function(data) {\n var self = this;\n self.pubnub['publish']({\n 'channel' : self.pubnub.setup['channel'],\n 'message' : data,\n 'callback' : function(response) {\n self['onsend']({ 'data' : response });\n }\n });\n};\n\n// ---------------------------------------------------------------------------\n// WEBSOCKET CLOSE\n// ---------------------------------------------------------------------------\nWS.prototype.close = function() {\n var self = this;\n self.pubnub['unsubscribe']({ 'channel' : self.pubnub.setup['channel'] });\n self['readyState'] = self['CLOSED'];\n self['onclose']({});\n};\n\n})();\n/*\nCryptoJS v3.1.2\ncode.google.com/p/crypto-js\n(c) 2009-2013 by Jeff Mott. All rights reserved.\ncode.google.com/p/crypto-js/wiki/License\n*/\nvar CryptoJS=CryptoJS||function(h,s){var f={},g=f.lib={},q=function(){},m=g.Base={extend:function(a){q.prototype=this;var c=new q;a&&c.mixIn(a);c.hasOwnProperty(\"init\")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty(\"toString\")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},\nr=g.WordArray=m.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=s?c:4*a.length},toString:function(a){return(a||k).stringify(this)},concat:function(a){var c=this.words,d=a.words,b=this.sigBytes;a=a.sigBytes;this.clamp();if(b%4)for(var e=0;e>>2]|=(d[e>>>2]>>>24-8*(e%4)&255)<<24-8*((b+e)%4);else if(65535>>2]=d[e>>>2];else c.push.apply(c,d);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<\n32-8*(c%4);a.length=h.ceil(c/4)},clone:function(){var a=m.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],d=0;d>>2]>>>24-8*(b%4)&255;d.push((e>>>4).toString(16));d.push((e&15).toString(16))}return d.join(\"\")},parse:function(a){for(var c=a.length,d=[],b=0;b>>3]|=parseInt(a.substr(b,\n2),16)<<24-4*(b%8);return new r.init(d,c/2)}},n=l.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var d=[],b=0;b>>2]>>>24-8*(b%4)&255));return d.join(\"\")},parse:function(a){for(var c=a.length,d=[],b=0;b>>2]|=(a.charCodeAt(b)&255)<<24-8*(b%4);return new r.init(d,c)}},j=l.Utf8={stringify:function(a){try{return decodeURIComponent(escape(n.stringify(a)))}catch(c){throw Error(\"Malformed UTF-8 data\");}},parse:function(a){return n.parse(unescape(encodeURIComponent(a)))}},\nu=g.BufferedBlockAlgorithm=m.extend({reset:function(){this._data=new r.init;this._nDataBytes=0},_append:function(a){\"string\"==typeof a&&(a=j.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,d=c.words,b=c.sigBytes,e=this.blockSize,f=b/(4*e),f=a?h.ceil(f):h.max((f|0)-this._minBufferSize,0);a=f*e;b=h.min(4*a,b);if(a){for(var g=0;gn;){var j;a:{j=k;for(var u=h.sqrt(j),t=2;t<=u;t++)if(!(j%t)){j=!1;break a}j=!0}j&&(8>n&&(m[n]=l(h.pow(k,0.5))),r[n]=l(h.pow(k,1/3)),n++);k++}var a=[],f=f.SHA256=q.extend({_doReset:function(){this._hash=new g.init(m.slice(0))},_doProcessBlock:function(c,d){for(var b=this._hash.words,e=b[0],f=b[1],g=b[2],j=b[3],h=b[4],m=b[5],n=b[6],q=b[7],p=0;64>p;p++){if(16>p)a[p]=\nc[d+p]|0;else{var k=a[p-15],l=a[p-2];a[p]=((k<<25|k>>>7)^(k<<14|k>>>18)^k>>>3)+a[p-7]+((l<<15|l>>>17)^(l<<13|l>>>19)^l>>>10)+a[p-16]}k=q+((h<<26|h>>>6)^(h<<21|h>>>11)^(h<<7|h>>>25))+(h&m^~h&n)+r[p]+a[p];l=((e<<30|e>>>2)^(e<<19|e>>>13)^(e<<10|e>>>22))+(e&f^e&g^f&g);q=n;n=m;m=h;h=j+k|0;j=g;g=f;f=e;e=k+l|0}b[0]=b[0]+e|0;b[1]=b[1]+f|0;b[2]=b[2]+g|0;b[3]=b[3]+j|0;b[4]=b[4]+h|0;b[5]=b[5]+m|0;b[6]=b[6]+n|0;b[7]=b[7]+q|0},_doFinalize:function(){var a=this._data,d=a.words,b=8*this._nDataBytes,e=8*a.sigBytes;\nd[e>>>5]|=128<<24-e%32;d[(e+64>>>9<<4)+14]=h.floor(b/4294967296);d[(e+64>>>9<<4)+15]=b;a.sigBytes=4*d.length;this._process();return this._hash},clone:function(){var a=q.clone.call(this);a._hash=this._hash.clone();return a}});s.SHA256=q._createHelper(f);s.HmacSHA256=q._createHmacHelper(f)})(Math);\n\n// HMAC SHA256\n(function(){var h=CryptoJS,s=h.enc.Utf8;h.algo.HMAC=h.lib.Base.extend({init:function(f,g){f=this._hasher=new f.init;\"string\"==typeof g&&(g=s.parse(g));var h=f.blockSize,m=4*h;g.sigBytes>m&&(g=f.finalize(g));g.clamp();for(var r=this._oKey=g.clone(),l=this._iKey=g.clone(),k=r.words,n=l.words,j=0;j>>2]>>>24-8*(r%4)&255)<<16|(l[r+1>>>2]>>>24-8*((r+1)%4)&255)<<8|l[r+2>>>2]>>>24-8*((r+2)%4)&255,v=0;4>v&&r+0.75*v>>6*(3-v)&63));if(l=t.charAt(64))for(;d.length%4;)d.push(l);return d.join(\"\")},parse:function(d){var l=d.length,s=this._map,t=s.charAt(64);t&&(t=d.indexOf(t),-1!=t&&(l=t));for(var t=[],r=0,w=0;w<\nl;w++)if(w%4){var v=s.indexOf(d.charAt(w-1))<<2*(w%4),b=s.indexOf(d.charAt(w))>>>6-2*(w%4);t[r>>>2]|=(v|b)<<24-8*(r%4);r++}return p.create(t,r)},_map:\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\"}})();\n\n// BlockCipher\n(function(u){function p(b,n,a,c,e,j,k){b=b+(n&a|~n&c)+e+k;return(b<>>32-j)+n}function d(b,n,a,c,e,j,k){b=b+(n&c|a&~c)+e+k;return(b<>>32-j)+n}function l(b,n,a,c,e,j,k){b=b+(n^a^c)+e+k;return(b<>>32-j)+n}function s(b,n,a,c,e,j,k){b=b+(a^(n|~c))+e+k;return(b<>>32-j)+n}for(var t=CryptoJS,r=t.lib,w=r.WordArray,v=r.Hasher,r=t.algo,b=[],x=0;64>x;x++)b[x]=4294967296*u.abs(u.sin(x+1))|0;r=r.MD5=v.extend({_doReset:function(){this._hash=new w.init([1732584193,4023233417,2562383102,271733878])},\n_doProcessBlock:function(q,n){for(var a=0;16>a;a++){var c=n+a,e=q[c];q[c]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360}var a=this._hash.words,c=q[n+0],e=q[n+1],j=q[n+2],k=q[n+3],z=q[n+4],r=q[n+5],t=q[n+6],w=q[n+7],v=q[n+8],A=q[n+9],B=q[n+10],C=q[n+11],u=q[n+12],D=q[n+13],E=q[n+14],x=q[n+15],f=a[0],m=a[1],g=a[2],h=a[3],f=p(f,m,g,h,c,7,b[0]),h=p(h,f,m,g,e,12,b[1]),g=p(g,h,f,m,j,17,b[2]),m=p(m,g,h,f,k,22,b[3]),f=p(f,m,g,h,z,7,b[4]),h=p(h,f,m,g,r,12,b[5]),g=p(g,h,f,m,t,17,b[6]),m=p(m,g,h,f,w,22,b[7]),\nf=p(f,m,g,h,v,7,b[8]),h=p(h,f,m,g,A,12,b[9]),g=p(g,h,f,m,B,17,b[10]),m=p(m,g,h,f,C,22,b[11]),f=p(f,m,g,h,u,7,b[12]),h=p(h,f,m,g,D,12,b[13]),g=p(g,h,f,m,E,17,b[14]),m=p(m,g,h,f,x,22,b[15]),f=d(f,m,g,h,e,5,b[16]),h=d(h,f,m,g,t,9,b[17]),g=d(g,h,f,m,C,14,b[18]),m=d(m,g,h,f,c,20,b[19]),f=d(f,m,g,h,r,5,b[20]),h=d(h,f,m,g,B,9,b[21]),g=d(g,h,f,m,x,14,b[22]),m=d(m,g,h,f,z,20,b[23]),f=d(f,m,g,h,A,5,b[24]),h=d(h,f,m,g,E,9,b[25]),g=d(g,h,f,m,k,14,b[26]),m=d(m,g,h,f,v,20,b[27]),f=d(f,m,g,h,D,5,b[28]),h=d(h,f,\nm,g,j,9,b[29]),g=d(g,h,f,m,w,14,b[30]),m=d(m,g,h,f,u,20,b[31]),f=l(f,m,g,h,r,4,b[32]),h=l(h,f,m,g,v,11,b[33]),g=l(g,h,f,m,C,16,b[34]),m=l(m,g,h,f,E,23,b[35]),f=l(f,m,g,h,e,4,b[36]),h=l(h,f,m,g,z,11,b[37]),g=l(g,h,f,m,w,16,b[38]),m=l(m,g,h,f,B,23,b[39]),f=l(f,m,g,h,D,4,b[40]),h=l(h,f,m,g,c,11,b[41]),g=l(g,h,f,m,k,16,b[42]),m=l(m,g,h,f,t,23,b[43]),f=l(f,m,g,h,A,4,b[44]),h=l(h,f,m,g,u,11,b[45]),g=l(g,h,f,m,x,16,b[46]),m=l(m,g,h,f,j,23,b[47]),f=s(f,m,g,h,c,6,b[48]),h=s(h,f,m,g,w,10,b[49]),g=s(g,h,f,m,\nE,15,b[50]),m=s(m,g,h,f,r,21,b[51]),f=s(f,m,g,h,u,6,b[52]),h=s(h,f,m,g,k,10,b[53]),g=s(g,h,f,m,B,15,b[54]),m=s(m,g,h,f,e,21,b[55]),f=s(f,m,g,h,v,6,b[56]),h=s(h,f,m,g,x,10,b[57]),g=s(g,h,f,m,t,15,b[58]),m=s(m,g,h,f,D,21,b[59]),f=s(f,m,g,h,z,6,b[60]),h=s(h,f,m,g,C,10,b[61]),g=s(g,h,f,m,j,15,b[62]),m=s(m,g,h,f,A,21,b[63]);a[0]=a[0]+f|0;a[1]=a[1]+m|0;a[2]=a[2]+g|0;a[3]=a[3]+h|0},_doFinalize:function(){var b=this._data,n=b.words,a=8*this._nDataBytes,c=8*b.sigBytes;n[c>>>5]|=128<<24-c%32;var e=u.floor(a/\n4294967296);n[(c+64>>>9<<4)+15]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360;n[(c+64>>>9<<4)+14]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;b.sigBytes=4*(n.length+1);this._process();b=this._hash;n=b.words;for(a=0;4>a;a++)c=n[a],n[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return b},clone:function(){var b=v.clone.call(this);b._hash=this._hash.clone();return b}});t.MD5=v._createHelper(r);t.HmacMD5=v._createHmacHelper(r)})(Math);\n(function(){var u=CryptoJS,p=u.lib,d=p.Base,l=p.WordArray,p=u.algo,s=p.EvpKDF=d.extend({cfg:d.extend({keySize:4,hasher:p.MD5,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(d,r){for(var p=this.cfg,s=p.hasher.create(),b=l.create(),u=b.words,q=p.keySize,p=p.iterations;u.length>>2]&255}};d.BlockCipher=v.extend({cfg:v.cfg.extend({mode:b,padding:q}),reset:function(){v.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;this._mode=c.call(a,\nthis,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var n=d.CipherParams=l.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),b=(p.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;return(a?s.create([1398893684,\n1701076831]).concat(a).concat(b):b).toString(r)},parse:function(a){a=r.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=s.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return n.create({ciphertext:a,salt:c})}},a=d.SerializableCipher=l.extend({cfg:l.extend({format:b}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var l=a.createEncryptor(c,d);b=l.finalize(b);l=l.cfg;return n.create({ciphertext:b,key:c,iv:l.iv,algorithm:a,mode:l.mode,padding:l.padding,blockSize:a.blockSize,formatter:d.format})},\ndecrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return\"string\"==typeof a?b.parse(a,this):a}}),p=(p.kdf={}).OpenSSL={execute:function(a,b,c,d){d||(d=s.random(8));a=w.create({keySize:b+c}).compute(a,d);c=s.create(a.words.slice(b),4*c);a.sigBytes=4*b;return n.create({key:a,iv:c,salt:d})}},c=d.PasswordBasedCipher=a.extend({cfg:a.cfg.extend({kdf:p}),encrypt:function(b,c,d,l){l=this.cfg.extend(l);d=l.kdf.execute(d,\nb.keySize,b.ivSize);l.iv=d.iv;b=a.encrypt.call(this,b,c,d.key,l);b.mixIn(d);return b},decrypt:function(b,c,d,l){l=this.cfg.extend(l);c=this._parse(c,l.format);d=l.kdf.execute(d,b.keySize,b.ivSize,c.salt);l.iv=d.iv;return a.decrypt.call(this,b,c,d.key,l)}})}();\n\n// AES\n(function(){for(var u=CryptoJS,p=u.lib.BlockCipher,d=u.algo,l=[],s=[],t=[],r=[],w=[],v=[],b=[],x=[],q=[],n=[],a=[],c=0;256>c;c++)a[c]=128>c?c<<1:c<<1^283;for(var e=0,j=0,c=0;256>c;c++){var k=j^j<<1^j<<2^j<<3^j<<4,k=k>>>8^k&255^99;l[e]=k;s[k]=e;var z=a[e],F=a[z],G=a[F],y=257*a[k]^16843008*k;t[e]=y<<24|y>>>8;r[e]=y<<16|y>>>16;w[e]=y<<8|y>>>24;v[e]=y;y=16843009*G^65537*F^257*z^16843008*e;b[k]=y<<24|y>>>8;x[k]=y<<16|y>>>16;q[k]=y<<8|y>>>24;n[k]=y;e?(e=z^a[a[a[G^z]]],j^=a[a[j]]):e=j=1}var H=[0,1,2,4,8,\n16,32,64,128,27,54],d=d.AES=p.extend({_doReset:function(){for(var a=this._key,c=a.words,d=a.sigBytes/4,a=4*((this._nRounds=d+6)+1),e=this._keySchedule=[],j=0;j>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255]):(k=k<<8|k>>>24,k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255],k^=H[j/d|0]<<24);e[j]=e[j-d]^k}c=this._invKeySchedule=[];for(d=0;dd||4>=j?k:b[l[k>>>24]]^x[l[k>>>16&255]]^q[l[k>>>\n8&255]]^n[l[k&255]]},encryptBlock:function(a,b){this._doCryptBlock(a,b,this._keySchedule,t,r,w,v,l)},decryptBlock:function(a,c){var d=a[c+1];a[c+1]=a[c+3];a[c+3]=d;this._doCryptBlock(a,c,this._invKeySchedule,b,x,q,n,s);d=a[c+1];a[c+1]=a[c+3];a[c+3]=d},_doCryptBlock:function(a,b,c,d,e,j,l,f){for(var m=this._nRounds,g=a[b]^c[0],h=a[b+1]^c[1],k=a[b+2]^c[2],n=a[b+3]^c[3],p=4,r=1;r>>24]^e[h>>>16&255]^j[k>>>8&255]^l[n&255]^c[p++],s=d[h>>>24]^e[k>>>16&255]^j[n>>>8&255]^l[g&255]^c[p++],t=\nd[k>>>24]^e[n>>>16&255]^j[g>>>8&255]^l[h&255]^c[p++],n=d[n>>>24]^e[g>>>16&255]^j[h>>>8&255]^l[k&255]^c[p++],g=q,h=s,k=t;q=(f[g>>>24]<<24|f[h>>>16&255]<<16|f[k>>>8&255]<<8|f[n&255])^c[p++];s=(f[h>>>24]<<24|f[k>>>16&255]<<16|f[n>>>8&255]<<8|f[g&255])^c[p++];t=(f[k>>>24]<<24|f[n>>>16&255]<<16|f[g>>>8&255]<<8|f[h&255])^c[p++];n=(f[n>>>24]<<24|f[g>>>16&255]<<16|f[h>>>8&255]<<8|f[k&255])^c[p++];a[b]=q;a[b+1]=s;a[b+2]=t;a[b+3]=n},keySize:8});u.AES=p._createHelper(d)})();\n\n// Mode ECB\nCryptoJS.mode.ECB = (function () {\n var ECB = CryptoJS.lib.BlockCipherMode.extend();\n\n ECB.Encryptor = ECB.extend({\n processBlock: function (words, offset) {\n this._cipher.encryptBlock(words, offset);\n }\n });\n\n ECB.Decryptor = ECB.extend({\n processBlock: function (words, offset) {\n this._cipher.decryptBlock(words, offset);\n }\n });\n\n return ECB;\n}());// Moved to hmac-sha-256.js\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./bower_components/pubnub/web/pubnub.js\n ** module id = 10\n ** module chunks = 0\n **/","export default class Cache {\n\n static defaultPrefix = 'rc-';\n\n constructor(storage, prefix) {\n this.setPrefix(prefix);\n this._storage = storage;\n }\n\n setPrefix(prefix) {\n this._prefix = prefix || Cache.defaultPrefix;\n return this;\n }\n\n setItem(key, data) {\n this._storage[this._prefixKey(key)] = JSON.stringify(data);\n return this;\n }\n\n removeItem(key) {\n delete this._storage[this._prefixKey(key)];\n return this;\n }\n\n getItem(key) {\n var item = this._storage[this._prefixKey(key)];\n if (!item) return null;\n return JSON.parse(item);\n }\n\n clean() {\n\n for (var key in this._storage) {\n\n if (!this._storage.hasOwnProperty(key)) continue;\n\n if (key.indexOf(this._prefix) === 0) {\n delete this._storage[key];\n }\n\n }\n\n return this;\n\n }\n\n _prefixKey(key) {\n return this._prefix + key;\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Cache.js\n **/","export default class Observable {\n\n constructor() {\n this.off();\n }\n\n hasListeners(event) {\n return (event in this._listeners);\n }\n\n on(events, callback) {\n\n if (typeof events == 'string') events = [events];\n if (!events) throw new Error('No events to subscribe to');\n if (typeof callback !== 'function') throw new Error('Callback must be a function');\n\n events.forEach((event) => {\n\n if (!this.hasListeners(event)) this._listeners[event] = [];\n\n this._listeners[event].push(callback);\n\n });\n\n return this;\n\n }\n\n emit(event, ...args) {\n\n var result = null;\n\n if (!this.hasListeners(event)) return null;\n\n this._listeners[event].some((callback) => {\n\n result = callback.apply(this, args);\n return (result === false);\n\n });\n\n return result;\n\n }\n\n off(event, callback) {\n\n if (!event) {\n\n this._listeners = {};\n\n } else {\n\n if (!callback) {\n\n delete this._listeners[event];\n\n } else {\n\n if (!this.hasListeners(event)) return this;\n\n this._listeners[event].forEach((cb, i) => {\n\n if (cb === callback) delete this._listeners[event][i];\n\n });\n\n }\n\n }\n\n return this;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Observable.js\n **/","import {Promise} from '../core/Externals';\nimport {poll, stopPolling} from './Utils';\n\nexport default class Queue {\n\n static _pollInterval = 250;\n static _releaseTimeout = 5000;\n\n constructor(cache, cacheId) {\n\n this._cache = cache;\n this._cacheId = cacheId;\n this._promise = null;\n\n }\n\n isPaused() {\n\n var time = this._cache.getItem(this._cacheId);\n\n return !!time && Date.now() - parseInt(time) < Queue._releaseTimeout;\n }\n\n pause() {\n this._cache.setItem(this._cacheId, Date.now());\n return this;\n }\n\n resume() {\n this._cache.removeItem(this._cacheId);\n return this;\n }\n\n poll() {\n\n if (this._promise) return this._promise;\n\n this._promise = new Promise((resolve, reject) => {\n\n poll((next) => {\n\n if (this.isPaused()) return next();\n\n this._promise = null;\n\n this.resume(); // this is actually not needed but why not\n\n resolve(null);\n\n }, Queue._pollInterval);\n\n });\n\n return this._promise;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Queue.js\n **/","import {fetch, Request, Response, Headers, Promise} from '../core/Externals';\nimport {queryStringify} from '../core/Utils';\nimport {findHeaderName} from './Utils';\nimport Observable from '../core/Observable';\nimport ApiResponse from './ApiResponse';\n\nexport default class Client extends Observable {\n\n static _allowedMethods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'];\n\n events = {\n beforeRequest: 'beforeRequest',\n requestSuccess: 'requestSuccess',\n requestError: 'requestError'\n };\n\n /**\n * @param {Request} request\n * @return {Promise}\n */\n async sendRequest(request) {\n\n var apiResponse = new ApiResponse(request);\n\n try {\n\n //TODO Stop request if listeners return false\n this.emit(this.events.beforeRequest, apiResponse);\n\n apiResponse._response = await this._loadResponse(request);\n\n if (apiResponse._isMultipart() || apiResponse._isJson()) {\n apiResponse._text = await apiResponse.response().text();\n }\n\n if (!apiResponse.ok()) throw new Error('Response has unsuccessful status');\n\n this.emit(this.events.requestSuccess, apiResponse);\n\n return apiResponse;\n\n } catch (e) {\n\n if (!e.apiResponse) e = this.makeError(e, apiResponse);\n\n this.emit(this.events.requestError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @param {Request} request\n * @return {Promise}\n * @private\n */\n async _loadResponse(request) {\n return await fetch.call(null, request);\n }\n\n /**\n * Wraps the JS Error object with transaction information\n * @param {Error|IApiError} e\n * @param {ApiResponse} apiResponse\n * @return {IApiError}\n */\n makeError(e, apiResponse) {\n\n // Wrap only if regular error\n if (!e.hasOwnProperty('apiResponse') && !e.hasOwnProperty('originalMessage')) {\n\n e.apiResponse = apiResponse;\n e.originalMessage = e.message;\n e.message = (apiResponse && apiResponse.error(true)) || e.originalMessage;\n\n }\n\n return e;\n\n }\n\n /**\n *\n * @param {object} init\n * @param {object} [init.url]\n * @param {object} [init.body]\n * @param {string} [init.method]\n * @param {object} [init.query]\n * @param {object} [init.headers]\n * @return {Request}\n */\n createRequest(init) {\n\n init = init || {};\n init.headers = init.headers || {};\n\n // Sanity checks\n if (!init.url) throw new Error('Url is not defined');\n if (!init.method) init.method = 'GET';\n if (init.method && Client._allowedMethods.indexOf(init.method) < 0) throw new Error('Method has wrong value: ' + init.method);\n\n // Defaults\n init.credentials = init.credentials || 'include';\n init.mode = init.mode || 'cors';\n\n // Append Query String\n if (init.query) {\n init.url = init.url + (init.url.indexOf('?') > -1 ? '&' : '?') + queryStringify(init.query);\n }\n\n if (!(findHeaderName('Accept', init.headers))) {\n init.headers['Accept'] = ApiResponse._jsonContentType;\n }\n\n // Serialize body\n //TODO Check that body is a plain object\n if (typeof init.body !== 'string' || !init.body) {\n\n var contentTypeHeaderName = findHeaderName(ApiResponse._contentType, init.headers);\n\n if (!contentTypeHeaderName) {\n contentTypeHeaderName = ApiResponse._contentType;\n init.headers[contentTypeHeaderName] = ApiResponse._jsonContentType;\n }\n\n var contentType = init.headers[contentTypeHeaderName];\n\n // Assign a new encoded body\n if (contentType.indexOf(ApiResponse._jsonContentType) > -1) {\n init.body = JSON.stringify(init.body);\n } else if (contentType.indexOf(ApiResponse._urlencodedContentType) > -1) {\n init.body = queryStringify(init.body);\n }\n\n }\n\n // Create a request with encoded body\n var req = new Request(init.url, init);\n\n // Keep the original body accessible directly (for mocks)\n req.originalBody = init.body;\n\n return req;\n\n }\n\n}\n\n/**\n * @name IApiError\n * @property {string} stack\n * @property {string} originalMessage\n * @property {ApiResponse} apiResponse\n */\n\n\n/** WEBPACK FOOTER **\n ** ./src/http/Client.js\n **/","import {fetch, Request, Response, Headers, Promise} from '../core/Externals';\nimport * as utils from '../core/Utils';\n\n/**\n * Creates a response\n * @param stringBody\n * @param init\n * @return {Response}\n */\nexport function createResponse(stringBody, init) {\n\n init = init || {};\n\n var response = new Response(stringBody, init);\n\n //TODO Wait for https://github.com/bitinn/node-fetch/issues/38\n if (utils.isNodeJS()) {\n\n response._text = stringBody;\n response._decode = function() {\n return this._text;\n };\n\n }\n\n return response;\n\n}\n\nexport function findHeaderName(name, headers) {\n name = name.toLowerCase();\n return Object.keys(headers).reduce(function(res, key) {\n if (res) return res;\n if (name == key.toLowerCase()) return key;\n return res;\n }, null);\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/http/Utils.js\n **/","import {fetch, Request, Response, Headers, Promise} from '../core/Externals';\nimport * as utils from './Utils';\n\nexport default class ApiResponse {\n\n static _contentType = 'Content-Type';\n static _jsonContentType = 'application/json';\n static _multipartContentType = 'multipart/mixed';\n static _urlencodedContentType = 'application/x-www-form-urlencoded';\n static _headerSeparator = ':';\n static _bodySeparator = '\\n\\n';\n static _boundarySeparator = '--';\n\n /**\n * @param {Request} request\n * @param {Response} response\n * @param {string} responseText\n */\n constructor(request, response, responseText) {\n\n /** @type {Request} */\n this._request = request;\n\n /** @type {Response} */\n this._response = response;\n\n this._text = responseText;\n this._json = null;\n this._multipart = [];\n\n }\n\n /**\n * @return {Response}\n */\n response() {\n return this._response;\n }\n\n /**\n * @return {Request}\n */\n request() {\n return this._request;\n }\n\n /**\n * @return {boolean}\n */\n ok() {\n return this._response && this._response.ok;\n }\n\n /**\n * @return {string}\n */\n text() {\n if (!this._isJson() && !this._isMultipart()) throw new Error('Response is not text');\n return this._text;\n }\n\n /**\n * @return {object}\n */\n json() {\n if (!this._isJson()) throw new Error('Response is not JSON');\n if (!this._json) {\n this._json = this._text ? JSON.parse(this._text) : null;\n }\n return this._json;\n }\n\n /**\n * @param [skipOKCheck]\n * @return {string}\n */\n error(skipOKCheck) {\n\n if (this.ok() && !skipOKCheck) return null;\n\n var message = (this._response && this._response.status ? this._response.status + ' ' : '') +\n (this._response && this._response.statusText ? this._response.statusText : '');\n\n try {\n\n if (this.json().message) message = this.json().message;\n if (this.json().error_description) message = this.json().error_description;\n if (this.json().description) message = this.json().description;\n\n } catch (e) {}\n\n return message;\n\n }\n\n /**\n * @return {ApiResponse[]}\n */\n multipart() {\n\n if (!this._isMultipart()) throw new Error('Response is not multipart');\n\n if (!this._multipart.length) {\n\n // Step 1. Split multipart response\n\n var text = this.text();\n\n if (!text) throw new Error('No response body');\n\n var boundary = this._getContentType().match(/boundary=([^;]+)/i)[1];\n\n if (!boundary) throw new Error('Cannot find boundary');\n\n var parts = text.toString().split(ApiResponse._boundarySeparator + boundary);\n\n if (parts[0].trim() === '') parts.shift();\n if (parts[parts.length - 1].trim() == ApiResponse._boundarySeparator) parts.pop();\n\n if (parts.length < 1) throw new Error('No parts in body');\n\n // Step 2. Parse status info\n\n var statusInfo = ApiResponse.create(parts.shift(), this._response.status, this._response.statusText).json();\n\n // Step 3. Parse all other parts\n\n this._multipart = parts.map((part:string, i) => {\n\n var status = statusInfo.response[i].status;\n\n return ApiResponse.create(part, status);\n\n });\n\n }\n\n return this._multipart;\n\n }\n\n _isContentType(contentType) {\n return this._getContentType().indexOf(contentType) > -1;\n }\n\n _getContentType() {\n return this._response.headers.get(ApiResponse._contentType) || '';\n }\n\n _isMultipart() {\n return this._isContentType(ApiResponse._multipartContentType);\n }\n\n _isUrlEncoded() {\n return this._isContentType(ApiResponse._urlencodedContentType);\n }\n\n _isJson() {\n return this._isContentType(ApiResponse._jsonContentType);\n }\n\n /**\n * Method is used to create ApiResponse object from string parts of multipart/mixed response\n * @param {string} [text]\n * @param {number} [status]\n * @param {string} [statusText]\n * @return {ApiResponse}\n */\n static create(text, status, statusText) {\n\n text = text || '';\n status = status || 200;\n statusText = statusText || 'OK';\n\n text = text.replace(/\\r/g, '');\n\n var headers = new Headers(),\n headersAndBody = text.split(ApiResponse._bodySeparator),\n headersText = (headersAndBody.length > 1) ? headersAndBody.shift() : '';\n\n text = headersAndBody.join(ApiResponse._bodySeparator);\n\n (headersText || '')\n .split('\\n')\n .forEach((header:string) => {\n\n var split = header.trim().split(ApiResponse._headerSeparator),\n key = split.shift().trim(),\n value = split.join(ApiResponse._headerSeparator).trim();\n\n if (key) headers.append(key, value);\n\n });\n\n return new ApiResponse(null, utils.createResponse(text, {\n headers: headers,\n status: status,\n statusText: statusText\n }), text);\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/http/ApiResponse.js\n **/","import Registry from './Registry';\nimport {default as HttpClient} from '../http/Client';\n\nexport default class Client extends HttpClient {\n\n constructor() {\n super();\n this._registry = new Registry();\n }\n\n registry() {\n return this._registry;\n }\n\n async _loadResponse(request) {\n\n var mock = this._registry.find(request);\n\n return await mock.getResponse(request);\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/mocks/ClientMock.js\n **/","import Mock from './Mock';\n\nexport default class Registry {\n\n constructor() {\n this._mocks = [];\n }\n\n add(mock) {\n this._mocks.push(mock);\n return this;\n }\n\n clear() {\n this._mocks = [];\n return this;\n }\n\n find(request) {\n\n //console.log('Registry is looking for', request);\n\n var mock = this._mocks.shift();\n\n if (!mock) throw new Error('No mock in registry for request ' + request.method + ' ' + request.url);\n\n if (!mock.test(request)) throw new Error('Wrong request ' + request.method + ' ' + request.url +\n ' for expected mock ' + mock.method() + ' ' + mock.path());\n\n return mock;\n\n }\n\n apiCall(method:string, path:string, response:any, status, statusText) {\n\n this.add(new Mock(method, path, response, status, statusText));\n\n return this;\n\n }\n\n authentication() {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'access_token': 'ACCESS_TOKEN',\n 'token_type': 'bearer',\n 'expires_in': 3600,\n 'refresh_token': 'REFRESH_TOKEN',\n 'refresh_token_expires_in': 60480,\n 'scope': 'SMS RCM Foo Boo',\n 'expireTime': new Date().getTime() + 3600000\n });\n\n return this;\n\n }\n\n logout() {\n\n this.apiCall('POST', '/restapi/oauth/revoke', {});\n\n return this;\n\n }\n\n presenceLoad(id) {\n\n this.apiCall('GET', '/restapi/v1.0/account/~/extension/' + id + '/presence', {\n \"uri\": \"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/\" + id + \"/presence\",\n \"extension\": {\n \"uri\": \"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/\" + id,\n \"id\": id,\n \"extensionNumber\": \"101\"\n },\n \"activeCalls\": [],\n \"presenceStatus\": \"Available\",\n \"telephonyStatus\": \"Ringing\",\n \"userStatus\": \"Available\",\n \"dndStatus\": \"TakeAllCalls\",\n \"extensionId\": id\n });\n\n return this;\n\n }\n\n subscribeGeneric(expiresIn) {\n\n expiresIn = expiresIn || 15 * 60 * 60;\n\n var date = new Date();\n\n this.apiCall('POST', '/restapi/v1.0/subscription', {\n 'eventFilters': [\n '/restapi/v1.0/account/~/extension/~/presence'\n ],\n 'expirationTime': new Date(date.getTime() + (expiresIn * 1000)).toISOString(),\n 'expiresIn': expiresIn,\n 'deliveryMode': {\n 'transportType': 'PubNub',\n 'encryption': false,\n 'address': '123_foo',\n 'subscriberKey': 'sub-c-foo',\n 'secretKey': 'sec-c-bar'\n },\n 'id': 'foo-bar-baz',\n 'creationTime': date.toISOString(),\n 'status': 'Active',\n 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz'\n });\n\n return this;\n\n }\n\n subscribeOnPresence(id, detailed) {\n\n id = id || '1';\n\n var date = new Date();\n\n this.apiCall('POST', '/restapi/v1.0/subscription', {\n 'eventFilters': ['/restapi/v1.0/account/~/extension/' + id + '/presence' + (detailed ? '?detailedTelephonyState=true' : '')],\n 'expirationTime': new Date(date.getTime() + (15 * 60 * 60 * 1000)).toISOString(),\n 'deliveryMode': {\n 'transportType': 'PubNub',\n 'encryption': true,\n 'address': '123_foo',\n 'subscriberKey': 'sub-c-foo',\n 'secretKey': 'sec-c-bar',\n 'encryptionAlgorithm': 'AES',\n 'encryptionKey': 'VQwb6EVNcQPBhE/JgFZ2zw=='\n },\n 'creationTime': date.toISOString(),\n 'id': 'foo-bar-baz',\n 'status': 'Active',\n 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz'\n });\n\n return this;\n\n }\n\n tokenRefresh(failure) {\n\n if (!failure) {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'access_token': 'ACCESS_TOKEN_FROM_REFRESH',\n 'token_type': 'bearer',\n 'expires_in': 3600,\n 'refresh_token': 'REFRESH_TOKEN_FROM_REFRESH',\n 'refresh_token_expires_in': 60480,\n 'scope': 'SMS RCM Foo Boo'\n });\n\n } else {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'message': 'Wrong token',\n 'error_description': 'Wrong token',\n 'description': 'Wrong token'\n }, 400);\n\n }\n\n return this;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/mocks/Registry.js\n **/","import ApiResponse from '../http/ApiResponse';\nimport {delay} from '../core/Utils';\nimport {createResponse} from '../http/Utils';\n\nexport default class Mock {\n\n constructor(method, path, json, status, statusText, delay) {\n this._method = method.toUpperCase();\n this._path = path;\n this._json = json || {};\n this._delay = delay || 10;\n this._status = status || 200;\n this._statusText = statusText || 'OK';\n }\n\n path() {\n return this._path;\n }\n\n method() {\n return this._method;\n }\n\n test(request:Request) {\n\n return request.url.indexOf(this._path) > -1 &&\n request.method.toUpperCase() == this._method;\n\n }\n\n async getResponse(request) {\n\n await delay(this._delay);\n\n return this.createResponse(this._json);\n\n }\n\n createResponse(json, init) {\n\n init = init || {};\n\n init.status = init.status || this._status;\n init.statusText = init.statusText || this._statusText;\n\n var str = JSON.stringify(json),\n res = createResponse(str, init);\n\n res.headers.set(ApiResponse._contentType, ApiResponse._jsonContentType);\n\n return res;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/mocks/Mock.js\n **/","import Observable from '../core/Observable';\nimport Queue from '../core/Queue';\nimport Auth from './Auth';\nimport {Promise} from '../core/Externals';\nimport {queryStringify, parseQueryString, delay} from '../core/Utils';\n\nexport default class Platform extends Observable {\n\n static _urlPrefix = '/restapi';\n static _apiVersion = 'v1.0';\n static _accessTokenTtl = null; // Platform server by default sets it to 60 * 60 = 1 hour\n static _refreshTokenTtl = 10 * 60 * 60; // 10 hours\n static _refreshTokenTtlRemember = 7 * 24 * 60 * 60; // 1 week\n static _tokenEndpoint = '/restapi/oauth/token';\n static _revokeEndpoint = '/restapi/oauth/revoke';\n static _authorizeEndpoint = '/restapi/oauth/authorize';\n static _refreshDelayMs = 100;\n static _cacheId = 'platform';\n static _clearCacheOnRefreshError = true;\n\n events = {\n beforeLogin: 'beforeLogin',\n loginSuccess: 'loginSuccess',\n loginError: 'loginError',\n beforeRefresh: 'beforeRefresh',\n refreshSuccess: 'refreshSuccess',\n refreshError: 'refreshError',\n beforeLogout: 'beforeLogout',\n logoutSuccess: 'logoutSuccess',\n logoutError: 'logoutError'\n };\n\n constructor(client, cache, server, appKey, appSecret) {\n\n super();\n\n this._server = server;\n this._appKey = appKey;\n this._appSecret = appSecret;\n\n /** @type {Cache} */\n this._cache = cache;\n\n /** @type {Client} */\n this._client = client;\n\n this._queue = new Queue(this._cache, Platform._cacheId + '-refresh');\n\n this._auth = new Auth(this._cache, Platform._cacheId);\n\n }\n\n /**\n * @return {Auth}\n */\n auth() {\n return this._auth;\n }\n\n /**\n * @return {Client}\n */\n client() {\n return this._client;\n }\n\n /**\n * @param {string} path\n * @param {object} [options]\n * @param {boolean} [options.addServer]\n * @param {string} [options.addMethod]\n * @param {boolean} [options.addToken]\n * @return {string}\n */\n createUrl(path, options) {\n\n path = path || '';\n options = options || {};\n\n var builtUrl = '',\n hasHttp = path.indexOf('http://') != -1 || path.indexOf('https://') != -1;\n\n if (options.addServer && !hasHttp) builtUrl += this._server;\n\n if (path.indexOf(Platform._urlPrefix) == -1 && !hasHttp) builtUrl += Platform._urlPrefix + '/' + Platform._apiVersion;\n\n builtUrl += path;\n\n if (options.addMethod || options.addToken) builtUrl += (path.indexOf('?') > -1 ? '&' : '?');\n\n if (options.addMethod) builtUrl += '_method=' + options.addMethod;\n if (options.addToken) builtUrl += (options.addMethod ? '&' : '') + 'access_token=' + this._auth.accessToken();\n\n return builtUrl;\n\n }\n\n /**\n * @param {string} options.redirectUri\n * @param {string} options.state\n * @param {string} options.brandId\n * @param {string} options.display\n * @param {string} options.prompt\n * @return {string}\n */\n authUrl(options) {\n\n options = options || {};\n\n return this.createUrl(Platform._authorizeEndpoint + '?' + queryStringify({\n 'response_type': 'code',\n 'redirect_uri': options.redirectUri || '',\n 'client_id': this._appKey,\n 'state': options.state || '',\n 'brand_id': options.brandId || '',\n 'display': options.display || '',\n 'prompt': options.prompt || ''\n }), {addServer: true})\n\n }\n\n /**\n * @param {string} url\n * @return {Object}\n */\n parseAuthRedirectUrl(url:string) {\n\n var qs = parseQueryString(url.split('?').reverse()[0]),\n error = qs.error_description || qs.error;\n\n if (error) {\n var e = new Error(error);\n e.error = qs.error;\n throw e;\n }\n\n return qs;\n\n }\n\n /**\n * @return {Promise}\n */\n async loggedIn() {\n\n try {\n await this._ensureAuthentication();\n return true;\n } catch (e) {\n return false;\n }\n\n }\n\n /**\n * @param {string} options.username\n * @param {string} options.password\n * @param {string} options.extension\n * @param {string} options.code\n * @param {string} options.redirectUri\n * @param {string} options.endpointId\n * @returns {Promise}\n */\n async login(options) {\n\n try {\n\n options = options || {};\n\n options.remember = options.remember || false;\n\n this.emit(this.events.beforeLogin);\n\n var body = {\n \"access_token_ttl\": Platform._accessTokenTtl,\n \"refresh_token_ttl\": options.remember ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl\n };\n\n if (!options.code) {\n\n body.grant_type = 'password';\n body.username = options.username;\n body.password = options.password;\n body.extension = options.extension || '';\n\n } else if (options.code) {\n\n body.grant_type = 'authorization_code';\n body.code = options.code;\n body.redirect_uri = options.redirectUri;\n //body.client_id = this.getCredentials().key; // not needed\n\n }\n\n if (options.endpointId) body.endpoint_id = options.endpointId;\n\n var apiResponse = await this._tokenRequest(Platform._tokenEndpoint, body),\n json = apiResponse.json();\n\n this._auth\n .setData(json)\n .setRemember(options.remember);\n\n this.emit(this.events.loginSuccess, apiResponse);\n\n return apiResponse;\n\n } catch (e) {\n\n this._cache.clean();\n\n this.emit(this.events.loginError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n async refresh() {\n\n try {\n\n this.emit(this.events.beforeRefresh);\n\n if (this._queue.isPaused()) {\n\n await this._queue.poll();\n\n if (!this._isAccessTokenValid()) {\n throw new Error('Automatic authentification timeout');\n }\n\n this.emit(this.events.refreshSuccess, null);\n\n return null;\n\n }\n\n this._queue.pause();\n\n // Make sure all existing AJAX calls had a chance to reach the server\n await delay(Platform._refreshDelayMs);\n\n // Perform sanity checks\n if (!this._auth.refreshToken()) throw new Error('Refresh token is missing');\n if (!this._auth.refreshTokenValid()) throw new Error('Refresh token has expired');\n if (!this._queue.isPaused()) throw new Error('Queue was resumed before refresh call');\n\n /** @type {ApiResponse} */\n var res = await this._tokenRequest(Platform._tokenEndpoint, {\n \"grant_type\": \"refresh_token\",\n \"refresh_token\": this._auth.refreshToken(),\n \"access_token_ttl\": Platform._accessTokenTtl,\n \"refresh_token_ttl\": this._auth.remember() ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl\n }),\n json = res.json();\n\n if (!json.access_token) {\n throw this._client.makeError(new Error('Malformed OAuth response'), res);\n }\n\n this._auth.setData(json);\n this._queue.resume();\n\n this.emit(this.events.refreshSuccess, res);\n\n return res;\n\n } catch (e) {\n\n e = this._client.makeError(e);\n\n if (Platform._clearCacheOnRefreshError) {\n this._cache.clean();\n }\n\n this.emit(this.events.refreshError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n async logout() {\n\n try {\n\n this.emit(this.events.beforeLogout);\n\n this._queue.pause();\n\n var res = await this._tokenRequest(Platform._revokeEndpoint, {\n token: this._auth.accessToken()\n });\n\n this._queue.resume();\n this._cache.clean();\n\n this.emit(this.events.logoutSuccess, res);\n\n return res;\n\n } catch (e) {\n\n this._queue.resume();\n\n this.emit(this.events.logoutError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @param {Request} request\n * @param {object} [options]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async inflateRequest(request, options) {\n\n options = options || {};\n\n if (options.skipAuthCheck) return request;\n\n await this._ensureAuthentication();\n\n request.headers.set('Authorization', this._authHeader());\n //request.url = this.createUrl(request.url, {addServer: true}); //FIXME Spec prevents this...\n\n //TODO Add User-Agent here\n\n return request;\n\n }\n\n /**\n * @param {Request} request\n * @param {object} [options]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async sendRequest(request, options) {\n\n try {\n\n request = await this.inflateRequest(request, options);\n\n return (await this._client.sendRequest(request));\n\n } catch (e) {\n\n // Guard is for errors that come from polling\n if (!e.apiResponse || !e.apiResponse.response() || (e.apiResponse.response().status != 401)) throw e;\n\n this._auth.cancelAccessToken();\n\n return (await this.sendRequest(request, options));\n\n }\n\n }\n\n /**\n * General purpose function to send anything to server\n * @param {string} options.url\n * @param {object} [options.body]\n * @param {string} [options.method]\n * @param {object} [options.query]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async send(options = {}) {\n\n //FIXME https://github.com/bitinn/node-fetch/issues/43\n options.url = this.createUrl(options.url, {addServer: true});\n\n return await this.sendRequest(this._client.createRequest(options), options);\n\n }\n\n /**\n * @param {string} url\n * @param {object} [query]\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async get(url, query, options) {\n options = options || {};\n options.method = 'GET';\n options.url = url;\n options.query = query;\n return await this.send(options);\n }\n\n /**\n * @param {string} url\n * @param {object} body\n * @param {object} [query]\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async post(url, body, query, options) {\n options = options || {};\n options.method = 'POST';\n options.url = url;\n options.query = query;\n options.body = body;\n return await this.send(options);\n }\n\n /**\n * @param {string} url\n * @param {object} [body]\n * @param {object} [query]\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async put(url, body, query, options) {\n options = options || {};\n options.method = 'PUT';\n options.url = url;\n options.query = query;\n options.body = body;\n return await this.send(options);\n }\n\n /**\n * @param {string} url\n * @param {string} [query]\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async 'delete'(url, query, options) {\n options = options || {};\n options.method = 'DELETE';\n options.url = url;\n options.query = query;\n return await this.send(options);\n }\n\n async _tokenRequest(path, body) {\n\n return await this.send({\n url: path,\n skipAuthCheck: true,\n body: body,\n method: 'POST',\n headers: {\n 'Authorization': 'Basic ' + this._apiKey(),\n 'Content-Type': 'application/x-www-form-urlencoded'\n }\n });\n\n }\n\n async _ensureAuthentication() {\n\n if (this._isAccessTokenValid()) return null;\n return await this.refresh();\n\n }\n\n _isAccessTokenValid() {\n\n return (this._auth.accessTokenValid() && !this._queue.isPaused());\n\n }\n\n _apiKey() {\n var apiKey = this._appKey + ':' + this._appSecret;\n return (typeof btoa == 'function') ? btoa(apiKey) : new Buffer(apiKey).toString('base64');\n }\n\n _authHeader() {\n var token = this._auth.accessToken();\n return this._auth.tokenType() + (token ? ' ' + token : '');\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/platform/Platform.js\n **/","export default class Auth {\n\n static refreshHandicapMs:number = 60 * 1000; // 1 minute\n static forcedTokenType = 'forced';\n\n constructor(cache, cacheId:string) {\n\n /** @type {Cache} */\n this._cache = cache;\n this._cacheId = cacheId;\n\n }\n\n accessToken() {\n return this.data().access_token;\n }\n\n refreshToken() {\n return this.data().refresh_token;\n }\n\n tokenType() {\n return this.data().token_type;\n }\n\n /**\n * @return {{token_type: string, access_token: string, expires_in: number, refresh_token: string, refresh_token_expires_in: number}}\n */\n data() {\n\n return this._cache.getItem(this._cacheId) || {\n token_type: '',\n access_token: '',\n expires_in: 0,\n refresh_token: '',\n refresh_token_expires_in: 0\n };\n\n }\n\n /**\n * @param {object} newData\n * @return {Auth}\n */\n setData(newData) {\n\n newData = newData || {};\n\n var data = this.data();\n\n Object.keys(newData).forEach((key) => {\n data[key] = newData[key];\n });\n\n data.expire_time = Date.now() + (data.expires_in * 1000);\n data.refresh_token_expire_time = Date.now() + (data.refresh_token_expires_in * 1000);\n\n this._cache.setItem(this._cacheId, data);\n\n return this;\n\n }\n\n /**\n * Check if there is a valid (not expired) access token\n * @return {boolean}\n */\n accessTokenValid() {\n\n var authData = this.data();\n return (authData.token_type === Auth.forcedTokenType || (authData.expire_time - Auth.refreshHandicapMs > Date.now()));\n\n }\n\n /**\n * Check if there is a valid (not expired) access token\n * @return {boolean}\n */\n refreshTokenValid() {\n\n return (this.data().refresh_token_expire_time > Date.now());\n\n }\n\n /**\n * @return {Auth}\n */\n cancelAccessToken() {\n\n return this.setData({\n access_token: '',\n expires_in: 0\n });\n\n }\n\n /**\n * This method sets a special authentication mode used in Service Web\n * @return {Auth}\n */\n forceAuthentication() {\n\n this.setData({\n token_type: Auth.forcedTokenType,\n access_token: '',\n expires_in: 0,\n refresh_token: '',\n refresh_token_expires_in: 0\n });\n\n return this;\n\n }\n\n /**\n * @param remember\n * @return {Auth}\n */\n setRemember(remember) {\n\n return this.setData({remember: remember});\n\n }\n\n /**\n * @return {boolean}\n */\n remember() {\n\n return !!this.data().remember;\n\n }\n\n}\n\n//export interface IAuthData {\n// remember?:boolean;\n// token_type?:string;\n// access_token?:string;\n// expires_in?:number; // actually it's string\n// expire_time?:number;\n// refresh_token?:string;\n// refresh_token_expires_in?:number; // actually it's string\n// refresh_token_expire_time?:number;\n// scope?:string;\n//}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/platform/Auth.js\n **/","import PubnubMock from './PubnubMock.js';\nimport {PUBNUB} from '../core/Externals';\n\nexport default class PubnubMockFactory {\n\n constructor() {\n this.crypto_obj = PUBNUB.crypto_obj;\n }\n\n init(options:PUBNUBInitOptions) {\n return new PubnubMock(options);\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/pubnub/PubnubFactory.js\n **/","import Observable from '../core/Observable';\nimport {PUBNUB} from '../core/Externals';\n\nexport default class PubnubMock extends Observable {\n\n constructor(options) {\n super();\n this.options = options;\n this.crypto_obj = PUBNUB.crypto_obj;\n }\n\n ready() {}\n\n subscribe(options:PUBNUBSubscribeOptions) {\n this.on('message-' + options.channel, options.message);\n }\n\n unsubscribe(options:PUBNUBUnsubscribeOptions) {\n this.off('message-' + options.channel);\n }\n\n receiveMessage(msg, channel) {\n this.emit('message-' + channel, msg, 'env', channel);\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/pubnub/PubnubMock.js\n **/","import Observable from '../core/Observable';\nimport Client from '../http/Client';\nimport {poll, stopPolling, delay} from '../core/Utils';\n\nexport default class Subscription extends Observable {\n\n static _renewHandicapMs = 2 * 60 * 1000;\n static _pollInterval = 10 * 1000;\n\n events = {\n notification: 'notification',\n removeSuccess: 'removeSuccess',\n removeError: 'removeError',\n renewSuccess: 'renewSuccess',\n renewError: 'renewError',\n subscribeSuccess: 'subscribeSuccess',\n subscribeError: 'subscribeError'\n };\n\n constructor(pubnubFactory, platform) {\n\n super();\n\n this._pubnubFactory = pubnubFactory;\n this._platform = platform;\n this._pubnub = null;\n this._timeout = null;\n this._subscription = {};\n\n }\n\n subscribed(){\n\n return !!(this._subscription.id &&\n this._subscription.deliveryMode &&\n this._subscription.deliveryMode.subscriberKey &&\n this._subscription.deliveryMode.address);\n\n }\n\n /**\n * @return {boolean}\n */\n alive() {\n\n return this.subscribed() && Date.now() < this.expirationTime();\n\n }\n\n expirationTime() {\n return new Date(this._subscription.expirationTime || 0).getTime() - Subscription._renewHandicapMs;\n }\n\n setSubscription(subscription) {\n\n subscription = subscription || {};\n\n this._clearTimeout();\n\n this._subscription = subscription;\n\n if (!this._pubnub) this._subscribeAtPubnub();\n\n this._setTimeout();\n\n return this;\n\n }\n\n subscription() {\n return this._subscription;\n }\n\n /**\n * Creates or updates subscription if there is an active one\n * @returns {Promise}\n */\n async register() {\n\n if (this.alive()) {\n return await this.renew();\n } else {\n return await this.subscribe();\n }\n\n }\n\n eventFilters() {\n return this._subscription.eventFilters || [];\n }\n\n /**\n * @param {string[]} events\n * @return {Subscription}\n */\n addEventFilters(events) {\n this.setEventFilters(this.eventFilters().concat(events));\n return this;\n }\n\n /**\n * @param {string[]} events\n * @return {Subscription}\n */\n setEventFilters(events) {\n this._subscription.eventFilters = events;\n return this;\n }\n\n /**\n * @returns {Promise}\n */\n async subscribe() {\n\n try {\n\n this._clearTimeout();\n\n if (!this.eventFilters().length) throw new Error('Events are undefined');\n\n var response = await this._platform.post('/restapi/v1.0/subscription', {\n eventFilters: this._getFullEventFilters(),\n deliveryMode: {\n transportType: 'PubNub'\n }\n }),\n json = response.json();\n\n this.setSubscription(json)\n .emit(this.events.subscribeSuccess, response);\n\n return response;\n\n\n } catch (e) {\n\n e = this._platform.client().makeError(e);\n\n this.reset()\n .emit(this.events.subscribeError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n async renew() {\n\n try {\n\n this._clearTimeout();\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n if (!this.eventFilters().length) throw new Error('Events are undefined');\n\n var response = await this._platform.put('/restapi/v1.0/subscription/' + this._subscription.id, {\n eventFilters: this._getFullEventFilters()\n });\n\n var json = response.json();\n\n this.setSubscription(json)\n .emit(this.events.renewSuccess, response);\n\n return response;\n\n } catch (e) {\n\n e = this._platform.client().makeError(e);\n\n this.reset()\n .emit(this.events.renewError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n async remove() {\n\n try {\n\n if (!this.subscribed()) throw new Error('No subscription');\n\n var response = await this._platform.delete('/restapi/v1.0/subscription/' + this._subscription.id);\n\n this.reset()\n .emit(this.events.removeSuccess, response);\n\n return response;\n\n } catch (e) {\n\n e = this._platform.client().makeError(e);\n\n this.emit(this.events.removeError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n resubscribe() {\n\n return this.reset().setEventFilters(this.eventFilters()).subscribe();\n\n }\n\n /**\n * Remove subscription and disconnect from PUBNUB\n * This method resets subscription at client side but backend is not notified\n */\n reset() {\n this._clearTimeout();\n if (this.subscribed() && this._pubnub) this._pubnub.unsubscribe({channel: this._subscription.deliveryMode.address});\n this._subscription = {};\n return this;\n }\n\n _getFullEventFilters() {\n\n return this.eventFilters().map((event) => {\n return this._platform.createUrl(event);\n });\n\n }\n\n _setTimeout() {\n\n this._clearTimeout();\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n poll((next)=> {\n\n if (this.alive()) return next();\n\n this.renew();\n\n }, Subscription._pollInterval, this._timeout);\n\n return this;\n\n }\n\n _clearTimeout() {\n\n stopPolling(this._timeout);\n\n return this;\n\n }\n\n _decrypt(message:any) {\n\n if (!this.subscribed()) throw new Error('No subscription');\n\n if (this._subscription.deliveryMode.encryptionKey) {\n\n var PUBNUB = this._pubnubFactory;\n\n message = PUBNUB.crypto_obj.decrypt(message, this._subscription.deliveryMode.encryptionKey, {\n encryptKey: false,\n keyEncoding: 'base64',\n keyLength: 128,\n mode: 'ecb'\n });\n\n }\n\n return message;\n\n }\n\n _notify(message:any) {\n\n this.emit(this.events.notification, this._decrypt(message));\n\n return this;\n\n }\n\n _subscribeAtPubnub():Subscription {\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n var PUBNUB = this._pubnubFactory;\n\n this._pubnub = PUBNUB.init({\n ssl: true,\n subscribe_key: this._subscription.deliveryMode.subscriberKey\n });\n\n this._pubnub.ready();\n\n this._pubnub.subscribe({\n channel: this._subscription.deliveryMode.address,\n message: this._notify.bind(this),\n connect: () => {}\n });\n\n return this;\n\n }\n\n}\n\n//export interface ISubscription {\n// id?:string;\n// uri?: string;\n// eventFilters?:string[];\n// expirationTime?:string; // 2014-03-12T19:54:35.613Z\n// expiresIn?:number;\n// deliveryMode?: {\n// transportType?:string;\n// encryption?:boolean;\n// address?:string;\n// subscriberKey?:string;\n// encryptionKey?:string;\n// secretKey?:string;\n// };\n// creationTime?:string; // 2014-03-12T19:54:35.613Z\n// status?:string; // Active\n//}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/subscription/Subscription.js\n **/","import Subscription from './Subscription';\nimport Queue from '../core/Queue';\n\nexport default class CachedSubscription extends Subscription {\n\n constructor(pubnubFactory, platform, cache, cacheKey) {\n\n super(pubnubFactory, platform);\n\n this._cache = cache;\n this._cacheKey = cacheKey;\n this._renewQueue = new Queue(this._cache, cacheKey + '-renew');\n this._resubscribeQueue = new Queue(this._cache, cacheKey + '-resubscribe');\n\n this.events = {\n ...this.events,\n queuedRenewSuccess: 'queuedRenewSuccess',\n queuedRenewError: 'queuedRenewError',\n queuedResubscribeSuccess: 'queuedResubscribeSuccess',\n queuedResubscribeError: 'queuedResubscribeError'\n };\n\n this.on(this.events.renewError, () => {\n this.resubscribe();\n });\n\n this.on([this.events.subscribeSuccess, this.events.renewSuccess], () => {\n this._cache.setItem(this._cacheKey, this.subscription());\n });\n\n this.on(this.events.removeSuccess, () => {\n this._cache.removeItem(this._cacheKey);\n });\n\n }\n\n /**\n * TODO Combine with Platform.refresh and move elsewhere\n * @param actionCb\n * @param queue\n * @param successEvent\n * @param errorEvent\n * @param errorMessage\n * @return {*}\n * @private\n */\n async _queue(actionCb, queue, successEvent, errorEvent, errorMessage) {\n\n try {\n\n if (queue.isPaused()) {\n\n await queue.poll();\n\n if (!this.alive()) {\n throw new Error(errorMessage);\n }\n\n this.emit(successEvent, null);\n\n return null;\n\n }\n\n queue.pause();\n\n var res = await actionCb.call(this);\n\n queue.resume();\n\n this.emit(successEvent, res);\n\n return res;\n\n } catch (e) {\n\n this.emit(errorEvent, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n renew() {\n\n return this._queue(\n super.renew,\n this._renewQueue,\n this.events.queuedRenewSuccess,\n this.events.queuedRenewError,\n 'Subscription is not alive after renew timeout'\n );\n\n }\n\n /**\n * @returns {Promise}\n */\n resubscribe() {\n\n return this._queue(\n super.resubscribe,\n this._resubscribeQueue,\n this.events.queuedResubscribeSuccess,\n this.events.queuedResubscribeError,\n 'Subscription is not alive after resubscribe timeout'\n );\n\n }\n\n /**\n * @param {string[]} events\n * @return {CachedSubscription}\n */\n restore(events) {\n\n var cachedSubscriptionData = this._cache.getItem(this._cacheKey);\n\n if (cachedSubscriptionData) {\n try {\n this.setSubscription(cachedSubscriptionData);\n } catch (e) {}\n } else {\n this.setEventFilters(events);\n }\n\n return this;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/subscription/CachedSubscription.js\n **/","/**\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 // This invoke function is written in a style that assumes some\n // calling function (or Promise) will handle exceptions.\n function invoke(method, arg) {\n var result = generator[method](arg);\n var value = result.value;\n return value instanceof AwaitArgument\n ? Promise.resolve(value.arg).then(invokeNext, invokeThrow)\n : 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 return result;\n });\n }\n\n if (typeof process === \"object\" && process.domain) {\n invoke = process.domain.bind(invoke);\n }\n\n var invokeNext = invoke.bind(generator, \"next\");\n var invokeThrow = invoke.bind(generator, \"throw\");\n var invokeReturn = invoke.bind(generator, \"return\");\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return invoke(method, arg);\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 ) : new Promise(function (resolve) {\n resolve(callInvokeWithMethodAndArg());\n });\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\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/regenerator/runtime.js\n ** module id = 26\n ** module chunks = 0\n **/"],"sourceRoot":"/source/"} \ No newline at end of file diff --git a/build/ringcentral.js b/build/ringcentral.js index a3c3f862..ddf191ba 100644 --- a/build/ringcentral.js +++ b/build/ringcentral.js @@ -89,31 +89,35 @@ var _coreObservable = __webpack_require__(8); var _coreObservable2 = _interopRequireDefault(_coreObservable); -var _httpClient = __webpack_require__(9); +var _coreQueue = __webpack_require__(9); + +var _coreQueue2 = _interopRequireDefault(_coreQueue); + +var _httpClient = __webpack_require__(10); var _httpClient2 = _interopRequireDefault(_httpClient); -var _httpApiResponse = __webpack_require__(11); +var _httpApiResponse = __webpack_require__(12); var _httpApiResponse2 = _interopRequireDefault(_httpApiResponse); -var _httpUtils = __webpack_require__(10); +var _httpUtils = __webpack_require__(11); var HttpUtils = _interopRequireWildcard(_httpUtils); -var _mocksClientMock = __webpack_require__(12); +var _mocksClientMock = __webpack_require__(13); var _mocksClientMock2 = _interopRequireDefault(_mocksClientMock); -var _mocksMock = __webpack_require__(14); +var _mocksMock = __webpack_require__(15); var _mocksMock2 = _interopRequireDefault(_mocksMock); -var _mocksRegistry = __webpack_require__(13); +var _mocksRegistry = __webpack_require__(14); var _mocksRegistry2 = _interopRequireDefault(_mocksRegistry); -var _platformPlatform = __webpack_require__(15); +var _platformPlatform = __webpack_require__(16); var _platformPlatform2 = _interopRequireDefault(_platformPlatform); @@ -121,10 +125,6 @@ var _platformAuth = __webpack_require__(17); var _platformAuth2 = _interopRequireDefault(_platformAuth); -var _platformQueue = __webpack_require__(16); - -var _platformQueue2 = _interopRequireDefault(_platformQueue); - var _pubnubPubnubFactory = __webpack_require__(18); var _pubnubPubnubFactory2 = _interopRequireDefault(_pubnubPubnubFactory); @@ -133,7 +133,11 @@ var _subscriptionSubscription = __webpack_require__(20); var _subscriptionSubscription2 = _interopRequireDefault(_subscriptionSubscription); -__webpack_require__(21); +var _subscriptionCachedSubscription = __webpack_require__(21); + +var _subscriptionCachedSubscription2 = _interopRequireDefault(_subscriptionCachedSubscription); + +__webpack_require__(22); var SDK = (function () { _createClass(SDK, null, [{ @@ -189,7 +193,15 @@ var SDK = (function () { */ SDK.prototype.createSubscription = function createSubscription() { - return new _subscriptionSubscription2['default'](this._pubnubFactory, this._platform, this._cache); + return new _subscriptionSubscription2['default'](this._pubnubFactory, this._platform); + }; + + /** + * @return {CachedSubscription} + */ + + SDK.prototype.createCachedSubscription = function createCachedSubscription(cacheKey) { + return new _subscriptionCachedSubscription2['default'](this._pubnubFactory, this._platform, this._cache, cacheKey); }; /** @@ -206,7 +218,8 @@ var SDK = (function () { Cache: _coreCache2['default'], Observable: _coreObservable2['default'], Utils: Utils, - Externals: Externals + Externals: Externals, + Queue: _coreQueue2['default'] }, enumerable: true }, { @@ -221,8 +234,7 @@ var SDK = (function () { key: 'platform', value: { Auth: _platformAuth2['default'], - Platform: _platformPlatform2['default'], - Queue: _platformQueue2['default'] + Platform: _platformPlatform2['default'] }, enumerable: true }, { @@ -425,22 +437,24 @@ var _pubnub = __webpack_require__(6); var _pubnub2 = _interopRequireDefault(_pubnub); -var Promise = _es6Promise2['default'] && _es6Promise2['default'].Promise || window.Promise; +var root = new Function('return this')(); + +var Promise = _es6Promise2['default'] && _es6Promise2['default'].Promise || root.Promise; exports.Promise = Promise; -var fetch = _nodeFetch2['default'] || window.fetch; +var fetch = root.fetch || _nodeFetch2['default']; exports.fetch = fetch; -var Request = fetch.Request || window.Request; +var Request = root.Request || fetch.Request; exports.Request = Request; -var Response = fetch.Response || window.Response; +var Response = root.Response || fetch.Response; exports.Response = Response; -var Headers = fetch.Headers || window.Headers; +var Headers = root.Headers || fetch.Headers; exports.Headers = Headers; -var PUBNUB = _pubnub2['default'] || window.PUBNUB; +var PUBNUB = root.PUBNUB || _pubnub2['default']; exports.PUBNUB = PUBNUB; -var localStorage = typeof window !== 'undefined' && typeof window.localStorage !== 'undefined' ? window.localStorage : {}; +var localStorage = typeof root.localStorage !== 'undefined' ? root.localStorage : {}; exports.localStorage = localStorage; /***/ }, @@ -631,6 +645,86 @@ exports.__esModule = true; var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + +var _coreExternals = __webpack_require__(3); + +var _Utils = __webpack_require__(2); + +var Queue = (function () { + _createClass(Queue, null, [{ + key: '_pollInterval', + value: 250, + enumerable: true + }, { + key: '_releaseTimeout', + value: 5000, + enumerable: true + }]); + + function Queue(cache, cacheId) { + _classCallCheck(this, Queue); + + this._cache = cache; + this._cacheId = cacheId; + this._promise = null; + } + + Queue.prototype.isPaused = function isPaused() { + + var time = this._cache.getItem(this._cacheId); + + return !!time && Date.now() - parseInt(time) < Queue._releaseTimeout; + }; + + Queue.prototype.pause = function pause() { + this._cache.setItem(this._cacheId, Date.now()); + return this; + }; + + Queue.prototype.resume = function resume() { + this._cache.removeItem(this._cacheId); + return this; + }; + + Queue.prototype.poll = function poll() { + var _this = this; + + if (this._promise) return this._promise; + + this._promise = new _coreExternals.Promise(function (resolve, reject) { + + _Utils.poll(function (next) { + + if (_this.isPaused()) return next(); + + _this._promise = null; + + _this.resume(); // this is actually not needed but why not + + resolve(null); + }, Queue._pollInterval); + }); + + return this._promise; + }; + + return Queue; +})(); + +exports['default'] = Queue; +module.exports = exports['default']; + +/***/ }, +/* 10 */ +/***/ function(module, exports, __webpack_require__) { + +'use strict'; + +exports.__esModule = true; + +var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } @@ -641,13 +735,13 @@ var _coreExternals = __webpack_require__(3); var _coreUtils = __webpack_require__(2); -var _Utils = __webpack_require__(10); +var _Utils = __webpack_require__(11); var _coreObservable = __webpack_require__(8); var _coreObservable2 = _interopRequireDefault(_coreObservable); -var _ApiResponse = __webpack_require__(11); +var _ApiResponse = __webpack_require__(12); var _ApiResponse2 = _interopRequireDefault(_ApiResponse); @@ -857,7 +951,7 @@ exports['default'] = Client; module.exports = exports['default']; /***/ }, -/* 10 */ +/* 11 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -909,7 +1003,7 @@ function findHeaderName(name, headers) { } /***/ }, -/* 11 */ +/* 12 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -924,7 +1018,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons var _coreExternals = __webpack_require__(3); -var _Utils = __webpack_require__(10); +var _Utils = __webpack_require__(11); var utils = _interopRequireWildcard(_Utils); @@ -1154,7 +1248,7 @@ exports['default'] = ApiResponse; module.exports = exports['default']; /***/ }, -/* 12 */ +/* 13 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -1167,11 +1261,11 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -var _Registry = __webpack_require__(13); +var _Registry = __webpack_require__(14); var _Registry2 = _interopRequireDefault(_Registry); -var _httpClient = __webpack_require__(9); +var _httpClient = __webpack_require__(10); var _httpClient2 = _interopRequireDefault(_httpClient); @@ -1215,7 +1309,7 @@ exports['default'] = Client; module.exports = exports['default']; /***/ }, -/* 13 */ +/* 14 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -1226,7 +1320,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'd function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -var _Mock = __webpack_require__(14); +var _Mock = __webpack_require__(15); var _Mock2 = _interopRequireDefault(_Mock); @@ -1393,7 +1487,7 @@ exports['default'] = Registry; module.exports = exports['default']; /***/ }, -/* 14 */ +/* 15 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -1404,13 +1498,13 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'd function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -var _httpApiResponse = __webpack_require__(11); +var _httpApiResponse = __webpack_require__(12); var _httpApiResponse2 = _interopRequireDefault(_httpApiResponse); var _coreUtils = __webpack_require__(2); -var _httpUtils = __webpack_require__(10); +var _httpUtils = __webpack_require__(11); var Mock = (function () { function Mock(method, path, json, status, statusText, delay) { @@ -1476,7 +1570,7 @@ exports['default'] = Mock; module.exports = exports['default']; /***/ }, -/* 15 */ +/* 16 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -1495,9 +1589,9 @@ var _coreObservable = __webpack_require__(8); var _coreObservable2 = _interopRequireDefault(_coreObservable); -var _Queue = __webpack_require__(16); +var _coreQueue = __webpack_require__(9); -var _Queue2 = _interopRequireDefault(_Queue); +var _coreQueue2 = _interopRequireDefault(_coreQueue); var _Auth = __webpack_require__(17); @@ -1585,7 +1679,7 @@ var Platform = (function (_Observable) { /** @type {Client} */ this._client = client; - this._queue = new _Queue2['default'](this._cache, Platform._cacheId + '-refresh'); + this._queue = new _coreQueue2['default'](this._cache, Platform._cacheId + '-refresh'); this._auth = new _Auth2['default'](this._cache, Platform._cacheId); } @@ -2039,8 +2133,8 @@ var Platform = (function (_Observable) { /** * General purpose function to send anything to server + * @param {string} options.url * @param {object} [options.body] - * @param {string} [options.url] * @param {string} [options.method] * @param {object} [options.query] * @param {object} [options.headers] @@ -2072,7 +2166,7 @@ var Platform = (function (_Observable) { /** * @param {string} url - * @param {object} query + * @param {object} [query] * @param {object} [options] * @param {object} [options.headers] * @param {boolean} [options.skipAuthCheck] @@ -2103,7 +2197,7 @@ var Platform = (function (_Observable) { /** * @param {string} url * @param {object} body - * @param {object} query + * @param {object} [query] * @param {object} [options] * @param {object} [options.headers] * @param {boolean} [options.skipAuthCheck] @@ -2134,8 +2228,8 @@ var Platform = (function (_Observable) { /** * @param {string} url - * @param {object} body - * @param {object} query + * @param {object} [body] + * @param {object} [query] * @param {object} [options] * @param {object} [options.headers] * @param {boolean} [options.skipAuthCheck] @@ -2166,7 +2260,7 @@ var Platform = (function (_Observable) { /** * @param {string} url - * @param {string} query + * @param {string} [query] * @param {object} [options] * @param {object} [options.headers] * @param {boolean} [options.skipAuthCheck] @@ -2272,88 +2366,6 @@ module.exports = exports['default']; // Guard is for errors that come from polling -/***/ }, -/* 16 */ -/***/ function(module, exports, __webpack_require__) { - -'use strict'; - -exports.__esModule = true; - -var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - -var _coreExternals = __webpack_require__(3); - -var _coreUtils = __webpack_require__(2); - -var Queue = (function () { - _createClass(Queue, null, [{ - key: '_pollInterval', - value: 250, - enumerable: true - }, { - key: '_releaseTimeout', - value: 5000, - enumerable: true - }]); - - function Queue(cache, cacheId) { - _classCallCheck(this, Queue); - - this._cache = cache; - this._cacheId = cacheId; - this._promise = null; - } - - Queue.prototype.isPaused = function isPaused() { - - var storage = this._cache, - cacheId = this._cacheId, - time = storage.getItem(cacheId); - - return !!time && Date.now() - parseInt(time) < Queue._releaseTimeout; - }; - - Queue.prototype.pause = function pause() { - this._cache.setItem(this._cacheId, Date.now()); - return this; - }; - - Queue.prototype.resume = function resume() { - this._cache.removeItem(this._cacheId); - return this; - }; - - Queue.prototype.poll = function poll() { - var _this = this; - - if (this._promise) return this._promise; - - this._promise = new _coreExternals.Promise(function (resolve, reject) { - - _coreUtils.poll(function (next) { - - if (_this.isPaused()) return next(); - - _this._promise = null; - - _this.resume(); // this is actually not needed but why not - - resolve(null); - }, Queue._pollInterval); - }); - - return this._promise; - }; - - return Queue; -})(); - -exports['default'] = Queue; -module.exports = exports['default']; - /***/ }, /* 17 */ /***/ function(module, exports) { @@ -2630,7 +2642,7 @@ var _coreObservable = __webpack_require__(8); var _coreObservable2 = _interopRequireDefault(_coreObservable); -var _httpClient = __webpack_require__(9); +var _httpClient = __webpack_require__(10); var _httpClient2 = _interopRequireDefault(_httpClient); @@ -2649,7 +2661,7 @@ var Subscription = (function (_Observable) { enumerable: true }]); - function Subscription(pubnubFactory, platform, cache) { + function Subscription(pubnubFactory, platform) { _classCallCheck(this, Subscription); _Observable.call(this); @@ -2665,7 +2677,6 @@ var Subscription = (function (_Observable) { }; this._pubnubFactory = pubnubFactory; this._platform = platform; - this._cache = cache; this._pubnub = null; this._timeout = null; this._subscription = {}; @@ -2689,13 +2700,18 @@ var Subscription = (function (_Observable) { // status?:string; // Active //} + Subscription.prototype.subscribed = function subscribed() { + + return !!(this._subscription.id && this._subscription.deliveryMode && this._subscription.deliveryMode.subscriberKey && this._subscription.deliveryMode.address); + }; + /** * @return {boolean} */ Subscription.prototype.alive = function alive() { - return !!(this._subscription.id && this._subscription.deliveryMode && this._subscription.deliveryMode.subscriberKey && this._subscription.deliveryMode.address && Date.now() < this.expirationTime()); + return this.subscribed() && Date.now() < this.expirationTime(); }; Subscription.prototype.expirationTime = function expirationTime() { @@ -2723,11 +2739,10 @@ var Subscription = (function (_Observable) { /** * Creates or updates subscription if there is an active one - * @param {{events?:string[]}} [options] New array of events * @returns {Promise} */ - Subscription.prototype.register = function register(options) { + Subscription.prototype.register = function register() { return regeneratorRuntime.async(function register$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: @@ -2737,14 +2752,14 @@ var Subscription = (function (_Observable) { } context$2$0.next = 3; - return regeneratorRuntime.awrap(this.renew(options)); + return regeneratorRuntime.awrap(this.renew()); case 3: return context$2$0.abrupt('return', context$2$0.sent); case 6: context$2$0.next = 8; - return regeneratorRuntime.awrap(this.subscribe(options)); + return regeneratorRuntime.awrap(this.subscribe()); case 8: return context$2$0.abrupt('return', context$2$0.sent); @@ -2781,32 +2796,27 @@ var Subscription = (function (_Observable) { }; /** - * @param {{events?:string[]}} [options] New array of events * @returns {Promise} */ - Subscription.prototype.subscribe = function subscribe(options) { + Subscription.prototype.subscribe = function subscribe() { var response, json; return regeneratorRuntime.async(function subscribe$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: context$2$0.prev = 0; - options = options || {}; - - if (options.events) this.setEventFilters(options.events); - this._clearTimeout(); if (this.eventFilters().length) { - context$2$0.next = 6; + context$2$0.next = 4; break; } throw new Error('Events are undefined'); - case 6: - context$2$0.next = 8; + case 4: + context$2$0.next = 6; return regeneratorRuntime.awrap(this._platform.post('/restapi/v1.0/subscription', { eventFilters: this._getFullEventFilters(), deliveryMode: { @@ -2814,7 +2824,7 @@ var Subscription = (function (_Observable) { } })); - case 8: + case 6: response = context$2$0.sent; json = response.json(); @@ -2822,8 +2832,8 @@ var Subscription = (function (_Observable) { return context$2$0.abrupt('return', response); - case 14: - context$2$0.prev = 14; + case 12: + context$2$0.prev = 12; context$2$0.t0 = context$2$0['catch'](0); context$2$0.t0 = this._platform.client().makeError(context$2$0.t0); @@ -2832,53 +2842,48 @@ var Subscription = (function (_Observable) { throw context$2$0.t0; - case 19: + case 17: case 'end': return context$2$0.stop(); } - }, null, this, [[0, 14]]); + }, null, this, [[0, 12]]); }; /** - * @param {{events?:string[]}} [options] New array of events * @returns {Promise} */ - Subscription.prototype.renew = function renew(options) { + Subscription.prototype.renew = function renew() { var response, json; return regeneratorRuntime.async(function renew$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: context$2$0.prev = 0; - options = options || {}; - - if (options.events) this.setEventFilters(options.events); - this._clearTimeout(); if (this.alive()) { - context$2$0.next = 6; + context$2$0.next = 4; break; } throw new Error('Subscription is not alive'); - case 6: + case 4: if (this.eventFilters().length) { - context$2$0.next = 8; + context$2$0.next = 6; break; } throw new Error('Events are undefined'); - case 8: - context$2$0.next = 10; + case 6: + context$2$0.next = 8; return regeneratorRuntime.awrap(this._platform.put('/restapi/v1.0/subscription/' + this._subscription.id, { eventFilters: this._getFullEventFilters() })); - case 10: + case 8: response = context$2$0.sent; json = response.json(); @@ -2886,8 +2891,8 @@ var Subscription = (function (_Observable) { return context$2$0.abrupt('return', response); - case 16: - context$2$0.prev = 16; + case 14: + context$2$0.prev = 14; context$2$0.t0 = context$2$0['catch'](0); context$2$0.t0 = this._platform.client().makeError(context$2$0.t0); @@ -2896,11 +2901,11 @@ var Subscription = (function (_Observable) { throw context$2$0.t0; - case 21: + case 19: case 'end': return context$2$0.stop(); } - }, null, this, [[0, 16]]); + }, null, this, [[0, 14]]); }; /** @@ -2914,12 +2919,12 @@ var Subscription = (function (_Observable) { case 0: context$2$0.prev = 0; - if (this.alive()) { + if (this.subscribed()) { context$2$0.next = 3; break; } - throw new Error('Subscription is not alive'); + throw new Error('No subscription'); case 3: context$2$0.next = 5; @@ -2950,60 +2955,36 @@ var Subscription = (function (_Observable) { }; /** - * Remove subscription and disconnect from PUBNUB - * This method resets subscription at client side but backend is not notified + * @returns {Promise} */ - Subscription.prototype.reset = function reset() { - this._clearTimeout(); - if (this.alive() && this._pubnub) this._pubnub.unsubscribe({ channel: this._subscription.deliveryMode.address }); - this._subscription = {}; - return this; + Subscription.prototype.resubscribe = function resubscribe() { + + return this.reset().setEventFilters(this.eventFilters()).subscribe(); }; /** - * - * @param {string} cacheKey - * @param {string[]} events - * @return {Subscription} + * Remove subscription and disconnect from PUBNUB + * This method resets subscription at client side but backend is not notified */ - Subscription.prototype.restoreFromCache = function restoreFromCache(cacheKey, events) { - var _this = this; - - this.on([this.events.subscribeSuccess, this.events.renewSuccess], function () { - - _this._cache.setItem(cacheKey, _this.subscription()); - }); - - this.on(this.events.renewError, function () { - - _this.reset().setEventFilters(events).register(); - }); - - var cachedSubscriptionData = this._cache.getItem(cacheKey); - - if (cachedSubscriptionData) { - try { - this.setSubscription(cachedSubscriptionData); - } catch (e) {} - } else { - this.setEventFilters(events); - } - + Subscription.prototype.reset = function reset() { + this._clearTimeout(); + if (this.subscribed() && this._pubnub) this._pubnub.unsubscribe({ channel: this._subscription.deliveryMode.address }); + this._subscription = {}; return this; }; Subscription.prototype._getFullEventFilters = function _getFullEventFilters() { - var _this2 = this; + var _this = this; return this.eventFilters().map(function (event) { - return _this2._platform.createUrl(event); + return _this._platform.createUrl(event); }); }; Subscription.prototype._setTimeout = function _setTimeout() { - var _this3 = this; + var _this2 = this; this._clearTimeout(); @@ -3011,9 +2992,9 @@ var Subscription = (function (_Observable) { _coreUtils.poll(function (next) { - if (_this3.alive()) return next(); + if (_this2.alive()) return next(); - _this3.renew(); + _this2.renew(); }, Subscription._pollInterval, this._timeout); return this; @@ -3028,7 +3009,7 @@ var Subscription = (function (_Observable) { Subscription.prototype._decrypt = function _decrypt(message) { - if (!this.alive()) throw new Error('Subscription is not alive'); + if (!this.subscribed()) throw new Error('No subscription'); if (this._subscription.deliveryMode.encryptionKey) { @@ -3082,6 +3063,180 @@ module.exports = exports['default']; /***/ }, /* 21 */ +/***/ function(module, exports, __webpack_require__) { + +'use strict'; + +exports.__esModule = true; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _Subscription2 = __webpack_require__(20); + +var _Subscription3 = _interopRequireDefault(_Subscription2); + +var _coreQueue = __webpack_require__(9); + +var _coreQueue2 = _interopRequireDefault(_coreQueue); + +var CachedSubscription = (function (_Subscription) { + _inherits(CachedSubscription, _Subscription); + + function CachedSubscription(pubnubFactory, platform, cache, cacheKey) { + var _this = this; + + _classCallCheck(this, CachedSubscription); + + _Subscription.call(this, pubnubFactory, platform); + + this._cache = cache; + this._cacheKey = cacheKey; + this._renewQueue = new _coreQueue2['default'](this._cache, cacheKey + '-renew'); + this._resubscribeQueue = new _coreQueue2['default'](this._cache, cacheKey + '-resubscribe'); + + this.events = _extends({}, this.events, { + queuedRenewSuccess: 'queuedRenewSuccess', + queuedRenewError: 'queuedRenewError', + queuedResubscribeSuccess: 'queuedResubscribeSuccess', + queuedResubscribeError: 'queuedResubscribeError' + }); + + this.on(this.events.renewError, function () { + _this.resubscribe(); + }); + + this.on([this.events.subscribeSuccess, this.events.renewSuccess], function () { + _this._cache.setItem(_this._cacheKey, _this.subscription()); + }); + + this.on(this.events.removeSuccess, function () { + _this._cache.removeItem(_this._cacheKey); + }); + } + + /** + * TODO Combine with Platform.refresh and move elsewhere + * @param actionCb + * @param queue + * @param successEvent + * @param errorEvent + * @param errorMessage + * @return {*} + * @private + */ + + CachedSubscription.prototype._queue = function _queue(actionCb, queue, successEvent, errorEvent, errorMessage) { + var res; + return regeneratorRuntime.async(function _queue$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + context$2$0.prev = 0; + + if (!queue.isPaused()) { + context$2$0.next = 8; + break; + } + + context$2$0.next = 4; + return regeneratorRuntime.awrap(queue.poll()); + + case 4: + if (this.alive()) { + context$2$0.next = 6; + break; + } + + throw new Error(errorMessage); + + case 6: + + this.emit(successEvent, null); + + return context$2$0.abrupt('return', null); + + case 8: + + queue.pause(); + + context$2$0.next = 11; + return regeneratorRuntime.awrap(actionCb.call(this)); + + case 11: + res = context$2$0.sent; + + queue.resume(); + + this.emit(successEvent, res); + + return context$2$0.abrupt('return', res); + + case 17: + context$2$0.prev = 17; + context$2$0.t0 = context$2$0['catch'](0); + + this.emit(errorEvent, context$2$0.t0); + + throw context$2$0.t0; + + case 21: + case 'end': + return context$2$0.stop(); + } + }, null, this, [[0, 17]]); + }; + + /** + * @returns {Promise} + */ + + CachedSubscription.prototype.renew = function renew() { + + return this._queue(_Subscription.prototype.renew, this._renewQueue, this.events.queuedRenewSuccess, this.events.queuedRenewError, 'Subscription is not alive after renew timeout'); + }; + + /** + * @returns {Promise} + */ + + CachedSubscription.prototype.resubscribe = function resubscribe() { + + return this._queue(_Subscription.prototype.resubscribe, this._resubscribeQueue, this.events.queuedResubscribeSuccess, this.events.queuedResubscribeError, 'Subscription is not alive after resubscribe timeout'); + }; + + /** + * @param {string[]} events + * @return {CachedSubscription} + */ + + CachedSubscription.prototype.restore = function restore(events) { + + var cachedSubscriptionData = this._cache.getItem(this._cacheKey); + + if (cachedSubscriptionData) { + try { + this.setSubscription(cachedSubscriptionData); + } catch (e) {} + } else { + this.setEventFilters(events); + } + + return this; + }; + + return CachedSubscription; +})(_Subscription3['default']); + +exports['default'] = CachedSubscription; +module.exports = exports['default']; + +/***/ }, +/* 22 */ /***/ function(module, exports) { /* WEBPACK VAR INJECTION */(function(global) {/** diff --git a/build/ringcentral.js.map b/build/ringcentral.js.map index c0771739..c680bc27 100644 --- a/build/ringcentral.js.map +++ b/build/ringcentral.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap c0838cc3f17cb1b5a03c","webpack:///./src/SDK.js","webpack:///./src/core/Utils.js","webpack:///./src/core/Externals.js","webpack:///external {\"commonjs\":\"es6-promise\",\"commonjs2\":\"es6-promise\"}","webpack:///external {\"commonjs\":\"node-fetch\",\"commonjs2\":\"node-fetch\"}","webpack:///external {\"commonjs\":\"pubnub\",\"commonjs2\":\"pubnub\",\"amd\":\"pubnub\"}","webpack:///./src/core/Cache.js","webpack:///./src/core/Observable.js","webpack:///./src/http/Client.js","webpack:///./src/http/Utils.js","webpack:///./src/http/ApiResponse.js","webpack:///./src/mocks/ClientMock.js","webpack:///./src/mocks/Registry.js","webpack:///./src/mocks/Mock.js","webpack:///./src/platform/Platform.js","webpack:///./src/platform/Queue.js","webpack:///./src/platform/Auth.js","webpack:///./src/pubnub/PubnubFactory.js","webpack:///./src/pubnub/PubnubMock.js","webpack:///./src/subscription/Subscription.js","webpack:///./~/regenerator/runtime.js"],"names":[],"mappings":"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;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,WAAW;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS;AACT;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAiC,kBAAkB;AACnD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,iBAAiB;;AAEjB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,YAAY;AACZ;AACA;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,8CAA8C,QAAQ;AACtD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA,WAAW;AACX;AACA;AACA;;AAEA,WAAW;AACX;AACA;AACA;;AAEA,WAAW;AACX;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,8CAA8C,QAAQ;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;;AAEL;AACA,8CAA8C,QAAQ;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,8CAA8C,QAAQ;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA","file":"ringcentral.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"es6-promise\"), require(\"node-fetch\"), require(\"pubnub\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([, , \"pubnub\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"SDK\"] = factory(require(\"es6-promise\"), require(\"node-fetch\"), require(\"pubnub\"));\n\telse\n\t\troot[\"RingCentral\"] = root[\"RingCentral\"] || {}, root[\"RingCentral\"][\"SDK\"] = factory(root[undefined], root[undefined], root[undefined]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_4__, __WEBPACK_EXTERNAL_MODULE_5__, __WEBPACK_EXTERNAL_MODULE_6__) {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\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 = \"/build/\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap c0838cc3f17cb1b5a03c\n **/","import * as Utils from './core/Utils';\nimport Cache from './core/Cache';\nimport * as Externals from './core/Externals';\nimport Observable from './core/Observable';\n\nimport Client from './http/Client';\nimport ApiResponse from './http/ApiResponse';\nimport * as HttpUtils from './http/Utils';\n\nimport {default as ClientMock} from './mocks/ClientMock';\nimport Mock from './mocks/Mock';\nimport Registry from './mocks/Registry';\n\nimport Platform from './platform/Platform';\nimport Auth from './platform/Auth';\nimport Queue from './platform/Queue';\n\nimport PubnubMockFactory from './pubnub/PubnubFactory';\n\nimport Subscription from './subscription/Subscription';\n\nrequire(\"regenerator/runtime\");\n\nexport default class SDK {\n\n static version = '2.0.0';\n\n static server = {\n sandbox: 'https://platform.devtest.ringcentral.com',\n production: 'https://platform.ringcentral.com'\n };\n\n /**\n * @constructor\n * @param {object} [options]\n * @param {string} [options.server]\n * @param {string} [options.cachePrefix]\n * @param {string} [options.appSecret]\n * @param {string} [options.appKey]\n * @param {string} [options.appName]\n * @param {string} [options.appVersion]\n * @param {string} [options.pubnubFactory]\n * @param {string} [options.client]\n */\n constructor(options) {\n\n options = options || {};\n\n this._cache = new Cache(Externals.localStorage, options.cachePrefix);\n\n this._client = options.client || new Client();\n\n this._platform = new Platform(this._client, this._cache, options.server, options.appKey, options.appSecret);\n\n this._pubnubFactory = options.pubnubFactory || Externals.PUBNUB;\n\n }\n\n /**\n * @return {Platform}\n */\n platform() {\n return this._platform;\n }\n\n /**\n * @return {Subscription}\n */\n createSubscription() {\n return new Subscription(this._pubnubFactory, this._platform, this._cache);\n }\n\n /**\n * @return {Cache}\n */\n cache() {\n return this._cache;\n }\n\n static core = {\n Cache: Cache,\n Observable: Observable,\n Utils: Utils,\n Externals: Externals\n };\n\n static http = {\n Client: Client,\n ApiResponse: ApiResponse,\n Utils: HttpUtils\n };\n\n static platform = {\n Auth: Auth,\n Platform: Platform,\n Queue: Queue\n };\n\n static subscription = {\n Subscription: Subscription\n };\n\n static mocks = {\n Client: ClientMock,\n Registry: Registry,\n Mock: Mock\n };\n\n static pubnub = {\n PubnubMockFactory: PubnubMockFactory\n };\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/SDK.js\n **/","import {Promise} from './Externals.js';\n\n/**\n * TODO Replace with something better\n * @see https://github.com/joyent/node/blob/master/lib/querystring.js\n * @param {object} parameters\n * @returns {string}\n */\nexport function queryStringify(parameters) {\n\n var array = [];\n\n parameters = parameters || {};\n\n Object.keys(parameters).forEach((k) => {\n\n var v = parameters[k];\n\n if (isArray(v)) {\n v.forEach((vv) => {\n array.push(encodeURIComponent(k) + '=' + encodeURIComponent(vv));\n });\n } else {\n array.push(encodeURIComponent(k) + '=' + encodeURIComponent(v));\n }\n\n });\n\n return array.join('&');\n\n}\n\n/**\n * TODO Replace with something better\n * @see https://github.com/joyent/node/blob/master/lib/querystring.js\n * @param {string} queryString\n * @returns {object}\n */\nexport function parseQueryString(queryString) {\n\n var argsParsed = {};\n\n queryString.split('&').forEach((arg) => {\n\n arg = decodeURIComponent(arg);\n\n if (arg.indexOf('=') == -1) {\n\n argsParsed[arg.trim()] = true;\n\n } else {\n\n var pair = arg.split('='),\n key = pair[0].trim(),\n value = pair[1].trim();\n\n if (key in argsParsed) {\n if (key in argsParsed && !isArray(argsParsed[key])) argsParsed[key] = [argsParsed[key]];\n argsParsed[key].push(value);\n } else {\n argsParsed[key] = value;\n }\n\n }\n\n });\n\n return argsParsed;\n\n}\n\n/**\n * @param obj\n * @return {boolean}\n */\nexport function isFunction(obj) {\n return typeof obj === \"function\";\n}\n\n/**\n * @param obj\n * @return {boolean}\n */\nexport function isArray(obj) {\n return Array.isArray ? Array.isArray(obj) : typeof obj === \"array\";\n}\n\n/**\n * @param fn\n * @param interval\n * @param timeout\n */\nexport function poll(fn, interval, timeout) { //NodeJS.Timer|number\n\n module.exports.stopPolling(timeout);\n\n interval = interval || 1000;\n\n var next = (delay) => {\n\n delay = delay || interval;\n\n interval = delay;\n\n return setTimeout(() => {\n\n fn(next, delay);\n\n }, delay);\n\n };\n\n return next();\n\n}\n\nexport function stopPolling(timeout) {\n if (timeout) clearTimeout(timeout);\n}\n\nexport function isNodeJS() {\n return (typeof process !== 'undefined');\n}\n\nexport function isBrowser() {\n return (typeof window !== 'undefined');\n}\n\nexport function delay(timeout) {\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n resolve(null);\n }, timeout);\n });\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Utils.js\n **/","import ES6Promise from 'es6-promise';\nimport nodeFetch from 'node-fetch';\nimport pubnub from 'pubnub';\n\nexport var Promise = (ES6Promise && ES6Promise.Promise) || window.Promise;\n\nexport var fetch = nodeFetch || window.fetch;\nexport var Request = fetch.Request || window.Request;\nexport var Response = fetch.Response || window.Response;\nexport var Headers = fetch.Headers || window.Headers;\n\nexport var PUBNUB = pubnub || window.PUBNUB;\n\nexport var localStorage = (typeof window !== 'undefined' &&\n typeof window.localStorage !== 'undefined') ? window.localStorage : {};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Externals.js\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_4__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external {\"commonjs\":\"es6-promise\",\"commonjs2\":\"es6-promise\"}\n ** module id = 4\n ** module chunks = 0\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_5__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external {\"commonjs\":\"node-fetch\",\"commonjs2\":\"node-fetch\"}\n ** module id = 5\n ** module chunks = 0\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_6__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external {\"commonjs\":\"pubnub\",\"commonjs2\":\"pubnub\",\"amd\":\"pubnub\"}\n ** module id = 6\n ** module chunks = 0\n **/","export default class Cache {\n\n static defaultPrefix = 'rc-';\n\n constructor(storage, prefix) {\n this.setPrefix(prefix);\n this._storage = storage;\n }\n\n setPrefix(prefix) {\n this._prefix = prefix || Cache.defaultPrefix;\n return this;\n }\n\n setItem(key, data) {\n this._storage[this._prefixKey(key)] = JSON.stringify(data);\n return this;\n }\n\n removeItem(key) {\n delete this._storage[this._prefixKey(key)];\n return this;\n }\n\n getItem(key) {\n var item = this._storage[this._prefixKey(key)];\n if (!item) return null;\n return JSON.parse(item);\n }\n\n clean() {\n\n for (var key in this._storage) {\n\n if (!this._storage.hasOwnProperty(key)) continue;\n\n if (key.indexOf(this._prefix) === 0) {\n delete this._storage[key];\n }\n\n }\n\n return this;\n\n }\n\n _prefixKey(key) {\n return this._prefix + key;\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Cache.js\n **/","export default class Observable {\n\n constructor() {\n this.off();\n }\n\n hasListeners(event) {\n return (event in this._listeners);\n }\n\n on(events, callback) {\n\n if (typeof events == 'string') events = [events];\n if (!events) throw new Error('No events to subscribe to');\n if (typeof callback !== 'function') throw new Error('Callback must be a function');\n\n events.forEach((event) => {\n\n if (!this.hasListeners(event)) this._listeners[event] = [];\n\n this._listeners[event].push(callback);\n\n });\n\n return this;\n\n }\n\n emit(event, ...args) {\n\n var result = null;\n\n if (!this.hasListeners(event)) return null;\n\n this._listeners[event].some((callback) => {\n\n result = callback.apply(this, args);\n return (result === false);\n\n });\n\n return result;\n\n }\n\n off(event, callback) {\n\n if (!event) {\n\n this._listeners = {};\n\n } else {\n\n if (!callback) {\n\n delete this._listeners[event];\n\n } else {\n\n if (!this.hasListeners(event)) return this;\n\n this._listeners[event].forEach((cb, i) => {\n\n if (cb === callback) delete this._listeners[event][i];\n\n });\n\n }\n\n }\n\n return this;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Observable.js\n **/","import {fetch, Request, Response, Headers, Promise} from '../core/Externals';\nimport {queryStringify} from '../core/Utils';\nimport {findHeaderName} from './Utils';\nimport Observable from '../core/Observable';\nimport ApiResponse from './ApiResponse';\n\nexport default class Client extends Observable {\n\n static _allowedMethods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'];\n\n events = {\n beforeRequest: 'beforeRequest',\n requestSuccess: 'requestSuccess',\n requestError: 'requestError'\n };\n\n /**\n * @param {Request} request\n * @return {Promise}\n */\n async sendRequest(request) {\n\n var apiResponse = new ApiResponse(request);\n\n try {\n\n //TODO Stop request if listeners return false\n this.emit(this.events.beforeRequest, apiResponse);\n\n apiResponse._response = await this._loadResponse(request);\n\n if (apiResponse._isMultipart() || apiResponse._isJson()) {\n apiResponse._text = await apiResponse.response().text();\n }\n\n if (!apiResponse.ok()) throw new Error('Response has unsuccessful status');\n\n this.emit(this.events.requestSuccess, apiResponse);\n\n return apiResponse;\n\n } catch (e) {\n\n if (!e.apiResponse) e = this.makeError(e, apiResponse);\n\n this.emit(this.events.requestError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @param {Request} request\n * @return {Promise}\n * @private\n */\n async _loadResponse(request) {\n return await fetch.call(null, request);\n }\n\n /**\n * Wraps the JS Error object with transaction information\n * @param {Error|IApiError} e\n * @param {ApiResponse} apiResponse\n * @return {IApiError}\n */\n makeError(e, apiResponse) {\n\n // Wrap only if regular error\n if (!e.hasOwnProperty('apiResponse') && !e.hasOwnProperty('originalMessage')) {\n\n e.apiResponse = apiResponse;\n e.originalMessage = e.message;\n e.message = (apiResponse && apiResponse.error(true)) || e.originalMessage;\n\n }\n\n return e;\n\n }\n\n /**\n *\n * @param {object} init\n * @param {object} [init.url]\n * @param {object} [init.body]\n * @param {string} [init.method]\n * @param {object} [init.query]\n * @param {object} [init.headers]\n * @return {Request}\n */\n createRequest(init) {\n\n init = init || {};\n init.headers = init.headers || {};\n\n // Sanity checks\n if (!init.url) throw new Error('Url is not defined');\n if (!init.method) init.method = 'GET';\n if (init.method && Client._allowedMethods.indexOf(init.method) < 0) throw new Error('Method has wrong value: ' + init.method);\n\n // Defaults\n init.credentials = init.credentials || 'include';\n init.mode = init.mode || 'cors';\n\n // Append Query String\n if (init.query) {\n init.url = init.url + (init.url.indexOf('?') > -1 ? '&' : '?') + queryStringify(init.query);\n }\n\n if (!(findHeaderName('Accept', init.headers))) {\n init.headers['Accept'] = ApiResponse._jsonContentType;\n }\n\n // Serialize body\n //TODO Check that body is a plain object\n if (typeof init.body !== 'string' || !init.body) {\n\n var contentTypeHeaderName = findHeaderName(ApiResponse._contentType, init.headers);\n\n if (!contentTypeHeaderName) {\n contentTypeHeaderName = ApiResponse._contentType;\n init.headers[contentTypeHeaderName] = ApiResponse._jsonContentType;\n }\n\n var contentType = init.headers[contentTypeHeaderName];\n\n // Assign a new encoded body\n if (contentType.indexOf(ApiResponse._jsonContentType) > -1) {\n init.body = JSON.stringify(init.body);\n } else if (contentType.indexOf(ApiResponse._urlencodedContentType) > -1) {\n init.body = queryStringify(init.body);\n }\n\n }\n\n // Create a request with encoded body\n var req = new Request(init.url, init);\n\n // Keep the original body accessible directly (for mocks)\n req.originalBody = init.body;\n\n return req;\n\n }\n\n}\n\n/**\n * @name IApiError\n * @property {string} stack\n * @property {string} originalMessage\n * @property {ApiResponse} apiResponse\n */\n\n\n/** WEBPACK FOOTER **\n ** ./src/http/Client.js\n **/","import {fetch, Request, Response, Headers, Promise} from '../core/Externals';\nimport * as utils from '../core/Utils';\n\n/**\n * Creates a response\n * @param stringBody\n * @param init\n * @return {Response}\n */\nexport function createResponse(stringBody, init) {\n\n init = init || {};\n\n var response = new Response(stringBody, init);\n\n //TODO Wait for https://github.com/bitinn/node-fetch/issues/38\n if (utils.isNodeJS()) {\n\n response._text = stringBody;\n response._decode = function() {\n return this._text;\n };\n\n }\n\n return response;\n\n}\n\nexport function findHeaderName(name, headers) {\n name = name.toLowerCase();\n return Object.keys(headers).reduce(function(res, key) {\n if (res) return res;\n if (name == key.toLowerCase()) return key;\n return res;\n }, null);\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/http/Utils.js\n **/","import {fetch, Request, Response, Headers, Promise} from '../core/Externals';\nimport * as utils from './Utils';\n\nexport default class ApiResponse {\n\n static _contentType = 'Content-Type';\n static _jsonContentType = 'application/json';\n static _multipartContentType = 'multipart/mixed';\n static _urlencodedContentType = 'application/x-www-form-urlencoded';\n static _headerSeparator = ':';\n static _bodySeparator = '\\n\\n';\n static _boundarySeparator = '--';\n\n /**\n * @param {Request} request\n * @param {Response} response\n * @param {string} responseText\n */\n constructor(request, response, responseText) {\n\n /** @type {Request} */\n this._request = request;\n\n /** @type {Response} */\n this._response = response;\n\n this._text = responseText;\n this._json = null;\n this._multipart = [];\n\n }\n\n /**\n * @return {Response}\n */\n response() {\n return this._response;\n }\n\n /**\n * @return {Request}\n */\n request() {\n return this._request;\n }\n\n /**\n * @return {boolean}\n */\n ok() {\n return this._response && this._response.ok;\n }\n\n /**\n * @return {string}\n */\n text() {\n if (!this._isJson() && !this._isMultipart()) throw new Error('Response is not text');\n return this._text;\n }\n\n /**\n * @return {object}\n */\n json() {\n if (!this._isJson()) throw new Error('Response is not JSON');\n if (!this._json) {\n this._json = this._text ? JSON.parse(this._text) : null;\n }\n return this._json;\n }\n\n /**\n * @param [skipOKCheck]\n * @return {string}\n */\n error(skipOKCheck) {\n\n if (this.ok() && !skipOKCheck) return null;\n\n var message = (this._response && this._response.status ? this._response.status + ' ' : '') +\n (this._response && this._response.statusText ? this._response.statusText : '');\n\n try {\n\n if (this.json().message) message = this.json().message;\n if (this.json().error_description) message = this.json().error_description;\n if (this.json().description) message = this.json().description;\n\n } catch (e) {}\n\n return message;\n\n }\n\n /**\n * @return {ApiResponse[]}\n */\n multipart() {\n\n if (!this._isMultipart()) throw new Error('Response is not multipart');\n\n if (!this._multipart.length) {\n\n // Step 1. Split multipart response\n\n var text = this.text();\n\n if (!text) throw new Error('No response body');\n\n var boundary = this._getContentType().match(/boundary=([^;]+)/i)[1];\n\n if (!boundary) throw new Error('Cannot find boundary');\n\n var parts = text.toString().split(ApiResponse._boundarySeparator + boundary);\n\n if (parts[0].trim() === '') parts.shift();\n if (parts[parts.length - 1].trim() == ApiResponse._boundarySeparator) parts.pop();\n\n if (parts.length < 1) throw new Error('No parts in body');\n\n // Step 2. Parse status info\n\n var statusInfo = ApiResponse.create(parts.shift(), this._response.status, this._response.statusText).json();\n\n // Step 3. Parse all other parts\n\n this._multipart = parts.map((part:string, i) => {\n\n var status = statusInfo.response[i].status;\n\n return ApiResponse.create(part, status);\n\n });\n\n }\n\n return this._multipart;\n\n }\n\n _isContentType(contentType) {\n return this._getContentType().indexOf(contentType) > -1;\n }\n\n _getContentType() {\n return this._response.headers.get(ApiResponse._contentType) || '';\n }\n\n _isMultipart() {\n return this._isContentType(ApiResponse._multipartContentType);\n }\n\n _isUrlEncoded() {\n return this._isContentType(ApiResponse._urlencodedContentType);\n }\n\n _isJson() {\n return this._isContentType(ApiResponse._jsonContentType);\n }\n\n /**\n * Method is used to create ApiResponse object from string parts of multipart/mixed response\n * @param {string} [text]\n * @param {number} [status]\n * @param {string} [statusText]\n * @return {ApiResponse}\n */\n static create(text, status, statusText) {\n\n text = text || '';\n status = status || 200;\n statusText = statusText || 'OK';\n\n text = text.replace(/\\r/g, '');\n\n var headers = new Headers(),\n headersAndBody = text.split(ApiResponse._bodySeparator),\n headersText = (headersAndBody.length > 1) ? headersAndBody.shift() : '';\n\n text = headersAndBody.join(ApiResponse._bodySeparator);\n\n (headersText || '')\n .split('\\n')\n .forEach((header:string) => {\n\n var split = header.trim().split(ApiResponse._headerSeparator),\n key = split.shift().trim(),\n value = split.join(ApiResponse._headerSeparator).trim();\n\n if (key) headers.append(key, value);\n\n });\n\n return new ApiResponse(null, utils.createResponse(text, {\n headers: headers,\n status: status,\n statusText: statusText\n }), text);\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/http/ApiResponse.js\n **/","import Registry from './Registry';\nimport {default as HttpClient} from '../http/Client';\n\nexport default class Client extends HttpClient {\n\n constructor() {\n super();\n this._registry = new Registry();\n }\n\n registry() {\n return this._registry;\n }\n\n async _loadResponse(request) {\n\n var mock = this._registry.find(request);\n\n return await mock.getResponse(request);\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/mocks/ClientMock.js\n **/","import Mock from './Mock';\n\nexport default class Registry {\n\n constructor() {\n this._mocks = [];\n }\n\n add(mock) {\n this._mocks.push(mock);\n return this;\n }\n\n clear() {\n this._mocks = [];\n return this;\n }\n\n find(request) {\n\n //console.log('Registry is looking for', request);\n\n var mock = this._mocks.shift();\n\n if (!mock) throw new Error('No mock in registry for request ' + request.method + ' ' + request.url);\n\n if (!mock.test(request)) throw new Error('Wrong request ' + request.method + ' ' + request.url +\n ' for expected mock ' + mock.method() + ' ' + mock.path());\n\n return mock;\n\n }\n\n apiCall(method:string, path:string, response:any, status, statusText) {\n\n this.add(new Mock(method, path, response, status, statusText));\n\n return this;\n\n }\n\n authentication() {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'access_token': 'ACCESS_TOKEN',\n 'token_type': 'bearer',\n 'expires_in': 3600,\n 'refresh_token': 'REFRESH_TOKEN',\n 'refresh_token_expires_in': 60480,\n 'scope': 'SMS RCM Foo Boo',\n 'expireTime': new Date().getTime() + 3600000\n });\n\n return this;\n\n }\n\n logout() {\n\n this.apiCall('POST', '/restapi/oauth/revoke', {});\n\n return this;\n\n }\n\n presenceLoad(id) {\n\n this.apiCall('GET', '/restapi/v1.0/account/~/extension/' + id + '/presence', {\n \"uri\": \"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/\" + id + \"/presence\",\n \"extension\": {\n \"uri\": \"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/\" + id,\n \"id\": id,\n \"extensionNumber\": \"101\"\n },\n \"activeCalls\": [],\n \"presenceStatus\": \"Available\",\n \"telephonyStatus\": \"Ringing\",\n \"userStatus\": \"Available\",\n \"dndStatus\": \"TakeAllCalls\",\n \"extensionId\": id\n });\n\n return this;\n\n }\n\n subscribeGeneric(expiresIn) {\n\n expiresIn = expiresIn || 15 * 60 * 60;\n\n var date = new Date();\n\n this.apiCall('POST', '/restapi/v1.0/subscription', {\n 'eventFilters': [\n '/restapi/v1.0/account/~/extension/~/presence'\n ],\n 'expirationTime': new Date(date.getTime() + (expiresIn * 1000)).toISOString(),\n 'expiresIn': expiresIn,\n 'deliveryMode': {\n 'transportType': 'PubNub',\n 'encryption': false,\n 'address': '123_foo',\n 'subscriberKey': 'sub-c-foo',\n 'secretKey': 'sec-c-bar'\n },\n 'id': 'foo-bar-baz',\n 'creationTime': date.toISOString(),\n 'status': 'Active',\n 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz'\n });\n\n return this;\n\n }\n\n subscribeOnPresence(id, detailed) {\n\n id = id || '1';\n\n var date = new Date();\n\n this.apiCall('POST', '/restapi/v1.0/subscription', {\n 'eventFilters': ['/restapi/v1.0/account/~/extension/' + id + '/presence' + (detailed ? '?detailedTelephonyState=true' : '')],\n 'expirationTime': new Date(date.getTime() + (15 * 60 * 60 * 1000)).toISOString(),\n 'deliveryMode': {\n 'transportType': 'PubNub',\n 'encryption': true,\n 'address': '123_foo',\n 'subscriberKey': 'sub-c-foo',\n 'secretKey': 'sec-c-bar',\n 'encryptionAlgorithm': 'AES',\n 'encryptionKey': 'VQwb6EVNcQPBhE/JgFZ2zw=='\n },\n 'creationTime': date.toISOString(),\n 'id': 'foo-bar-baz',\n 'status': 'Active',\n 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz'\n });\n\n return this;\n\n }\n\n tokenRefresh(failure) {\n\n if (!failure) {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'access_token': 'ACCESS_TOKEN_FROM_REFRESH',\n 'token_type': 'bearer',\n 'expires_in': 3600,\n 'refresh_token': 'REFRESH_TOKEN_FROM_REFRESH',\n 'refresh_token_expires_in': 60480,\n 'scope': 'SMS RCM Foo Boo'\n });\n\n } else {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'message': 'Wrong token',\n 'error_description': 'Wrong token',\n 'description': 'Wrong token'\n }, 400);\n\n }\n\n return this;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/mocks/Registry.js\n **/","import ApiResponse from '../http/ApiResponse';\nimport {delay} from '../core/Utils';\nimport {createResponse} from '../http/Utils';\n\nexport default class Mock {\n\n constructor(method, path, json, status, statusText, delay) {\n this._method = method.toUpperCase();\n this._path = path;\n this._json = json || {};\n this._delay = delay || 10;\n this._status = status || 200;\n this._statusText = statusText || 'OK';\n }\n\n path() {\n return this._path;\n }\n\n method() {\n return this._method;\n }\n\n test(request:Request) {\n\n return request.url.indexOf(this._path) > -1 &&\n request.method.toUpperCase() == this._method;\n\n }\n\n async getResponse(request) {\n\n await delay(this._delay);\n\n return this.createResponse(this._json);\n\n }\n\n createResponse(json, init) {\n\n init = init || {};\n\n init.status = init.status || this._status;\n init.statusText = init.statusText || this._statusText;\n\n var str = JSON.stringify(json),\n res = createResponse(str, init);\n\n res.headers.set(ApiResponse._contentType, ApiResponse._jsonContentType);\n\n return res;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/mocks/Mock.js\n **/","import Observable from '../core/Observable';\nimport Queue from './Queue';\nimport Auth from './Auth';\nimport {Promise} from '../core/Externals';\nimport {queryStringify, parseQueryString, delay} from '../core/Utils';\n\nexport default class Platform extends Observable {\n\n static _urlPrefix = '/restapi';\n static _apiVersion = 'v1.0';\n static _accessTokenTtl = null; // Platform server by default sets it to 60 * 60 = 1 hour\n static _refreshTokenTtl = 10 * 60 * 60; // 10 hours\n static _refreshTokenTtlRemember = 7 * 24 * 60 * 60; // 1 week\n static _tokenEndpoint = '/restapi/oauth/token';\n static _revokeEndpoint = '/restapi/oauth/revoke';\n static _authorizeEndpoint = '/restapi/oauth/authorize';\n static _refreshDelayMs = 100;\n static _cacheId = 'platform';\n static _clearCacheOnRefreshError = true;\n\n events = {\n beforeLogin: 'beforeLogin',\n loginSuccess: 'loginSuccess',\n loginError: 'loginError',\n beforeRefresh: 'beforeRefresh',\n refreshSuccess: 'refreshSuccess',\n refreshError: 'refreshError',\n beforeLogout: 'beforeLogout',\n logoutSuccess: 'logoutSuccess',\n logoutError: 'logoutError'\n };\n\n constructor(client, cache, server, appKey, appSecret) {\n\n super();\n\n this._server = server;\n this._appKey = appKey;\n this._appSecret = appSecret;\n\n /** @type {Cache} */\n this._cache = cache;\n\n /** @type {Client} */\n this._client = client;\n\n this._queue = new Queue(this._cache, Platform._cacheId + '-refresh');\n\n this._auth = new Auth(this._cache, Platform._cacheId);\n\n }\n\n /**\n * @return {Auth}\n */\n auth() {\n return this._auth;\n }\n\n /**\n * @return {Client}\n */\n client() {\n return this._client;\n }\n\n /**\n * @param {string} path\n * @param {object} [options]\n * @param {boolean} [options.addServer]\n * @param {string} [options.addMethod]\n * @param {boolean} [options.addToken]\n * @return {string}\n */\n createUrl(path, options) {\n\n path = path || '';\n options = options || {};\n\n var builtUrl = '',\n hasHttp = path.indexOf('http://') != -1 || path.indexOf('https://') != -1;\n\n if (options.addServer && !hasHttp) builtUrl += this._server;\n\n if (path.indexOf(Platform._urlPrefix) == -1 && !hasHttp) builtUrl += Platform._urlPrefix + '/' + Platform._apiVersion;\n\n builtUrl += path;\n\n if (options.addMethod || options.addToken) builtUrl += (path.indexOf('?') > -1 ? '&' : '?');\n\n if (options.addMethod) builtUrl += '_method=' + options.addMethod;\n if (options.addToken) builtUrl += (options.addMethod ? '&' : '') + 'access_token=' + this._auth.accessToken();\n\n return builtUrl;\n\n }\n\n /**\n * @param {string} options.redirectUri\n * @param {string} options.state\n * @param {string} options.brandId\n * @param {string} options.display\n * @param {string} options.prompt\n * @return {string}\n */\n authUrl(options) {\n\n options = options || {};\n\n return this.createUrl(Platform._authorizeEndpoint + '?' + queryStringify({\n 'response_type': 'code',\n 'redirect_uri': options.redirectUri || '',\n 'client_id': this._appKey,\n 'state': options.state || '',\n 'brand_id': options.brandId || '',\n 'display': options.display || '',\n 'prompt': options.prompt || ''\n }), {addServer: true})\n\n }\n\n /**\n * @param {string} url\n * @return {Object}\n */\n parseAuthRedirectUrl(url:string) {\n\n var qs = parseQueryString(url.split('?').reverse()[0]),\n error = qs.error_description || qs.error;\n\n if (error) {\n var e = new Error(error);\n e.error = qs.error;\n throw e;\n }\n\n return qs;\n\n }\n\n /**\n * @return {Promise}\n */\n async loggedIn() {\n\n try {\n await this._ensureAuthentication();\n return true;\n } catch (e) {\n return false;\n }\n\n }\n\n /**\n * @param {string} options.username\n * @param {string} options.password\n * @param {string} options.extension\n * @param {string} options.code\n * @param {string} options.redirectUri\n * @param {string} options.endpointId\n * @returns {Promise}\n */\n async login(options) {\n\n try {\n\n options = options || {};\n\n options.remember = options.remember || false;\n\n this.emit(this.events.beforeLogin);\n\n var body = {\n \"access_token_ttl\": Platform._accessTokenTtl,\n \"refresh_token_ttl\": options.remember ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl\n };\n\n if (!options.code) {\n\n body.grant_type = 'password';\n body.username = options.username;\n body.password = options.password;\n body.extension = options.extension || '';\n\n } else if (options.code) {\n\n body.grant_type = 'authorization_code';\n body.code = options.code;\n body.redirect_uri = options.redirectUri;\n //body.client_id = this.getCredentials().key; // not needed\n\n }\n\n if (options.endpointId) body.endpoint_id = options.endpointId;\n\n var apiResponse = await this._tokenRequest(Platform._tokenEndpoint, body),\n json = apiResponse.json();\n\n this._auth\n .setData(json)\n .setRemember(options.remember);\n\n this.emit(this.events.loginSuccess, apiResponse);\n\n return apiResponse;\n\n } catch (e) {\n\n this._cache.clean();\n\n this.emit(this.events.loginError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n async refresh() {\n\n try {\n\n this.emit(this.events.beforeRefresh);\n\n if (this._queue.isPaused()) {\n\n await this._queue.poll();\n\n if (!this._isAccessTokenValid()) {\n throw new Error('Automatic authentification timeout');\n }\n\n this.emit(this.events.refreshSuccess, null);\n\n return null;\n\n }\n\n this._queue.pause();\n\n // Make sure all existing AJAX calls had a chance to reach the server\n await delay(Platform._refreshDelayMs);\n\n // Perform sanity checks\n if (!this._auth.refreshToken()) throw new Error('Refresh token is missing');\n if (!this._auth.refreshTokenValid()) throw new Error('Refresh token has expired');\n if (!this._queue.isPaused()) throw new Error('Queue was resumed before refresh call');\n\n /** @type {ApiResponse} */\n var res = await this._tokenRequest(Platform._tokenEndpoint, {\n \"grant_type\": \"refresh_token\",\n \"refresh_token\": this._auth.refreshToken(),\n \"access_token_ttl\": Platform._accessTokenTtl,\n \"refresh_token_ttl\": this._auth.remember() ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl\n }),\n json = res.json();\n\n if (!json.access_token) {\n throw this._client.makeError(new Error('Malformed OAuth response'), res);\n }\n\n this._auth.setData(json);\n this._queue.resume();\n\n this.emit(this.events.refreshSuccess, res);\n\n return res;\n\n } catch (e) {\n\n e = this._client.makeError(e);\n\n if (Platform._clearCacheOnRefreshError) {\n this._cache.clean();\n }\n\n this.emit(this.events.refreshError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n async logout() {\n\n try {\n\n this.emit(this.events.beforeLogout);\n\n this._queue.pause();\n\n var res = await this._tokenRequest(Platform._revokeEndpoint, {\n token: this._auth.accessToken()\n });\n\n this._queue.resume();\n this._cache.clean();\n\n this.emit(this.events.logoutSuccess, res);\n\n return res;\n\n } catch (e) {\n\n this._queue.resume();\n\n this.emit(this.events.logoutError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @param {Request} request\n * @param {object} [options]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async inflateRequest(request, options) {\n\n options = options || {};\n\n if (options.skipAuthCheck) return request;\n\n await this._ensureAuthentication();\n\n request.headers.set('Authorization', this._authHeader());\n //request.url = this.createUrl(request.url, {addServer: true}); //FIXME Spec prevents this...\n\n //TODO Add User-Agent here\n\n return request;\n\n }\n\n /**\n * @param {Request} request\n * @param {object} [options]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async sendRequest(request, options) {\n\n try {\n\n request = await this.inflateRequest(request, options);\n\n return (await this._client.sendRequest(request));\n\n } catch (e) {\n\n // Guard is for errors that come from polling\n if (!e.apiResponse || !e.apiResponse.response() || (e.apiResponse.response().status != 401)) throw e;\n\n this._auth.cancelAccessToken();\n\n return (await this.sendRequest(request, options));\n\n }\n\n }\n\n /**\n * General purpose function to send anything to server\n * @param {object} [options.body]\n * @param {string} [options.url]\n * @param {string} [options.method]\n * @param {object} [options.query]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async send(options = {}) {\n\n //FIXME https://github.com/bitinn/node-fetch/issues/43\n options.url = this.createUrl(options.url, {addServer: true});\n\n return await this.sendRequest(this._client.createRequest(options), options);\n\n }\n\n /**\n * @param {string} url\n * @param {object} query\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async get(url, query, options) {\n options = options || {};\n options.method = 'GET';\n options.url = url;\n options.query = query;\n return await this.send(options);\n }\n\n /**\n * @param {string} url\n * @param {object} body\n * @param {object} query\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async post(url, body, query, options) {\n options = options || {};\n options.method = 'POST';\n options.url = url;\n options.query = query;\n options.body = body;\n return await this.send(options);\n }\n\n /**\n * @param {string} url\n * @param {object} body\n * @param {object} query\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async put(url, body, query, options) {\n options = options || {};\n options.method = 'PUT';\n options.url = url;\n options.query = query;\n options.body = body;\n return await this.send(options);\n }\n\n /**\n * @param {string} url\n * @param {string} query\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async 'delete'(url, query, options) {\n options = options || {};\n options.method = 'DELETE';\n options.url = url;\n options.query = query;\n return await this.send(options);\n }\n\n async _tokenRequest(path, body) {\n\n return await this.send({\n url: path,\n skipAuthCheck: true,\n body: body,\n method: 'POST',\n headers: {\n 'Authorization': 'Basic ' + this._apiKey(),\n 'Content-Type': 'application/x-www-form-urlencoded'\n }\n });\n\n }\n\n async _ensureAuthentication() {\n\n if (this._isAccessTokenValid()) return null;\n return await this.refresh();\n\n }\n\n _isAccessTokenValid() {\n\n return (this._auth.accessTokenValid() && !this._queue.isPaused());\n\n }\n\n _apiKey() {\n var apiKey = this._appKey + ':' + this._appSecret;\n return (typeof btoa == 'function') ? btoa(apiKey) : new Buffer(apiKey).toString('base64');\n }\n\n _authHeader() {\n var token = this._auth.accessToken();\n return this._auth.tokenType() + (token ? ' ' + token : '');\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/platform/Platform.js\n **/","import {Promise} from '../core/Externals';\nimport {poll, stopPolling} from '../core/Utils';\n\nexport default class Queue {\n\n static _pollInterval = 250;\n static _releaseTimeout = 5000;\n\n constructor(cache, cacheId) {\n\n this._cache = cache;\n this._cacheId = cacheId;\n this._promise = null;\n\n }\n\n isPaused() {\n\n var storage = this._cache,\n cacheId = this._cacheId,\n time = storage.getItem(cacheId);\n\n return !!time && Date.now() - parseInt(time) < Queue._releaseTimeout;\n }\n\n pause() {\n this._cache.setItem(this._cacheId, Date.now());\n return this;\n }\n\n resume() {\n this._cache.removeItem(this._cacheId);\n return this;\n }\n\n poll() {\n\n if (this._promise) return this._promise;\n\n this._promise = new Promise((resolve, reject) => {\n\n poll((next) => {\n\n if (this.isPaused()) return next();\n\n this._promise = null;\n\n this.resume(); // this is actually not needed but why not\n\n resolve(null);\n\n }, Queue._pollInterval);\n\n });\n\n return this._promise;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/platform/Queue.js\n **/","export default class Auth {\n\n static refreshHandicapMs:number = 60 * 1000; // 1 minute\n static forcedTokenType = 'forced';\n\n constructor(cache, cacheId:string) {\n\n /** @type {Cache} */\n this._cache = cache;\n this._cacheId = cacheId;\n\n }\n\n accessToken() {\n return this.data().access_token;\n }\n\n refreshToken() {\n return this.data().refresh_token;\n }\n\n tokenType() {\n return this.data().token_type;\n }\n\n /**\n * @return {{token_type: string, access_token: string, expires_in: number, refresh_token: string, refresh_token_expires_in: number}}\n */\n data() {\n\n return this._cache.getItem(this._cacheId) || {\n token_type: '',\n access_token: '',\n expires_in: 0,\n refresh_token: '',\n refresh_token_expires_in: 0\n };\n\n }\n\n /**\n * @param {object} newData\n * @return {Auth}\n */\n setData(newData) {\n\n newData = newData || {};\n\n var data = this.data();\n\n Object.keys(newData).forEach((key) => {\n data[key] = newData[key];\n });\n\n data.expire_time = Date.now() + (data.expires_in * 1000);\n data.refresh_token_expire_time = Date.now() + (data.refresh_token_expires_in * 1000);\n\n this._cache.setItem(this._cacheId, data);\n\n return this;\n\n }\n\n /**\n * Check if there is a valid (not expired) access token\n * @return {boolean}\n */\n accessTokenValid() {\n\n var authData = this.data();\n return (authData.token_type === Auth.forcedTokenType || (authData.expire_time - Auth.refreshHandicapMs > Date.now()));\n\n }\n\n /**\n * Check if there is a valid (not expired) access token\n * @return {boolean}\n */\n refreshTokenValid() {\n\n return (this.data().refresh_token_expire_time > Date.now());\n\n }\n\n /**\n * @return {Auth}\n */\n cancelAccessToken() {\n\n return this.setData({\n access_token: '',\n expires_in: 0\n });\n\n }\n\n /**\n * This method sets a special authentication mode used in Service Web\n * @return {Auth}\n */\n forceAuthentication() {\n\n this.setData({\n token_type: Auth.forcedTokenType,\n access_token: '',\n expires_in: 0,\n refresh_token: '',\n refresh_token_expires_in: 0\n });\n\n return this;\n\n }\n\n /**\n * @param remember\n * @return {Auth}\n */\n setRemember(remember) {\n\n return this.setData({remember: remember});\n\n }\n\n /**\n * @return {boolean}\n */\n remember() {\n\n return !!this.data().remember;\n\n }\n\n}\n\n//export interface IAuthData {\n// remember?:boolean;\n// token_type?:string;\n// access_token?:string;\n// expires_in?:number; // actually it's string\n// expire_time?:number;\n// refresh_token?:string;\n// refresh_token_expires_in?:number; // actually it's string\n// refresh_token_expire_time?:number;\n// scope?:string;\n//}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/platform/Auth.js\n **/","import PubnubMock from './PubnubMock.js';\nimport {PUBNUB} from '../core/Externals';\n\nexport default class PubnubMockFactory {\n\n constructor() {\n this.crypto_obj = PUBNUB.crypto_obj;\n }\n\n init(options:PUBNUBInitOptions) {\n return new PubnubMock(options);\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/pubnub/PubnubFactory.js\n **/","import Observable from '../core/Observable';\nimport {PUBNUB} from '../core/Externals';\n\nexport default class PubnubMock extends Observable {\n\n constructor(options) {\n super();\n this.options = options;\n this.crypto_obj = PUBNUB.crypto_obj;\n }\n\n ready() {}\n\n subscribe(options:PUBNUBSubscribeOptions) {\n this.on('message-' + options.channel, options.message);\n }\n\n unsubscribe(options:PUBNUBUnsubscribeOptions) {\n this.off('message-' + options.channel);\n }\n\n receiveMessage(msg, channel) {\n this.emit('message-' + channel, msg, 'env', channel);\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/pubnub/PubnubMock.js\n **/","import Observable from '../core/Observable';\nimport Client from '../http/Client';\nimport {poll, stopPolling} from '../core/Utils';\n\nexport default class Subscription extends Observable {\n\n static _renewHandicapMs = 2 * 60 * 1000;\n static _pollInterval = 10 * 1000;\n\n events = {\n notification: 'notification',\n removeSuccess: 'removeSuccess',\n removeError: 'removeError',\n renewSuccess: 'renewSuccess',\n renewError: 'renewError',\n subscribeSuccess: 'subscribeSuccess',\n subscribeError: 'subscribeError'\n };\n\n constructor(pubnubFactory, platform, cache) {\n\n super();\n\n this._pubnubFactory = pubnubFactory;\n this._platform = platform;\n this._cache = cache;\n this._pubnub = null;\n this._timeout = null;\n this._subscription = {};\n\n }\n\n /**\n * @return {boolean}\n */\n alive() {\n\n return !!(this._subscription.id &&\n this._subscription.deliveryMode &&\n this._subscription.deliveryMode.subscriberKey &&\n this._subscription.deliveryMode.address &&\n Date.now() < this.expirationTime());\n\n }\n\n expirationTime() {\n return new Date(this._subscription.expirationTime || 0).getTime() - Subscription._renewHandicapMs;\n }\n\n setSubscription(subscription) {\n\n subscription = subscription || {};\n\n this._clearTimeout();\n\n this._subscription = subscription;\n\n if (!this._pubnub) this._subscribeAtPubnub();\n\n this._setTimeout();\n\n return this;\n\n }\n\n subscription() {\n return this._subscription;\n }\n\n /**\n * Creates or updates subscription if there is an active one\n * @param {{events?:string[]}} [options] New array of events\n * @returns {Promise}\n */\n async register(options) {\n\n if (this.alive()) {\n return await this.renew(options);\n } else {\n return await this.subscribe(options);\n }\n\n }\n\n eventFilters() {\n return this._subscription.eventFilters || [];\n }\n\n /**\n * @param {string[]} events\n * @return {Subscription}\n */\n addEventFilters(events) {\n this.setEventFilters(this.eventFilters().concat(events));\n return this;\n }\n\n /**\n * @param {string[]} events\n * @return {Subscription}\n */\n setEventFilters(events) {\n this._subscription.eventFilters = events;\n return this;\n }\n\n /**\n * @param {{events?:string[]}} [options] New array of events\n * @returns {Promise}\n */\n async subscribe(options) {\n\n try {\n\n options = options || {};\n\n if (options.events) this.setEventFilters(options.events);\n\n this._clearTimeout();\n\n if (!this.eventFilters().length) throw new Error('Events are undefined');\n\n var response = await this._platform.post('/restapi/v1.0/subscription', {\n eventFilters: this._getFullEventFilters(),\n deliveryMode: {\n transportType: 'PubNub'\n }\n }),\n json = response.json();\n\n this.setSubscription(json)\n .emit(this.events.subscribeSuccess, response);\n\n return response;\n\n\n } catch (e) {\n\n e = this._platform.client().makeError(e);\n\n this.reset()\n .emit(this.events.subscribeError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @param {{events?:string[]}} [options] New array of events\n * @returns {Promise}\n */\n async renew(options) {\n\n try {\n\n options = options || {};\n\n if (options.events) this.setEventFilters(options.events);\n\n this._clearTimeout();\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n if (!this.eventFilters().length) throw new Error('Events are undefined');\n\n var response = await this._platform.put('/restapi/v1.0/subscription/' + this._subscription.id, {\n eventFilters: this._getFullEventFilters()\n });\n\n var json = response.json();\n\n this.setSubscription(json)\n .emit(this.events.renewSuccess, response);\n\n return response;\n\n } catch (e) {\n\n e = this._platform.client().makeError(e);\n\n this.reset()\n .emit(this.events.renewError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n async remove() {\n\n try {\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n var response = await this._platform.delete('/restapi/v1.0/subscription/' + this._subscription.id);\n\n this.reset()\n .emit(this.events.removeSuccess, response);\n\n return response;\n\n } catch (e) {\n\n e = this._platform.client().makeError(e);\n\n this.emit(this.events.removeError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * Remove subscription and disconnect from PUBNUB\n * This method resets subscription at client side but backend is not notified\n */\n reset() {\n this._clearTimeout();\n if (this.alive() && this._pubnub) this._pubnub.unsubscribe({channel: this._subscription.deliveryMode.address});\n this._subscription = {};\n return this;\n }\n\n /**\n *\n * @param {string} cacheKey\n * @param {string[]} events\n * @return {Subscription}\n */\n restoreFromCache(cacheKey, events) {\n\n this.on([this.events.subscribeSuccess, this.events.renewSuccess], () => {\n\n this._cache.setItem(cacheKey, this.subscription());\n\n });\n\n this.on(this.events.renewError, () => {\n\n this.reset()\n .setEventFilters(events)\n .register();\n\n });\n\n var cachedSubscriptionData = this._cache.getItem(cacheKey);\n\n if (cachedSubscriptionData) {\n try {\n this.setSubscription(cachedSubscriptionData);\n } catch (e) {}\n } else {\n this.setEventFilters(events);\n }\n\n return this;\n\n }\n\n _getFullEventFilters() {\n\n return this.eventFilters().map((event) => {\n return this._platform.createUrl(event);\n });\n\n }\n\n _setTimeout() {\n\n this._clearTimeout();\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n poll((next)=> {\n\n if (this.alive()) return next();\n\n this.renew();\n\n }, Subscription._pollInterval, this._timeout);\n\n return this;\n\n }\n\n _clearTimeout() {\n\n stopPolling(this._timeout);\n\n return this;\n\n }\n\n _decrypt(message:any) {\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n if (this._subscription.deliveryMode.encryptionKey) {\n\n var PUBNUB = this._pubnubFactory;\n\n message = PUBNUB.crypto_obj.decrypt(message, this._subscription.deliveryMode.encryptionKey, {\n encryptKey: false,\n keyEncoding: 'base64',\n keyLength: 128,\n mode: 'ecb'\n });\n\n }\n\n return message;\n\n }\n\n _notify(message:any) {\n\n this.emit(this.events.notification, this._decrypt(message));\n\n return this;\n\n }\n\n _subscribeAtPubnub():Subscription {\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n var PUBNUB = this._pubnubFactory;\n\n this._pubnub = PUBNUB.init({\n ssl: true,\n subscribe_key: this._subscription.deliveryMode.subscriberKey\n });\n\n this._pubnub.ready();\n\n this._pubnub.subscribe({\n channel: this._subscription.deliveryMode.address,\n message: this._notify.bind(this),\n connect: () => {}\n });\n\n return this;\n\n }\n\n}\n\n//export interface ISubscription {\n// id?:string;\n// uri?: string;\n// eventFilters?:string[];\n// expirationTime?:string; // 2014-03-12T19:54:35.613Z\n// expiresIn?:number;\n// deliveryMode?: {\n// transportType?:string;\n// encryption?:boolean;\n// address?:string;\n// subscriberKey?:string;\n// encryptionKey?:string;\n// secretKey?:string;\n// };\n// creationTime?:string; // 2014-03-12T19:54:35.613Z\n// status?:string; // Active\n//}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/subscription/Subscription.js\n **/","/**\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 // This invoke function is written in a style that assumes some\n // calling function (or Promise) will handle exceptions.\n function invoke(method, arg) {\n var result = generator[method](arg);\n var value = result.value;\n return value instanceof AwaitArgument\n ? Promise.resolve(value.arg).then(invokeNext, invokeThrow)\n : 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 return result;\n });\n }\n\n if (typeof process === \"object\" && process.domain) {\n invoke = process.domain.bind(invoke);\n }\n\n var invokeNext = invoke.bind(generator, \"next\");\n var invokeThrow = invoke.bind(generator, \"throw\");\n var invokeReturn = invoke.bind(generator, \"return\");\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return invoke(method, arg);\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 ) : new Promise(function (resolve) {\n resolve(callInvokeWithMethodAndArg());\n });\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\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/regenerator/runtime.js\n ** module id = 21\n ** module chunks = 0\n **/"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 5d800152b5167bf356e8","webpack:///./src/SDK.js","webpack:///./src/core/Utils.js","webpack:///./src/core/Externals.js","webpack:///external {\"commonjs\":\"es6-promise\",\"commonjs2\":\"es6-promise\"}","webpack:///external {\"commonjs\":\"node-fetch\",\"commonjs2\":\"node-fetch\"}","webpack:///external {\"commonjs\":\"pubnub\",\"commonjs2\":\"pubnub\",\"amd\":\"pubnub\"}","webpack:///./src/core/Cache.js","webpack:///./src/core/Observable.js","webpack:///./src/core/Queue.js","webpack:///./src/http/Client.js","webpack:///./src/http/Utils.js","webpack:///./src/http/ApiResponse.js","webpack:///./src/mocks/ClientMock.js","webpack:///./src/mocks/Registry.js","webpack:///./src/mocks/Mock.js","webpack:///./src/platform/Platform.js","webpack:///./src/platform/Auth.js","webpack:///./src/pubnub/PubnubFactory.js","webpack:///./src/pubnub/PubnubMock.js","webpack:///./src/subscription/Subscription.js","webpack:///./src/subscription/CachedSubscription.js","webpack:///./~/regenerator/runtime.js"],"names":[],"mappings":"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A;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,KAAK;AACL,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,WAAW;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS;AACT;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAiC,kBAAkB;AACnD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,iBAAiB;;AAEjB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,YAAY;AACZ;AACA;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,8CAA8C,QAAQ;AACtD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA,WAAW;AACX;AACA;AACA;;AAEA,WAAW;AACX;AACA;AACA;;AAEA,WAAW;AACX;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,8CAA8C,QAAQ;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;;AAEL;AACA,8CAA8C,QAAQ;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,8CAA8C,QAAQ;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA","file":"ringcentral.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"es6-promise\"), require(\"node-fetch\"), require(\"pubnub\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([, , \"pubnub\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"SDK\"] = factory(require(\"es6-promise\"), require(\"node-fetch\"), require(\"pubnub\"));\n\telse\n\t\troot[\"RingCentral\"] = root[\"RingCentral\"] || {}, root[\"RingCentral\"][\"SDK\"] = factory(root[undefined], root[undefined], root[undefined]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_4__, __WEBPACK_EXTERNAL_MODULE_5__, __WEBPACK_EXTERNAL_MODULE_6__) {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\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 = \"/build/\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 5d800152b5167bf356e8\n **/","import * as Utils from './core/Utils';\nimport Cache from './core/Cache';\nimport * as Externals from './core/Externals';\nimport Observable from './core/Observable';\nimport Queue from './core/Queue';\n\nimport Client from './http/Client';\nimport ApiResponse from './http/ApiResponse';\nimport * as HttpUtils from './http/Utils';\n\nimport {default as ClientMock} from './mocks/ClientMock';\nimport Mock from './mocks/Mock';\nimport Registry from './mocks/Registry';\n\nimport Platform from './platform/Platform';\nimport Auth from './platform/Auth';\n\nimport PubnubMockFactory from './pubnub/PubnubFactory';\n\nimport Subscription from './subscription/Subscription';\nimport CachedSubscription from './subscription/CachedSubscription';\n\nrequire(\"regenerator/runtime\");\n\nexport default class SDK {\n\n static version = '2.0.0';\n\n static server = {\n sandbox: 'https://platform.devtest.ringcentral.com',\n production: 'https://platform.ringcentral.com'\n };\n\n /**\n * @constructor\n * @param {object} [options]\n * @param {string} [options.server]\n * @param {string} [options.cachePrefix]\n * @param {string} [options.appSecret]\n * @param {string} [options.appKey]\n * @param {string} [options.appName]\n * @param {string} [options.appVersion]\n * @param {string} [options.pubnubFactory]\n * @param {string} [options.client]\n */\n constructor(options) {\n\n options = options || {};\n\n this._cache = new Cache(Externals.localStorage, options.cachePrefix);\n\n this._client = options.client || new Client();\n\n this._platform = new Platform(this._client, this._cache, options.server, options.appKey, options.appSecret);\n\n this._pubnubFactory = options.pubnubFactory || Externals.PUBNUB;\n\n }\n\n /**\n * @return {Platform}\n */\n platform() {\n return this._platform;\n }\n\n /**\n * @return {Subscription}\n */\n createSubscription() {\n return new Subscription(this._pubnubFactory, this._platform);\n }\n\n /**\n * @return {CachedSubscription}\n */\n createCachedSubscription(cacheKey) {\n return new CachedSubscription(this._pubnubFactory, this._platform, this._cache, cacheKey);\n }\n\n /**\n * @return {Cache}\n */\n cache() {\n return this._cache;\n }\n\n static core = {\n Cache: Cache,\n Observable: Observable,\n Utils: Utils,\n Externals: Externals,\n Queue: Queue\n };\n\n static http = {\n Client: Client,\n ApiResponse: ApiResponse,\n Utils: HttpUtils\n };\n\n static platform = {\n Auth: Auth,\n Platform: Platform\n };\n\n static subscription = {\n Subscription: Subscription\n };\n\n static mocks = {\n Client: ClientMock,\n Registry: Registry,\n Mock: Mock\n };\n\n static pubnub = {\n PubnubMockFactory: PubnubMockFactory\n };\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/SDK.js\n **/","import {Promise} from './Externals.js';\n\n/**\n * TODO Replace with something better\n * @see https://github.com/joyent/node/blob/master/lib/querystring.js\n * @param {object} parameters\n * @returns {string}\n */\nexport function queryStringify(parameters) {\n\n var array = [];\n\n parameters = parameters || {};\n\n Object.keys(parameters).forEach((k) => {\n\n var v = parameters[k];\n\n if (isArray(v)) {\n v.forEach((vv) => {\n array.push(encodeURIComponent(k) + '=' + encodeURIComponent(vv));\n });\n } else {\n array.push(encodeURIComponent(k) + '=' + encodeURIComponent(v));\n }\n\n });\n\n return array.join('&');\n\n}\n\n/**\n * TODO Replace with something better\n * @see https://github.com/joyent/node/blob/master/lib/querystring.js\n * @param {string} queryString\n * @returns {object}\n */\nexport function parseQueryString(queryString) {\n\n var argsParsed = {};\n\n queryString.split('&').forEach((arg) => {\n\n arg = decodeURIComponent(arg);\n\n if (arg.indexOf('=') == -1) {\n\n argsParsed[arg.trim()] = true;\n\n } else {\n\n var pair = arg.split('='),\n key = pair[0].trim(),\n value = pair[1].trim();\n\n if (key in argsParsed) {\n if (key in argsParsed && !isArray(argsParsed[key])) argsParsed[key] = [argsParsed[key]];\n argsParsed[key].push(value);\n } else {\n argsParsed[key] = value;\n }\n\n }\n\n });\n\n return argsParsed;\n\n}\n\n/**\n * @param obj\n * @return {boolean}\n */\nexport function isFunction(obj) {\n return typeof obj === \"function\";\n}\n\n/**\n * @param obj\n * @return {boolean}\n */\nexport function isArray(obj) {\n return Array.isArray ? Array.isArray(obj) : typeof obj === \"array\";\n}\n\n/**\n * @param fn\n * @param interval\n * @param timeout\n */\nexport function poll(fn, interval, timeout) { //NodeJS.Timer|number\n\n module.exports.stopPolling(timeout);\n\n interval = interval || 1000;\n\n var next = (delay) => {\n\n delay = delay || interval;\n\n interval = delay;\n\n return setTimeout(() => {\n\n fn(next, delay);\n\n }, delay);\n\n };\n\n return next();\n\n}\n\nexport function stopPolling(timeout) {\n if (timeout) clearTimeout(timeout);\n}\n\nexport function isNodeJS() {\n return (typeof process !== 'undefined');\n}\n\nexport function isBrowser() {\n return (typeof window !== 'undefined');\n}\n\nexport function delay(timeout) {\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n resolve(null);\n }, timeout);\n });\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Utils.js\n **/","import ES6Promise from 'es6-promise';\nimport nodeFetch from 'node-fetch';\nimport pubnub from 'pubnub';\n\nvar root = (new Function('return this'))();\n\nexport var Promise = (ES6Promise && ES6Promise.Promise) || root.Promise;\n\nexport var fetch = root.fetch || nodeFetch;\nexport var Request = root.Request || fetch.Request;\nexport var Response = root.Response || fetch.Response;\nexport var Headers = root.Headers || fetch.Headers;\n\nexport var PUBNUB = root.PUBNUB || pubnub;\n\nexport var localStorage = (typeof root.localStorage !== 'undefined') ? root.localStorage : {};\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Externals.js\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_4__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external {\"commonjs\":\"es6-promise\",\"commonjs2\":\"es6-promise\"}\n ** module id = 4\n ** module chunks = 0\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_5__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external {\"commonjs\":\"node-fetch\",\"commonjs2\":\"node-fetch\"}\n ** module id = 5\n ** module chunks = 0\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_6__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external {\"commonjs\":\"pubnub\",\"commonjs2\":\"pubnub\",\"amd\":\"pubnub\"}\n ** module id = 6\n ** module chunks = 0\n **/","export default class Cache {\n\n static defaultPrefix = 'rc-';\n\n constructor(storage, prefix) {\n this.setPrefix(prefix);\n this._storage = storage;\n }\n\n setPrefix(prefix) {\n this._prefix = prefix || Cache.defaultPrefix;\n return this;\n }\n\n setItem(key, data) {\n this._storage[this._prefixKey(key)] = JSON.stringify(data);\n return this;\n }\n\n removeItem(key) {\n delete this._storage[this._prefixKey(key)];\n return this;\n }\n\n getItem(key) {\n var item = this._storage[this._prefixKey(key)];\n if (!item) return null;\n return JSON.parse(item);\n }\n\n clean() {\n\n for (var key in this._storage) {\n\n if (!this._storage.hasOwnProperty(key)) continue;\n\n if (key.indexOf(this._prefix) === 0) {\n delete this._storage[key];\n }\n\n }\n\n return this;\n\n }\n\n _prefixKey(key) {\n return this._prefix + key;\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Cache.js\n **/","export default class Observable {\n\n constructor() {\n this.off();\n }\n\n hasListeners(event) {\n return (event in this._listeners);\n }\n\n on(events, callback) {\n\n if (typeof events == 'string') events = [events];\n if (!events) throw new Error('No events to subscribe to');\n if (typeof callback !== 'function') throw new Error('Callback must be a function');\n\n events.forEach((event) => {\n\n if (!this.hasListeners(event)) this._listeners[event] = [];\n\n this._listeners[event].push(callback);\n\n });\n\n return this;\n\n }\n\n emit(event, ...args) {\n\n var result = null;\n\n if (!this.hasListeners(event)) return null;\n\n this._listeners[event].some((callback) => {\n\n result = callback.apply(this, args);\n return (result === false);\n\n });\n\n return result;\n\n }\n\n off(event, callback) {\n\n if (!event) {\n\n this._listeners = {};\n\n } else {\n\n if (!callback) {\n\n delete this._listeners[event];\n\n } else {\n\n if (!this.hasListeners(event)) return this;\n\n this._listeners[event].forEach((cb, i) => {\n\n if (cb === callback) delete this._listeners[event][i];\n\n });\n\n }\n\n }\n\n return this;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Observable.js\n **/","import {Promise} from '../core/Externals';\nimport {poll, stopPolling} from './Utils';\n\nexport default class Queue {\n\n static _pollInterval = 250;\n static _releaseTimeout = 5000;\n\n constructor(cache, cacheId) {\n\n this._cache = cache;\n this._cacheId = cacheId;\n this._promise = null;\n\n }\n\n isPaused() {\n\n var time = this._cache.getItem(this._cacheId);\n\n return !!time && Date.now() - parseInt(time) < Queue._releaseTimeout;\n }\n\n pause() {\n this._cache.setItem(this._cacheId, Date.now());\n return this;\n }\n\n resume() {\n this._cache.removeItem(this._cacheId);\n return this;\n }\n\n poll() {\n\n if (this._promise) return this._promise;\n\n this._promise = new Promise((resolve, reject) => {\n\n poll((next) => {\n\n if (this.isPaused()) return next();\n\n this._promise = null;\n\n this.resume(); // this is actually not needed but why not\n\n resolve(null);\n\n }, Queue._pollInterval);\n\n });\n\n return this._promise;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Queue.js\n **/","import {fetch, Request, Response, Headers, Promise} from '../core/Externals';\nimport {queryStringify} from '../core/Utils';\nimport {findHeaderName} from './Utils';\nimport Observable from '../core/Observable';\nimport ApiResponse from './ApiResponse';\n\nexport default class Client extends Observable {\n\n static _allowedMethods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'];\n\n events = {\n beforeRequest: 'beforeRequest',\n requestSuccess: 'requestSuccess',\n requestError: 'requestError'\n };\n\n /**\n * @param {Request} request\n * @return {Promise}\n */\n async sendRequest(request) {\n\n var apiResponse = new ApiResponse(request);\n\n try {\n\n //TODO Stop request if listeners return false\n this.emit(this.events.beforeRequest, apiResponse);\n\n apiResponse._response = await this._loadResponse(request);\n\n if (apiResponse._isMultipart() || apiResponse._isJson()) {\n apiResponse._text = await apiResponse.response().text();\n }\n\n if (!apiResponse.ok()) throw new Error('Response has unsuccessful status');\n\n this.emit(this.events.requestSuccess, apiResponse);\n\n return apiResponse;\n\n } catch (e) {\n\n if (!e.apiResponse) e = this.makeError(e, apiResponse);\n\n this.emit(this.events.requestError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @param {Request} request\n * @return {Promise}\n * @private\n */\n async _loadResponse(request) {\n return await fetch.call(null, request);\n }\n\n /**\n * Wraps the JS Error object with transaction information\n * @param {Error|IApiError} e\n * @param {ApiResponse} apiResponse\n * @return {IApiError}\n */\n makeError(e, apiResponse) {\n\n // Wrap only if regular error\n if (!e.hasOwnProperty('apiResponse') && !e.hasOwnProperty('originalMessage')) {\n\n e.apiResponse = apiResponse;\n e.originalMessage = e.message;\n e.message = (apiResponse && apiResponse.error(true)) || e.originalMessage;\n\n }\n\n return e;\n\n }\n\n /**\n *\n * @param {object} init\n * @param {object} [init.url]\n * @param {object} [init.body]\n * @param {string} [init.method]\n * @param {object} [init.query]\n * @param {object} [init.headers]\n * @return {Request}\n */\n createRequest(init) {\n\n init = init || {};\n init.headers = init.headers || {};\n\n // Sanity checks\n if (!init.url) throw new Error('Url is not defined');\n if (!init.method) init.method = 'GET';\n if (init.method && Client._allowedMethods.indexOf(init.method) < 0) throw new Error('Method has wrong value: ' + init.method);\n\n // Defaults\n init.credentials = init.credentials || 'include';\n init.mode = init.mode || 'cors';\n\n // Append Query String\n if (init.query) {\n init.url = init.url + (init.url.indexOf('?') > -1 ? '&' : '?') + queryStringify(init.query);\n }\n\n if (!(findHeaderName('Accept', init.headers))) {\n init.headers['Accept'] = ApiResponse._jsonContentType;\n }\n\n // Serialize body\n //TODO Check that body is a plain object\n if (typeof init.body !== 'string' || !init.body) {\n\n var contentTypeHeaderName = findHeaderName(ApiResponse._contentType, init.headers);\n\n if (!contentTypeHeaderName) {\n contentTypeHeaderName = ApiResponse._contentType;\n init.headers[contentTypeHeaderName] = ApiResponse._jsonContentType;\n }\n\n var contentType = init.headers[contentTypeHeaderName];\n\n // Assign a new encoded body\n if (contentType.indexOf(ApiResponse._jsonContentType) > -1) {\n init.body = JSON.stringify(init.body);\n } else if (contentType.indexOf(ApiResponse._urlencodedContentType) > -1) {\n init.body = queryStringify(init.body);\n }\n\n }\n\n // Create a request with encoded body\n var req = new Request(init.url, init);\n\n // Keep the original body accessible directly (for mocks)\n req.originalBody = init.body;\n\n return req;\n\n }\n\n}\n\n/**\n * @name IApiError\n * @property {string} stack\n * @property {string} originalMessage\n * @property {ApiResponse} apiResponse\n */\n\n\n/** WEBPACK FOOTER **\n ** ./src/http/Client.js\n **/","import {fetch, Request, Response, Headers, Promise} from '../core/Externals';\nimport * as utils from '../core/Utils';\n\n/**\n * Creates a response\n * @param stringBody\n * @param init\n * @return {Response}\n */\nexport function createResponse(stringBody, init) {\n\n init = init || {};\n\n var response = new Response(stringBody, init);\n\n //TODO Wait for https://github.com/bitinn/node-fetch/issues/38\n if (utils.isNodeJS()) {\n\n response._text = stringBody;\n response._decode = function() {\n return this._text;\n };\n\n }\n\n return response;\n\n}\n\nexport function findHeaderName(name, headers) {\n name = name.toLowerCase();\n return Object.keys(headers).reduce(function(res, key) {\n if (res) return res;\n if (name == key.toLowerCase()) return key;\n return res;\n }, null);\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/http/Utils.js\n **/","import {fetch, Request, Response, Headers, Promise} from '../core/Externals';\nimport * as utils from './Utils';\n\nexport default class ApiResponse {\n\n static _contentType = 'Content-Type';\n static _jsonContentType = 'application/json';\n static _multipartContentType = 'multipart/mixed';\n static _urlencodedContentType = 'application/x-www-form-urlencoded';\n static _headerSeparator = ':';\n static _bodySeparator = '\\n\\n';\n static _boundarySeparator = '--';\n\n /**\n * @param {Request} request\n * @param {Response} response\n * @param {string} responseText\n */\n constructor(request, response, responseText) {\n\n /** @type {Request} */\n this._request = request;\n\n /** @type {Response} */\n this._response = response;\n\n this._text = responseText;\n this._json = null;\n this._multipart = [];\n\n }\n\n /**\n * @return {Response}\n */\n response() {\n return this._response;\n }\n\n /**\n * @return {Request}\n */\n request() {\n return this._request;\n }\n\n /**\n * @return {boolean}\n */\n ok() {\n return this._response && this._response.ok;\n }\n\n /**\n * @return {string}\n */\n text() {\n if (!this._isJson() && !this._isMultipart()) throw new Error('Response is not text');\n return this._text;\n }\n\n /**\n * @return {object}\n */\n json() {\n if (!this._isJson()) throw new Error('Response is not JSON');\n if (!this._json) {\n this._json = this._text ? JSON.parse(this._text) : null;\n }\n return this._json;\n }\n\n /**\n * @param [skipOKCheck]\n * @return {string}\n */\n error(skipOKCheck) {\n\n if (this.ok() && !skipOKCheck) return null;\n\n var message = (this._response && this._response.status ? this._response.status + ' ' : '') +\n (this._response && this._response.statusText ? this._response.statusText : '');\n\n try {\n\n if (this.json().message) message = this.json().message;\n if (this.json().error_description) message = this.json().error_description;\n if (this.json().description) message = this.json().description;\n\n } catch (e) {}\n\n return message;\n\n }\n\n /**\n * @return {ApiResponse[]}\n */\n multipart() {\n\n if (!this._isMultipart()) throw new Error('Response is not multipart');\n\n if (!this._multipart.length) {\n\n // Step 1. Split multipart response\n\n var text = this.text();\n\n if (!text) throw new Error('No response body');\n\n var boundary = this._getContentType().match(/boundary=([^;]+)/i)[1];\n\n if (!boundary) throw new Error('Cannot find boundary');\n\n var parts = text.toString().split(ApiResponse._boundarySeparator + boundary);\n\n if (parts[0].trim() === '') parts.shift();\n if (parts[parts.length - 1].trim() == ApiResponse._boundarySeparator) parts.pop();\n\n if (parts.length < 1) throw new Error('No parts in body');\n\n // Step 2. Parse status info\n\n var statusInfo = ApiResponse.create(parts.shift(), this._response.status, this._response.statusText).json();\n\n // Step 3. Parse all other parts\n\n this._multipart = parts.map((part:string, i) => {\n\n var status = statusInfo.response[i].status;\n\n return ApiResponse.create(part, status);\n\n });\n\n }\n\n return this._multipart;\n\n }\n\n _isContentType(contentType) {\n return this._getContentType().indexOf(contentType) > -1;\n }\n\n _getContentType() {\n return this._response.headers.get(ApiResponse._contentType) || '';\n }\n\n _isMultipart() {\n return this._isContentType(ApiResponse._multipartContentType);\n }\n\n _isUrlEncoded() {\n return this._isContentType(ApiResponse._urlencodedContentType);\n }\n\n _isJson() {\n return this._isContentType(ApiResponse._jsonContentType);\n }\n\n /**\n * Method is used to create ApiResponse object from string parts of multipart/mixed response\n * @param {string} [text]\n * @param {number} [status]\n * @param {string} [statusText]\n * @return {ApiResponse}\n */\n static create(text, status, statusText) {\n\n text = text || '';\n status = status || 200;\n statusText = statusText || 'OK';\n\n text = text.replace(/\\r/g, '');\n\n var headers = new Headers(),\n headersAndBody = text.split(ApiResponse._bodySeparator),\n headersText = (headersAndBody.length > 1) ? headersAndBody.shift() : '';\n\n text = headersAndBody.join(ApiResponse._bodySeparator);\n\n (headersText || '')\n .split('\\n')\n .forEach((header:string) => {\n\n var split = header.trim().split(ApiResponse._headerSeparator),\n key = split.shift().trim(),\n value = split.join(ApiResponse._headerSeparator).trim();\n\n if (key) headers.append(key, value);\n\n });\n\n return new ApiResponse(null, utils.createResponse(text, {\n headers: headers,\n status: status,\n statusText: statusText\n }), text);\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/http/ApiResponse.js\n **/","import Registry from './Registry';\nimport {default as HttpClient} from '../http/Client';\n\nexport default class Client extends HttpClient {\n\n constructor() {\n super();\n this._registry = new Registry();\n }\n\n registry() {\n return this._registry;\n }\n\n async _loadResponse(request) {\n\n var mock = this._registry.find(request);\n\n return await mock.getResponse(request);\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/mocks/ClientMock.js\n **/","import Mock from './Mock';\n\nexport default class Registry {\n\n constructor() {\n this._mocks = [];\n }\n\n add(mock) {\n this._mocks.push(mock);\n return this;\n }\n\n clear() {\n this._mocks = [];\n return this;\n }\n\n find(request) {\n\n //console.log('Registry is looking for', request);\n\n var mock = this._mocks.shift();\n\n if (!mock) throw new Error('No mock in registry for request ' + request.method + ' ' + request.url);\n\n if (!mock.test(request)) throw new Error('Wrong request ' + request.method + ' ' + request.url +\n ' for expected mock ' + mock.method() + ' ' + mock.path());\n\n return mock;\n\n }\n\n apiCall(method:string, path:string, response:any, status, statusText) {\n\n this.add(new Mock(method, path, response, status, statusText));\n\n return this;\n\n }\n\n authentication() {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'access_token': 'ACCESS_TOKEN',\n 'token_type': 'bearer',\n 'expires_in': 3600,\n 'refresh_token': 'REFRESH_TOKEN',\n 'refresh_token_expires_in': 60480,\n 'scope': 'SMS RCM Foo Boo',\n 'expireTime': new Date().getTime() + 3600000\n });\n\n return this;\n\n }\n\n logout() {\n\n this.apiCall('POST', '/restapi/oauth/revoke', {});\n\n return this;\n\n }\n\n presenceLoad(id) {\n\n this.apiCall('GET', '/restapi/v1.0/account/~/extension/' + id + '/presence', {\n \"uri\": \"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/\" + id + \"/presence\",\n \"extension\": {\n \"uri\": \"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/\" + id,\n \"id\": id,\n \"extensionNumber\": \"101\"\n },\n \"activeCalls\": [],\n \"presenceStatus\": \"Available\",\n \"telephonyStatus\": \"Ringing\",\n \"userStatus\": \"Available\",\n \"dndStatus\": \"TakeAllCalls\",\n \"extensionId\": id\n });\n\n return this;\n\n }\n\n subscribeGeneric(expiresIn) {\n\n expiresIn = expiresIn || 15 * 60 * 60;\n\n var date = new Date();\n\n this.apiCall('POST', '/restapi/v1.0/subscription', {\n 'eventFilters': [\n '/restapi/v1.0/account/~/extension/~/presence'\n ],\n 'expirationTime': new Date(date.getTime() + (expiresIn * 1000)).toISOString(),\n 'expiresIn': expiresIn,\n 'deliveryMode': {\n 'transportType': 'PubNub',\n 'encryption': false,\n 'address': '123_foo',\n 'subscriberKey': 'sub-c-foo',\n 'secretKey': 'sec-c-bar'\n },\n 'id': 'foo-bar-baz',\n 'creationTime': date.toISOString(),\n 'status': 'Active',\n 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz'\n });\n\n return this;\n\n }\n\n subscribeOnPresence(id, detailed) {\n\n id = id || '1';\n\n var date = new Date();\n\n this.apiCall('POST', '/restapi/v1.0/subscription', {\n 'eventFilters': ['/restapi/v1.0/account/~/extension/' + id + '/presence' + (detailed ? '?detailedTelephonyState=true' : '')],\n 'expirationTime': new Date(date.getTime() + (15 * 60 * 60 * 1000)).toISOString(),\n 'deliveryMode': {\n 'transportType': 'PubNub',\n 'encryption': true,\n 'address': '123_foo',\n 'subscriberKey': 'sub-c-foo',\n 'secretKey': 'sec-c-bar',\n 'encryptionAlgorithm': 'AES',\n 'encryptionKey': 'VQwb6EVNcQPBhE/JgFZ2zw=='\n },\n 'creationTime': date.toISOString(),\n 'id': 'foo-bar-baz',\n 'status': 'Active',\n 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz'\n });\n\n return this;\n\n }\n\n tokenRefresh(failure) {\n\n if (!failure) {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'access_token': 'ACCESS_TOKEN_FROM_REFRESH',\n 'token_type': 'bearer',\n 'expires_in': 3600,\n 'refresh_token': 'REFRESH_TOKEN_FROM_REFRESH',\n 'refresh_token_expires_in': 60480,\n 'scope': 'SMS RCM Foo Boo'\n });\n\n } else {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'message': 'Wrong token',\n 'error_description': 'Wrong token',\n 'description': 'Wrong token'\n }, 400);\n\n }\n\n return this;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/mocks/Registry.js\n **/","import ApiResponse from '../http/ApiResponse';\nimport {delay} from '../core/Utils';\nimport {createResponse} from '../http/Utils';\n\nexport default class Mock {\n\n constructor(method, path, json, status, statusText, delay) {\n this._method = method.toUpperCase();\n this._path = path;\n this._json = json || {};\n this._delay = delay || 10;\n this._status = status || 200;\n this._statusText = statusText || 'OK';\n }\n\n path() {\n return this._path;\n }\n\n method() {\n return this._method;\n }\n\n test(request:Request) {\n\n return request.url.indexOf(this._path) > -1 &&\n request.method.toUpperCase() == this._method;\n\n }\n\n async getResponse(request) {\n\n await delay(this._delay);\n\n return this.createResponse(this._json);\n\n }\n\n createResponse(json, init) {\n\n init = init || {};\n\n init.status = init.status || this._status;\n init.statusText = init.statusText || this._statusText;\n\n var str = JSON.stringify(json),\n res = createResponse(str, init);\n\n res.headers.set(ApiResponse._contentType, ApiResponse._jsonContentType);\n\n return res;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/mocks/Mock.js\n **/","import Observable from '../core/Observable';\nimport Queue from '../core/Queue';\nimport Auth from './Auth';\nimport {Promise} from '../core/Externals';\nimport {queryStringify, parseQueryString, delay} from '../core/Utils';\n\nexport default class Platform extends Observable {\n\n static _urlPrefix = '/restapi';\n static _apiVersion = 'v1.0';\n static _accessTokenTtl = null; // Platform server by default sets it to 60 * 60 = 1 hour\n static _refreshTokenTtl = 10 * 60 * 60; // 10 hours\n static _refreshTokenTtlRemember = 7 * 24 * 60 * 60; // 1 week\n static _tokenEndpoint = '/restapi/oauth/token';\n static _revokeEndpoint = '/restapi/oauth/revoke';\n static _authorizeEndpoint = '/restapi/oauth/authorize';\n static _refreshDelayMs = 100;\n static _cacheId = 'platform';\n static _clearCacheOnRefreshError = true;\n\n events = {\n beforeLogin: 'beforeLogin',\n loginSuccess: 'loginSuccess',\n loginError: 'loginError',\n beforeRefresh: 'beforeRefresh',\n refreshSuccess: 'refreshSuccess',\n refreshError: 'refreshError',\n beforeLogout: 'beforeLogout',\n logoutSuccess: 'logoutSuccess',\n logoutError: 'logoutError'\n };\n\n constructor(client, cache, server, appKey, appSecret) {\n\n super();\n\n this._server = server;\n this._appKey = appKey;\n this._appSecret = appSecret;\n\n /** @type {Cache} */\n this._cache = cache;\n\n /** @type {Client} */\n this._client = client;\n\n this._queue = new Queue(this._cache, Platform._cacheId + '-refresh');\n\n this._auth = new Auth(this._cache, Platform._cacheId);\n\n }\n\n /**\n * @return {Auth}\n */\n auth() {\n return this._auth;\n }\n\n /**\n * @return {Client}\n */\n client() {\n return this._client;\n }\n\n /**\n * @param {string} path\n * @param {object} [options]\n * @param {boolean} [options.addServer]\n * @param {string} [options.addMethod]\n * @param {boolean} [options.addToken]\n * @return {string}\n */\n createUrl(path, options) {\n\n path = path || '';\n options = options || {};\n\n var builtUrl = '',\n hasHttp = path.indexOf('http://') != -1 || path.indexOf('https://') != -1;\n\n if (options.addServer && !hasHttp) builtUrl += this._server;\n\n if (path.indexOf(Platform._urlPrefix) == -1 && !hasHttp) builtUrl += Platform._urlPrefix + '/' + Platform._apiVersion;\n\n builtUrl += path;\n\n if (options.addMethod || options.addToken) builtUrl += (path.indexOf('?') > -1 ? '&' : '?');\n\n if (options.addMethod) builtUrl += '_method=' + options.addMethod;\n if (options.addToken) builtUrl += (options.addMethod ? '&' : '') + 'access_token=' + this._auth.accessToken();\n\n return builtUrl;\n\n }\n\n /**\n * @param {string} options.redirectUri\n * @param {string} options.state\n * @param {string} options.brandId\n * @param {string} options.display\n * @param {string} options.prompt\n * @return {string}\n */\n authUrl(options) {\n\n options = options || {};\n\n return this.createUrl(Platform._authorizeEndpoint + '?' + queryStringify({\n 'response_type': 'code',\n 'redirect_uri': options.redirectUri || '',\n 'client_id': this._appKey,\n 'state': options.state || '',\n 'brand_id': options.brandId || '',\n 'display': options.display || '',\n 'prompt': options.prompt || ''\n }), {addServer: true})\n\n }\n\n /**\n * @param {string} url\n * @return {Object}\n */\n parseAuthRedirectUrl(url:string) {\n\n var qs = parseQueryString(url.split('?').reverse()[0]),\n error = qs.error_description || qs.error;\n\n if (error) {\n var e = new Error(error);\n e.error = qs.error;\n throw e;\n }\n\n return qs;\n\n }\n\n /**\n * @return {Promise}\n */\n async loggedIn() {\n\n try {\n await this._ensureAuthentication();\n return true;\n } catch (e) {\n return false;\n }\n\n }\n\n /**\n * @param {string} options.username\n * @param {string} options.password\n * @param {string} options.extension\n * @param {string} options.code\n * @param {string} options.redirectUri\n * @param {string} options.endpointId\n * @returns {Promise}\n */\n async login(options) {\n\n try {\n\n options = options || {};\n\n options.remember = options.remember || false;\n\n this.emit(this.events.beforeLogin);\n\n var body = {\n \"access_token_ttl\": Platform._accessTokenTtl,\n \"refresh_token_ttl\": options.remember ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl\n };\n\n if (!options.code) {\n\n body.grant_type = 'password';\n body.username = options.username;\n body.password = options.password;\n body.extension = options.extension || '';\n\n } else if (options.code) {\n\n body.grant_type = 'authorization_code';\n body.code = options.code;\n body.redirect_uri = options.redirectUri;\n //body.client_id = this.getCredentials().key; // not needed\n\n }\n\n if (options.endpointId) body.endpoint_id = options.endpointId;\n\n var apiResponse = await this._tokenRequest(Platform._tokenEndpoint, body),\n json = apiResponse.json();\n\n this._auth\n .setData(json)\n .setRemember(options.remember);\n\n this.emit(this.events.loginSuccess, apiResponse);\n\n return apiResponse;\n\n } catch (e) {\n\n this._cache.clean();\n\n this.emit(this.events.loginError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n async refresh() {\n\n try {\n\n this.emit(this.events.beforeRefresh);\n\n if (this._queue.isPaused()) {\n\n await this._queue.poll();\n\n if (!this._isAccessTokenValid()) {\n throw new Error('Automatic authentification timeout');\n }\n\n this.emit(this.events.refreshSuccess, null);\n\n return null;\n\n }\n\n this._queue.pause();\n\n // Make sure all existing AJAX calls had a chance to reach the server\n await delay(Platform._refreshDelayMs);\n\n // Perform sanity checks\n if (!this._auth.refreshToken()) throw new Error('Refresh token is missing');\n if (!this._auth.refreshTokenValid()) throw new Error('Refresh token has expired');\n if (!this._queue.isPaused()) throw new Error('Queue was resumed before refresh call');\n\n /** @type {ApiResponse} */\n var res = await this._tokenRequest(Platform._tokenEndpoint, {\n \"grant_type\": \"refresh_token\",\n \"refresh_token\": this._auth.refreshToken(),\n \"access_token_ttl\": Platform._accessTokenTtl,\n \"refresh_token_ttl\": this._auth.remember() ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl\n }),\n json = res.json();\n\n if (!json.access_token) {\n throw this._client.makeError(new Error('Malformed OAuth response'), res);\n }\n\n this._auth.setData(json);\n this._queue.resume();\n\n this.emit(this.events.refreshSuccess, res);\n\n return res;\n\n } catch (e) {\n\n e = this._client.makeError(e);\n\n if (Platform._clearCacheOnRefreshError) {\n this._cache.clean();\n }\n\n this.emit(this.events.refreshError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n async logout() {\n\n try {\n\n this.emit(this.events.beforeLogout);\n\n this._queue.pause();\n\n var res = await this._tokenRequest(Platform._revokeEndpoint, {\n token: this._auth.accessToken()\n });\n\n this._queue.resume();\n this._cache.clean();\n\n this.emit(this.events.logoutSuccess, res);\n\n return res;\n\n } catch (e) {\n\n this._queue.resume();\n\n this.emit(this.events.logoutError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @param {Request} request\n * @param {object} [options]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async inflateRequest(request, options) {\n\n options = options || {};\n\n if (options.skipAuthCheck) return request;\n\n await this._ensureAuthentication();\n\n request.headers.set('Authorization', this._authHeader());\n //request.url = this.createUrl(request.url, {addServer: true}); //FIXME Spec prevents this...\n\n //TODO Add User-Agent here\n\n return request;\n\n }\n\n /**\n * @param {Request} request\n * @param {object} [options]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async sendRequest(request, options) {\n\n try {\n\n request = await this.inflateRequest(request, options);\n\n return (await this._client.sendRequest(request));\n\n } catch (e) {\n\n // Guard is for errors that come from polling\n if (!e.apiResponse || !e.apiResponse.response() || (e.apiResponse.response().status != 401)) throw e;\n\n this._auth.cancelAccessToken();\n\n return (await this.sendRequest(request, options));\n\n }\n\n }\n\n /**\n * General purpose function to send anything to server\n * @param {string} options.url\n * @param {object} [options.body]\n * @param {string} [options.method]\n * @param {object} [options.query]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async send(options = {}) {\n\n //FIXME https://github.com/bitinn/node-fetch/issues/43\n options.url = this.createUrl(options.url, {addServer: true});\n\n return await this.sendRequest(this._client.createRequest(options), options);\n\n }\n\n /**\n * @param {string} url\n * @param {object} [query]\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async get(url, query, options) {\n options = options || {};\n options.method = 'GET';\n options.url = url;\n options.query = query;\n return await this.send(options);\n }\n\n /**\n * @param {string} url\n * @param {object} body\n * @param {object} [query]\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async post(url, body, query, options) {\n options = options || {};\n options.method = 'POST';\n options.url = url;\n options.query = query;\n options.body = body;\n return await this.send(options);\n }\n\n /**\n * @param {string} url\n * @param {object} [body]\n * @param {object} [query]\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async put(url, body, query, options) {\n options = options || {};\n options.method = 'PUT';\n options.url = url;\n options.query = query;\n options.body = body;\n return await this.send(options);\n }\n\n /**\n * @param {string} url\n * @param {string} [query]\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async 'delete'(url, query, options) {\n options = options || {};\n options.method = 'DELETE';\n options.url = url;\n options.query = query;\n return await this.send(options);\n }\n\n async _tokenRequest(path, body) {\n\n return await this.send({\n url: path,\n skipAuthCheck: true,\n body: body,\n method: 'POST',\n headers: {\n 'Authorization': 'Basic ' + this._apiKey(),\n 'Content-Type': 'application/x-www-form-urlencoded'\n }\n });\n\n }\n\n async _ensureAuthentication() {\n\n if (this._isAccessTokenValid()) return null;\n return await this.refresh();\n\n }\n\n _isAccessTokenValid() {\n\n return (this._auth.accessTokenValid() && !this._queue.isPaused());\n\n }\n\n _apiKey() {\n var apiKey = this._appKey + ':' + this._appSecret;\n return (typeof btoa == 'function') ? btoa(apiKey) : new Buffer(apiKey).toString('base64');\n }\n\n _authHeader() {\n var token = this._auth.accessToken();\n return this._auth.tokenType() + (token ? ' ' + token : '');\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/platform/Platform.js\n **/","export default class Auth {\n\n static refreshHandicapMs:number = 60 * 1000; // 1 minute\n static forcedTokenType = 'forced';\n\n constructor(cache, cacheId:string) {\n\n /** @type {Cache} */\n this._cache = cache;\n this._cacheId = cacheId;\n\n }\n\n accessToken() {\n return this.data().access_token;\n }\n\n refreshToken() {\n return this.data().refresh_token;\n }\n\n tokenType() {\n return this.data().token_type;\n }\n\n /**\n * @return {{token_type: string, access_token: string, expires_in: number, refresh_token: string, refresh_token_expires_in: number}}\n */\n data() {\n\n return this._cache.getItem(this._cacheId) || {\n token_type: '',\n access_token: '',\n expires_in: 0,\n refresh_token: '',\n refresh_token_expires_in: 0\n };\n\n }\n\n /**\n * @param {object} newData\n * @return {Auth}\n */\n setData(newData) {\n\n newData = newData || {};\n\n var data = this.data();\n\n Object.keys(newData).forEach((key) => {\n data[key] = newData[key];\n });\n\n data.expire_time = Date.now() + (data.expires_in * 1000);\n data.refresh_token_expire_time = Date.now() + (data.refresh_token_expires_in * 1000);\n\n this._cache.setItem(this._cacheId, data);\n\n return this;\n\n }\n\n /**\n * Check if there is a valid (not expired) access token\n * @return {boolean}\n */\n accessTokenValid() {\n\n var authData = this.data();\n return (authData.token_type === Auth.forcedTokenType || (authData.expire_time - Auth.refreshHandicapMs > Date.now()));\n\n }\n\n /**\n * Check if there is a valid (not expired) access token\n * @return {boolean}\n */\n refreshTokenValid() {\n\n return (this.data().refresh_token_expire_time > Date.now());\n\n }\n\n /**\n * @return {Auth}\n */\n cancelAccessToken() {\n\n return this.setData({\n access_token: '',\n expires_in: 0\n });\n\n }\n\n /**\n * This method sets a special authentication mode used in Service Web\n * @return {Auth}\n */\n forceAuthentication() {\n\n this.setData({\n token_type: Auth.forcedTokenType,\n access_token: '',\n expires_in: 0,\n refresh_token: '',\n refresh_token_expires_in: 0\n });\n\n return this;\n\n }\n\n /**\n * @param remember\n * @return {Auth}\n */\n setRemember(remember) {\n\n return this.setData({remember: remember});\n\n }\n\n /**\n * @return {boolean}\n */\n remember() {\n\n return !!this.data().remember;\n\n }\n\n}\n\n//export interface IAuthData {\n// remember?:boolean;\n// token_type?:string;\n// access_token?:string;\n// expires_in?:number; // actually it's string\n// expire_time?:number;\n// refresh_token?:string;\n// refresh_token_expires_in?:number; // actually it's string\n// refresh_token_expire_time?:number;\n// scope?:string;\n//}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/platform/Auth.js\n **/","import PubnubMock from './PubnubMock.js';\nimport {PUBNUB} from '../core/Externals';\n\nexport default class PubnubMockFactory {\n\n constructor() {\n this.crypto_obj = PUBNUB.crypto_obj;\n }\n\n init(options:PUBNUBInitOptions) {\n return new PubnubMock(options);\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/pubnub/PubnubFactory.js\n **/","import Observable from '../core/Observable';\nimport {PUBNUB} from '../core/Externals';\n\nexport default class PubnubMock extends Observable {\n\n constructor(options) {\n super();\n this.options = options;\n this.crypto_obj = PUBNUB.crypto_obj;\n }\n\n ready() {}\n\n subscribe(options:PUBNUBSubscribeOptions) {\n this.on('message-' + options.channel, options.message);\n }\n\n unsubscribe(options:PUBNUBUnsubscribeOptions) {\n this.off('message-' + options.channel);\n }\n\n receiveMessage(msg, channel) {\n this.emit('message-' + channel, msg, 'env', channel);\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/pubnub/PubnubMock.js\n **/","import Observable from '../core/Observable';\nimport Client from '../http/Client';\nimport {poll, stopPolling, delay} from '../core/Utils';\n\nexport default class Subscription extends Observable {\n\n static _renewHandicapMs = 2 * 60 * 1000;\n static _pollInterval = 10 * 1000;\n\n events = {\n notification: 'notification',\n removeSuccess: 'removeSuccess',\n removeError: 'removeError',\n renewSuccess: 'renewSuccess',\n renewError: 'renewError',\n subscribeSuccess: 'subscribeSuccess',\n subscribeError: 'subscribeError'\n };\n\n constructor(pubnubFactory, platform) {\n\n super();\n\n this._pubnubFactory = pubnubFactory;\n this._platform = platform;\n this._pubnub = null;\n this._timeout = null;\n this._subscription = {};\n\n }\n\n subscribed(){\n\n return !!(this._subscription.id &&\n this._subscription.deliveryMode &&\n this._subscription.deliveryMode.subscriberKey &&\n this._subscription.deliveryMode.address);\n\n }\n\n /**\n * @return {boolean}\n */\n alive() {\n\n return this.subscribed() && Date.now() < this.expirationTime();\n\n }\n\n expirationTime() {\n return new Date(this._subscription.expirationTime || 0).getTime() - Subscription._renewHandicapMs;\n }\n\n setSubscription(subscription) {\n\n subscription = subscription || {};\n\n this._clearTimeout();\n\n this._subscription = subscription;\n\n if (!this._pubnub) this._subscribeAtPubnub();\n\n this._setTimeout();\n\n return this;\n\n }\n\n subscription() {\n return this._subscription;\n }\n\n /**\n * Creates or updates subscription if there is an active one\n * @returns {Promise}\n */\n async register() {\n\n if (this.alive()) {\n return await this.renew();\n } else {\n return await this.subscribe();\n }\n\n }\n\n eventFilters() {\n return this._subscription.eventFilters || [];\n }\n\n /**\n * @param {string[]} events\n * @return {Subscription}\n */\n addEventFilters(events) {\n this.setEventFilters(this.eventFilters().concat(events));\n return this;\n }\n\n /**\n * @param {string[]} events\n * @return {Subscription}\n */\n setEventFilters(events) {\n this._subscription.eventFilters = events;\n return this;\n }\n\n /**\n * @returns {Promise}\n */\n async subscribe() {\n\n try {\n\n this._clearTimeout();\n\n if (!this.eventFilters().length) throw new Error('Events are undefined');\n\n var response = await this._platform.post('/restapi/v1.0/subscription', {\n eventFilters: this._getFullEventFilters(),\n deliveryMode: {\n transportType: 'PubNub'\n }\n }),\n json = response.json();\n\n this.setSubscription(json)\n .emit(this.events.subscribeSuccess, response);\n\n return response;\n\n\n } catch (e) {\n\n e = this._platform.client().makeError(e);\n\n this.reset()\n .emit(this.events.subscribeError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n async renew() {\n\n try {\n\n this._clearTimeout();\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n if (!this.eventFilters().length) throw new Error('Events are undefined');\n\n var response = await this._platform.put('/restapi/v1.0/subscription/' + this._subscription.id, {\n eventFilters: this._getFullEventFilters()\n });\n\n var json = response.json();\n\n this.setSubscription(json)\n .emit(this.events.renewSuccess, response);\n\n return response;\n\n } catch (e) {\n\n e = this._platform.client().makeError(e);\n\n this.reset()\n .emit(this.events.renewError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n async remove() {\n\n try {\n\n if (!this.subscribed()) throw new Error('No subscription');\n\n var response = await this._platform.delete('/restapi/v1.0/subscription/' + this._subscription.id);\n\n this.reset()\n .emit(this.events.removeSuccess, response);\n\n return response;\n\n } catch (e) {\n\n e = this._platform.client().makeError(e);\n\n this.emit(this.events.removeError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n resubscribe() {\n\n return this.reset().setEventFilters(this.eventFilters()).subscribe();\n\n }\n\n /**\n * Remove subscription and disconnect from PUBNUB\n * This method resets subscription at client side but backend is not notified\n */\n reset() {\n this._clearTimeout();\n if (this.subscribed() && this._pubnub) this._pubnub.unsubscribe({channel: this._subscription.deliveryMode.address});\n this._subscription = {};\n return this;\n }\n\n _getFullEventFilters() {\n\n return this.eventFilters().map((event) => {\n return this._platform.createUrl(event);\n });\n\n }\n\n _setTimeout() {\n\n this._clearTimeout();\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n poll((next)=> {\n\n if (this.alive()) return next();\n\n this.renew();\n\n }, Subscription._pollInterval, this._timeout);\n\n return this;\n\n }\n\n _clearTimeout() {\n\n stopPolling(this._timeout);\n\n return this;\n\n }\n\n _decrypt(message:any) {\n\n if (!this.subscribed()) throw new Error('No subscription');\n\n if (this._subscription.deliveryMode.encryptionKey) {\n\n var PUBNUB = this._pubnubFactory;\n\n message = PUBNUB.crypto_obj.decrypt(message, this._subscription.deliveryMode.encryptionKey, {\n encryptKey: false,\n keyEncoding: 'base64',\n keyLength: 128,\n mode: 'ecb'\n });\n\n }\n\n return message;\n\n }\n\n _notify(message:any) {\n\n this.emit(this.events.notification, this._decrypt(message));\n\n return this;\n\n }\n\n _subscribeAtPubnub():Subscription {\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n var PUBNUB = this._pubnubFactory;\n\n this._pubnub = PUBNUB.init({\n ssl: true,\n subscribe_key: this._subscription.deliveryMode.subscriberKey\n });\n\n this._pubnub.ready();\n\n this._pubnub.subscribe({\n channel: this._subscription.deliveryMode.address,\n message: this._notify.bind(this),\n connect: () => {}\n });\n\n return this;\n\n }\n\n}\n\n//export interface ISubscription {\n// id?:string;\n// uri?: string;\n// eventFilters?:string[];\n// expirationTime?:string; // 2014-03-12T19:54:35.613Z\n// expiresIn?:number;\n// deliveryMode?: {\n// transportType?:string;\n// encryption?:boolean;\n// address?:string;\n// subscriberKey?:string;\n// encryptionKey?:string;\n// secretKey?:string;\n// };\n// creationTime?:string; // 2014-03-12T19:54:35.613Z\n// status?:string; // Active\n//}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/subscription/Subscription.js\n **/","import Subscription from './Subscription';\nimport Queue from '../core/Queue';\n\nexport default class CachedSubscription extends Subscription {\n\n constructor(pubnubFactory, platform, cache, cacheKey) {\n\n super(pubnubFactory, platform);\n\n this._cache = cache;\n this._cacheKey = cacheKey;\n this._renewQueue = new Queue(this._cache, cacheKey + '-renew');\n this._resubscribeQueue = new Queue(this._cache, cacheKey + '-resubscribe');\n\n this.events = {\n ...this.events,\n queuedRenewSuccess: 'queuedRenewSuccess',\n queuedRenewError: 'queuedRenewError',\n queuedResubscribeSuccess: 'queuedResubscribeSuccess',\n queuedResubscribeError: 'queuedResubscribeError'\n };\n\n this.on(this.events.renewError, () => {\n this.resubscribe();\n });\n\n this.on([this.events.subscribeSuccess, this.events.renewSuccess], () => {\n this._cache.setItem(this._cacheKey, this.subscription());\n });\n\n this.on(this.events.removeSuccess, () => {\n this._cache.removeItem(this._cacheKey);\n });\n\n }\n\n /**\n * TODO Combine with Platform.refresh and move elsewhere\n * @param actionCb\n * @param queue\n * @param successEvent\n * @param errorEvent\n * @param errorMessage\n * @return {*}\n * @private\n */\n async _queue(actionCb, queue, successEvent, errorEvent, errorMessage) {\n\n try {\n\n if (queue.isPaused()) {\n\n await queue.poll();\n\n if (!this.alive()) {\n throw new Error(errorMessage);\n }\n\n this.emit(successEvent, null);\n\n return null;\n\n }\n\n queue.pause();\n\n var res = await actionCb.call(this);\n\n queue.resume();\n\n this.emit(successEvent, res);\n\n return res;\n\n } catch (e) {\n\n this.emit(errorEvent, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n renew() {\n\n return this._queue(\n super.renew,\n this._renewQueue,\n this.events.queuedRenewSuccess,\n this.events.queuedRenewError,\n 'Subscription is not alive after renew timeout'\n );\n\n }\n\n /**\n * @returns {Promise}\n */\n resubscribe() {\n\n return this._queue(\n super.resubscribe,\n this._resubscribeQueue,\n this.events.queuedResubscribeSuccess,\n this.events.queuedResubscribeError,\n 'Subscription is not alive after resubscribe timeout'\n );\n\n }\n\n /**\n * @param {string[]} events\n * @return {CachedSubscription}\n */\n restore(events) {\n\n var cachedSubscriptionData = this._cache.getItem(this._cacheKey);\n\n if (cachedSubscriptionData) {\n try {\n this.setSubscription(cachedSubscriptionData);\n } catch (e) {}\n } else {\n this.setEventFilters(events);\n }\n\n return this;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/subscription/CachedSubscription.js\n **/","/**\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 // This invoke function is written in a style that assumes some\n // calling function (or Promise) will handle exceptions.\n function invoke(method, arg) {\n var result = generator[method](arg);\n var value = result.value;\n return value instanceof AwaitArgument\n ? Promise.resolve(value.arg).then(invokeNext, invokeThrow)\n : 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 return result;\n });\n }\n\n if (typeof process === \"object\" && process.domain) {\n invoke = process.domain.bind(invoke);\n }\n\n var invokeNext = invoke.bind(generator, \"next\");\n var invokeThrow = invoke.bind(generator, \"throw\");\n var invokeReturn = invoke.bind(generator, \"return\");\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return invoke(method, arg);\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 ) : new Promise(function (resolve) {\n resolve(callInvokeWithMethodAndArg());\n });\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\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/regenerator/runtime.js\n ** module id = 22\n ** module chunks = 0\n **/"],"sourceRoot":""} \ No newline at end of file diff --git a/build/ringcentral.min.js b/build/ringcentral.min.js index ee8347b1..9ab5bc27 100644 --- a/build/ringcentral.min.js +++ b/build/ringcentral.min.js @@ -1,3 +1,3 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("es6-promise"),require("node-fetch"),require("pubnub")):"function"==typeof define&&define.amd?define([,,"pubnub"],t):"object"==typeof exports?exports.SDK=t(require("es6-promise"),require("node-fetch"),require("pubnub")):(e.RingCentral=e.RingCentral||{},e.RingCentral.SDK=t(e[void 0],e[void 0],e[void 0]))}(this,function(e,t,r){return function(e){function t(n){if(r[n])return r[n].exports;var o=r[n]={exports:{},id:n,loaded:!1};return e[n].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var r={};return t.m=e,t.c=r,t.p="/build/",t(0)}([function(e,t,r){e.exports=r(1)},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t["default"]=e,t}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var s=function(){function e(e,t){for(var r=0;r1?r-1:0),o=1;r>o;o++)n[o-1]=arguments[o];var i=null;return this.hasListeners(e)?(this._listeners[e].some(function(e){return i=e.apply(t,n),i===!1}),i):null},e.prototype.off=function(e,t){var r=this;if(e)if(t){if(!this.hasListeners(e))return this;this._listeners[e].forEach(function(n,o){n===t&&delete r._listeners[e][o]})}else delete this._listeners[e];else this._listeners={};return this},e}();t["default"]=n,e.exports=t["default"]},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var s=function(){function e(e,t){for(var r=0;r-1?"&":"?")+a.queryStringify(e.query)),c.findHeaderName("Accept",e.headers)||(e.headers.Accept=h["default"]._jsonContentType),"string"!=typeof e.body||!e.body){var r=c.findHeaderName(h["default"]._contentType,e.headers);r||(r=h["default"]._contentType,e.headers[r]=h["default"]._jsonContentType);var n=e.headers[r];n.indexOf(h["default"]._jsonContentType)>-1?e.body=JSON.stringify(e.body):n.indexOf(h["default"]._urlencodedContentType)>-1&&(e.body=a.queryStringify(e.body))}var o=new u.Request(e.url,e);return o.originalBody=e.body,o},s(t,null,[{key:"_allowedMethods",value:["GET","POST","PUT","DELETE","PATCH","OPTIONS","HEAD"],enumerable:!0}]),t}(l["default"]);t["default"]=d,e.exports=t["default"]},function(e,t,r){"use strict";function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t["default"]=e,t}function o(e,t){t=t||{};var r=new s.Response(e,t);return a.isNodeJS()&&(r._text=e,r._decode=function(){return this._text}),r}function i(e,t){return e=e.toLowerCase(),Object.keys(t).reduce(function(t,r){return t?t:e==r.toLowerCase()?r:t},null)}t.__esModule=!0,t.createResponse=o,t.findHeaderName=i;var s=r(3),u=r(2),a=n(u)},function(e,t,r){"use strict";function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t["default"]=e,t}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(e,t){for(var r=0;r-1},e.prototype._getContentType=function(){return this._response.headers.get(e._contentType)||""},e.prototype._isMultipart=function(){return this._isContentType(e._multipartContentType)},e.prototype._isUrlEncoded=function(){return this._isContentType(e._urlencodedContentType)},e.prototype._isJson=function(){return this._isContentType(e._jsonContentType)},e.create=function(t,r,n){t=t||"",r=r||200,n=n||"OK",t=t.replace(/\r/g,"");var o=new s.Headers,i=t.split(e._bodySeparator),u=i.length>1?i.shift():"";return t=i.join(e._bodySeparator),(u||"").split("\n").forEach(function(t){var r=t.trim().split(e._headerSeparator),n=r.shift().trim(),i=r.join(e._headerSeparator).trim();n&&o.append(n,i)}),new e(null,a.createResponse(t,{headers:o,status:r,statusText:n}),t)},e}();t["default"]=c,e.exports=t["default"]},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var s=r(13),u=n(s),a=r(9),c=n(a),p=function(e){function t(){o(this,t),e.call(this),this._registry=new u["default"]}return i(t,e),t.prototype.registry=function(){return this._registry},t.prototype._loadResponse=function(e){var t;return regeneratorRuntime.async(function(r){for(;;)switch(r.prev=r.next){case 0:return t=this._registry.find(e),r.next=3,regeneratorRuntime.awrap(t.getResponse(e));case 3:return r.abrupt("return",r.sent);case 4:case"end":return r.stop()}},null,this)},t}(c["default"]);t["default"]=p,e.exports=t["default"]},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=r(14),s=n(i),u=function(){function e(){o(this,e),this._mocks=[]}return e.prototype.add=function(e){return this._mocks.push(e),this},e.prototype.clear=function(){return this._mocks=[],this},e.prototype.find=function(e){var t=this._mocks.shift();if(!t)throw new Error("No mock in registry for request "+e.method+" "+e.url);if(!t.test(e))throw new Error("Wrong request "+e.method+" "+e.url+" for expected mock "+t.method()+" "+t.path());return t},e.prototype.apiCall=function(e,t,r,n,o){return this.add(new s["default"](e,t,r,n,o)),this},e.prototype.authentication=function(){return this.apiCall("POST","/restapi/oauth/token",{access_token:"ACCESS_TOKEN",token_type:"bearer",expires_in:3600,refresh_token:"REFRESH_TOKEN",refresh_token_expires_in:60480,scope:"SMS RCM Foo Boo",expireTime:(new Date).getTime()+36e5}),this},e.prototype.logout=function(){return this.apiCall("POST","/restapi/oauth/revoke",{}),this},e.prototype.presenceLoad=function(e){return this.apiCall("GET","/restapi/v1.0/account/~/extension/"+e+"/presence",{uri:"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/"+e+"/presence",extension:{uri:"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/"+e,id:e,extensionNumber:"101"},activeCalls:[],presenceStatus:"Available",telephonyStatus:"Ringing",userStatus:"Available",dndStatus:"TakeAllCalls",extensionId:e}),this},e.prototype.subscribeGeneric=function(e){e=e||54e3;var t=new Date;return this.apiCall("POST","/restapi/v1.0/subscription",{eventFilters:["/restapi/v1.0/account/~/extension/~/presence"],expirationTime:new Date(t.getTime()+1e3*e).toISOString(),expiresIn:e,deliveryMode:{transportType:"PubNub",encryption:!1,address:"123_foo",subscriberKey:"sub-c-foo",secretKey:"sec-c-bar"},id:"foo-bar-baz",creationTime:t.toISOString(),status:"Active",uri:"https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz"}),this},e.prototype.subscribeOnPresence=function(e,t){e=e||"1";var r=new Date;return this.apiCall("POST","/restapi/v1.0/subscription",{eventFilters:["/restapi/v1.0/account/~/extension/"+e+"/presence"+(t?"?detailedTelephonyState=true":"")],expirationTime:new Date(r.getTime()+54e6).toISOString(),deliveryMode:{transportType:"PubNub",encryption:!0,address:"123_foo",subscriberKey:"sub-c-foo",secretKey:"sec-c-bar",encryptionAlgorithm:"AES",encryptionKey:"VQwb6EVNcQPBhE/JgFZ2zw=="},creationTime:r.toISOString(),id:"foo-bar-baz",status:"Active",uri:"https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz"}),this},e.prototype.tokenRefresh=function(e){return e?this.apiCall("POST","/restapi/oauth/token",{message:"Wrong token",error_description:"Wrong token",description:"Wrong token"},400):this.apiCall("POST","/restapi/oauth/token",{access_token:"ACCESS_TOKEN_FROM_REFRESH",token_type:"bearer",expires_in:3600,refresh_token:"REFRESH_TOKEN_FROM_REFRESH",refresh_token_expires_in:60480,scope:"SMS RCM Foo Boo"}),this},e}();t["default"]=u,e.exports=t["default"]},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=r(11),s=n(i),u=r(2),a=r(10),c=function(){function e(t,r,n,i,s,u){o(this,e),this._method=t.toUpperCase(),this._path=r,this._json=n||{},this._delay=u||10,this._status=i||200,this._statusText=s||"OK"}return e.prototype.path=function(){return this._path},e.prototype.method=function(){return this._method},e.prototype.test=function(e){return e.url.indexOf(this._path)>-1&&e.method.toUpperCase()==this._method},e.prototype.getResponse=function(e){return regeneratorRuntime.async(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,regeneratorRuntime.awrap(u.delay(this._delay));case 2:return e.abrupt("return",this.createResponse(this._json));case 3:case"end":return e.stop()}},null,this)},e.prototype.createResponse=function(e,t){t=t||{},t.status=t.status||this._status,t.statusText=t.statusText||this._statusText;var r=JSON.stringify(e),n=a.createResponse(r,t);return n.headers.set(s["default"]._contentType,s["default"]._jsonContentType),n},e}();t["default"]=c,e.exports=t["default"]},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var s=function(){function e(e,t){for(var r=0;r-1?"&":"?"),r.addMethod&&(n+="_method="+r.addMethod),r.addToken&&(n+=(r.addMethod?"&":"")+"access_token="+this._auth.accessToken()),n},t.prototype.authUrl=function(e){return e=e||{},this.createUrl(t._authorizeEndpoint+"?"+h.queryStringify({response_type:"code",redirect_uri:e.redirectUri||"",client_id:this._appKey,state:e.state||"",brand_id:e.brandId||"",display:e.display||"",prompt:e.prompt||""}),{addServer:!0})},t.prototype.parseAuthRedirectUrl=function(e){var t=h.parseQueryString(e.split("?").reverse()[0]),r=t.error_description||t.error;if(r){var n=new Error(r);throw n.error=t.error,n}return t},t.prototype.loggedIn=function(){return regeneratorRuntime.async(function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,regeneratorRuntime.awrap(this._ensureAuthentication());case 3:return e.abrupt("return",!0);case 6:return e.prev=6,e.t0=e["catch"](0),e.abrupt("return",!1);case 9:case"end":return e.stop()}},null,this,[[0,6]])},t.prototype.login=function(e){var r,n,o;return regeneratorRuntime.async(function(i){for(;;)switch(i.prev=i.next){case 0:return i.prev=0,e=e||{},e.remember=e.remember||!1,this.emit(this.events.beforeLogin),r={access_token_ttl:t._accessTokenTtl,refresh_token_ttl:e.remember?t._refreshTokenTtlRemember:t._refreshTokenTtl},e.code?e.code&&(r.grant_type="authorization_code",r.code=e.code,r.redirect_uri=e.redirectUri):(r.grant_type="password",r.username=e.username,r.password=e.password,r.extension=e.extension||""),e.endpointId&&(r.endpoint_id=e.endpointId),i.next=9,regeneratorRuntime.awrap(this._tokenRequest(t._tokenEndpoint,r));case 9:return n=i.sent,o=n.json(),this._auth.setData(o).setRemember(e.remember),this.emit(this.events.loginSuccess,n),i.abrupt("return",n);case 16:throw i.prev=16,i.t0=i["catch"](0),this._cache.clean(),this.emit(this.events.loginError,i.t0),i.t0;case 21:case"end":return i.stop()}},null,this,[[0,16]])},t.prototype.refresh=function(){var e,r;return regeneratorRuntime.async(function(n){for(;;)switch(n.prev=n.next){case 0:if(n.prev=0,this.emit(this.events.beforeRefresh),!this._queue.isPaused()){n.next=9;break}return n.next=5,regeneratorRuntime.awrap(this._queue.poll());case 5:if(this._isAccessTokenValid()){n.next=7;break}throw new Error("Automatic authentification timeout");case 7:return this.emit(this.events.refreshSuccess,null),n.abrupt("return",null);case 9:return this._queue.pause(),n.next=12,regeneratorRuntime.awrap(h.delay(t._refreshDelayMs));case 12:if(this._auth.refreshToken()){n.next=14;break}throw new Error("Refresh token is missing");case 14:if(this._auth.refreshTokenValid()){n.next=16;break}throw new Error("Refresh token has expired");case 16:if(this._queue.isPaused()){n.next=18;break}throw new Error("Queue was resumed before refresh call");case 18:return n.next=20,regeneratorRuntime.awrap(this._tokenRequest(t._tokenEndpoint,{grant_type:"refresh_token",refresh_token:this._auth.refreshToken(),access_token_ttl:t._accessTokenTtl,refresh_token_ttl:this._auth.remember()?t._refreshTokenTtlRemember:t._refreshTokenTtl}));case 20:if(e=n.sent,r=e.json(),r.access_token){n.next=24;break}throw this._client.makeError(new Error("Malformed OAuth response"),e);case 24:return this._auth.setData(r),this._queue.resume(),this.emit(this.events.refreshSuccess,e),n.abrupt("return",e);case 30:throw n.prev=30,n.t0=n["catch"](0),n.t0=this._client.makeError(n.t0),t._clearCacheOnRefreshError&&this._cache.clean(),this.emit(this.events.refreshError,n.t0),n.t0;case 36:case"end":return n.stop()}},null,this,[[0,30]])},t.prototype.logout=function(){var e;return regeneratorRuntime.async(function(r){for(;;)switch(r.prev=r.next){case 0:return r.prev=0,this.emit(this.events.beforeLogout),this._queue.pause(),r.next=5,regeneratorRuntime.awrap(this._tokenRequest(t._revokeEndpoint,{token:this._auth.accessToken()}));case 5:return e=r.sent,this._queue.resume(),this._cache.clean(),this.emit(this.events.logoutSuccess,e),r.abrupt("return",e);case 12:throw r.prev=12,r.t0=r["catch"](0),this._queue.resume(),this.emit(this.events.logoutError,r.t0),r.t0;case 17:case"end":return r.stop()}},null,this,[[0,12]])},t.prototype.inflateRequest=function(e,t){return regeneratorRuntime.async(function(r){for(;;)switch(r.prev=r.next){case 0:if(t=t||{},!t.skipAuthCheck){r.next=3;break}return r.abrupt("return",e);case 3:return r.next=5,regeneratorRuntime.awrap(this._ensureAuthentication());case 5:return e.headers.set("Authorization",this._authHeader()),r.abrupt("return",e);case 7:case"end":return r.stop()}},null,this)},t.prototype.sendRequest=function(e,t){return regeneratorRuntime.async(function(r){for(;;)switch(r.prev=r.next){case 0:return r.prev=0,r.next=3,regeneratorRuntime.awrap(this.inflateRequest(e,t));case 3:return e=r.sent,r.next=6,regeneratorRuntime.awrap(this._client.sendRequest(e));case 6:return r.abrupt("return",r.sent);case 9:if(r.prev=9,r.t0=r["catch"](0),r.t0.apiResponse&&r.t0.apiResponse.response()&&401==r.t0.apiResponse.response().status){r.next=13;break}throw r.t0;case 13:return this._auth.cancelAccessToken(),r.next=16,regeneratorRuntime.awrap(this.sendRequest(e,t));case 16:return r.abrupt("return",r.sent);case 17:case"end":return r.stop()}},null,this,[[0,9]])},t.prototype.send=function(){var e=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];return regeneratorRuntime.async(function(t){for(;;)switch(t.prev=t.next){case 0:return e.url=this.createUrl(e.url,{addServer:!0}),t.next=3,regeneratorRuntime.awrap(this.sendRequest(this._client.createRequest(e),e));case 3:return t.abrupt("return",t.sent);case 4:case"end":return t.stop()}},null,this)},t.prototype.get=function(e,t,r){return regeneratorRuntime.async(function(n){for(;;)switch(n.prev=n.next){case 0:return r=r||{},r.method="GET",r.url=e,r.query=t,n.next=6,regeneratorRuntime.awrap(this.send(r));case 6:return n.abrupt("return",n.sent);case 7:case"end":return n.stop()}},null,this)},t.prototype.post=function(e,t,r,n){return regeneratorRuntime.async(function(o){for(;;)switch(o.prev=o.next){case 0:return n=n||{},n.method="POST",n.url=e,n.query=r,n.body=t,o.next=7,regeneratorRuntime.awrap(this.send(n));case 7:return o.abrupt("return",o.sent);case 8:case"end":return o.stop()}},null,this)},t.prototype.put=function(e,t,r,n){return regeneratorRuntime.async(function(o){for(;;)switch(o.prev=o.next){case 0:return n=n||{},n.method="PUT",n.url=e,n.query=r,n.body=t,o.next=7,regeneratorRuntime.awrap(this.send(n));case 7:return o.abrupt("return",o.sent);case 8:case"end":return o.stop()}},null,this)},t.prototype["delete"]=function(e,t,r){return regeneratorRuntime.async(function(n){for(;;)switch(n.prev=n.next){case 0:return r=r||{},r.method="DELETE",r.url=e,r.query=t,n.next=6,regeneratorRuntime.awrap(this.send(r));case 6:return n.abrupt("return",n.sent);case 7:case"end":return n.stop()}},null,this)},t.prototype._tokenRequest=function(e,t){return regeneratorRuntime.async(function(r){for(;;)switch(r.prev=r.next){case 0:return r.next=2,regeneratorRuntime.awrap(this.send({url:e,skipAuthCheck:!0,body:t,method:"POST",headers:{Authorization:"Basic "+this._apiKey(),"Content-Type":"application/x-www-form-urlencoded"}}));case 2:return r.abrupt("return",r.sent);case 3:case"end":return r.stop()}},null,this)},t.prototype._ensureAuthentication=function(){return regeneratorRuntime.async(function(e){for(;;)switch(e.prev=e.next){case 0:if(!this._isAccessTokenValid()){e.next=2;break}return e.abrupt("return",null);case 2:return e.next=4,regeneratorRuntime.awrap(this.refresh());case 4:return e.abrupt("return",e.sent);case 5:case"end":return e.stop()}},null,this)},t.prototype._isAccessTokenValid=function(){return this._auth.accessTokenValid()&&!this._queue.isPaused()},t.prototype._apiKey=function(){var e=this._appKey+":"+this._appSecret;return"function"==typeof btoa?btoa(e):new Buffer(e).toString("base64")},t.prototype._authHeader=function(){var e=this._auth.accessToken();return this._auth.tokenType()+(e?" "+e:"")},t}(a["default"]);t["default"]=d,e.exports=t["default"]},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var o=function(){function e(e,t){for(var r=0;rDate.now()},e.prototype.refreshTokenValid=function(){return this.data().refresh_token_expire_time>Date.now()},e.prototype.cancelAccessToken=function(){return this.setData({access_token:"",expires_in:0})},e.prototype.forceAuthentication=function(){return this.setData({token_type:e.forcedTokenType,access_token:"",expires_in:0,refresh_token:"",refresh_token_expires_in:0}),this},e.prototype.setRemember=function(e){return this.setData({remember:e})},e.prototype.remember=function(){return!!this.data().remember},e}();t["default"]=o,e.exports=t["default"]},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=r(19),s=n(i),u=r(3),a=function(){function e(){o(this,e),this.crypto_obj=u.PUBNUB.crypto_obj}return e.prototype.init=function(e){return new s["default"](e)},e}();t["default"]=a,e.exports=t["default"]},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var s=r(8),u=n(s),a=r(3),c=function(e){function t(r){o(this,t),e.call(this),this.options=r,this.crypto_obj=a.PUBNUB.crypto_obj}return i(t,e),t.prototype.ready=function(){},t.prototype.subscribe=function(e){this.on("message-"+e.channel,e.message)},t.prototype.unsubscribe=function(e){this.off("message-"+e.channel)},t.prototype.receiveMessage=function(e,t){this.emit("message-"+t,e,"env",t)},t}(u["default"]);t["default"]=c,e.exports=t["default"]},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var s=function(){function e(e,t){for(var r=0;r=0;--n){var o=this.tryEntries[n],i=o.completion;if("root"===o.tryLoc)return t("end");if(o.tryLoc<=this.prev){var s=b.call(o,"catchLoc"),u=b.call(o,"finallyLoc");if(s&&u){if(this.prev=0;--r){var n=this.tryEntries[r];if(n.tryLoc<=this.prev&&b.call(n,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),f(r),T}},"catch":function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var o=n.arg;f(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,r){return this.delegate={iterator:d(e),resultName:t,nextLoc:r},T}}}("object"==typeof t?t:"object"==typeof window?window:"object"==typeof self?self:this)}).call(t,function(){return this}())}])}); +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("es6-promise"),require("node-fetch"),require("pubnub")):"function"==typeof define&&define.amd?define([,,"pubnub"],t):"object"==typeof exports?exports.SDK=t(require("es6-promise"),require("node-fetch"),require("pubnub")):(e.RingCentral=e.RingCentral||{},e.RingCentral.SDK=t(e[void 0],e[void 0],e[void 0]))}(this,function(e,t,r){return function(e){function t(n){if(r[n])return r[n].exports;var o=r[n]={exports:{},id:n,loaded:!1};return e[n].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var r={};return t.m=e,t.c=r,t.p="/build/",t(0)}([function(e,t,r){e.exports=r(1)},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t["default"]=e,t}function s(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(e,t){for(var r=0;r1?r-1:0),o=1;r>o;o++)n[o-1]=arguments[o];var s=null;return this.hasListeners(e)?(this._listeners[e].some(function(e){return s=e.apply(t,n),s===!1}),s):null},e.prototype.off=function(e,t){var r=this;if(e)if(t){if(!this.hasListeners(e))return this;this._listeners[e].forEach(function(n,o){n===t&&delete r._listeners[e][o]})}else delete this._listeners[e];else this._listeners={};return this},e}();t["default"]=n,e.exports=t["default"]},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var o=function(){function e(e,t){for(var r=0;r-1?"&":"?")+a.queryStringify(e.query)),c.findHeaderName("Accept",e.headers)||(e.headers.Accept=h["default"]._jsonContentType),"string"!=typeof e.body||!e.body){var r=c.findHeaderName(h["default"]._contentType,e.headers);r||(r=h["default"]._contentType,e.headers[r]=h["default"]._jsonContentType);var n=e.headers[r];n.indexOf(h["default"]._jsonContentType)>-1?e.body=JSON.stringify(e.body):n.indexOf(h["default"]._urlencodedContentType)>-1&&(e.body=a.queryStringify(e.body))}var o=new u.Request(e.url,e);return o.originalBody=e.body,o},i(t,null,[{key:"_allowedMethods",value:["GET","POST","PUT","DELETE","PATCH","OPTIONS","HEAD"],enumerable:!0}]),t}(l["default"]);t["default"]=d,e.exports=t["default"]},function(e,t,r){"use strict";function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t["default"]=e,t}function o(e,t){t=t||{};var r=new i.Response(e,t);return a.isNodeJS()&&(r._text=e,r._decode=function(){return this._text}),r}function s(e,t){return e=e.toLowerCase(),Object.keys(t).reduce(function(t,r){return t?t:e==r.toLowerCase()?r:t},null)}t.__esModule=!0,t.createResponse=o,t.findHeaderName=s;var i=r(3),u=r(2),a=n(u)},function(e,t,r){"use strict";function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t["default"]=e,t}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var s=function(){function e(e,t){for(var r=0;r-1},e.prototype._getContentType=function(){return this._response.headers.get(e._contentType)||""},e.prototype._isMultipart=function(){return this._isContentType(e._multipartContentType)},e.prototype._isUrlEncoded=function(){return this._isContentType(e._urlencodedContentType)},e.prototype._isJson=function(){return this._isContentType(e._jsonContentType)},e.create=function(t,r,n){t=t||"",r=r||200,n=n||"OK",t=t.replace(/\r/g,"");var o=new i.Headers,s=t.split(e._bodySeparator),u=s.length>1?s.shift():"";return t=s.join(e._bodySeparator),(u||"").split("\n").forEach(function(t){var r=t.trim().split(e._headerSeparator),n=r.shift().trim(),s=r.join(e._headerSeparator).trim();n&&o.append(n,s)}),new e(null,a.createResponse(t,{headers:o,status:r,statusText:n}),t)},e}();t["default"]=c,e.exports=t["default"]},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var i=r(14),u=n(i),a=r(10),c=n(a),p=function(e){function t(){o(this,t),e.call(this),this._registry=new u["default"]}return s(t,e),t.prototype.registry=function(){return this._registry},t.prototype._loadResponse=function(e){var t;return regeneratorRuntime.async(function(r){for(;;)switch(r.prev=r.next){case 0:return t=this._registry.find(e),r.next=3,regeneratorRuntime.awrap(t.getResponse(e));case 3:return r.abrupt("return",r.sent);case 4:case"end":return r.stop()}},null,this)},t}(c["default"]);t["default"]=p,e.exports=t["default"]},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var s=r(15),i=n(s),u=function(){function e(){o(this,e),this._mocks=[]}return e.prototype.add=function(e){return this._mocks.push(e),this},e.prototype.clear=function(){return this._mocks=[],this},e.prototype.find=function(e){var t=this._mocks.shift();if(!t)throw new Error("No mock in registry for request "+e.method+" "+e.url);if(!t.test(e))throw new Error("Wrong request "+e.method+" "+e.url+" for expected mock "+t.method()+" "+t.path());return t},e.prototype.apiCall=function(e,t,r,n,o){return this.add(new i["default"](e,t,r,n,o)),this},e.prototype.authentication=function(){return this.apiCall("POST","/restapi/oauth/token",{access_token:"ACCESS_TOKEN",token_type:"bearer",expires_in:3600,refresh_token:"REFRESH_TOKEN",refresh_token_expires_in:60480,scope:"SMS RCM Foo Boo",expireTime:(new Date).getTime()+36e5}),this},e.prototype.logout=function(){return this.apiCall("POST","/restapi/oauth/revoke",{}),this},e.prototype.presenceLoad=function(e){return this.apiCall("GET","/restapi/v1.0/account/~/extension/"+e+"/presence",{uri:"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/"+e+"/presence",extension:{uri:"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/"+e,id:e,extensionNumber:"101"},activeCalls:[],presenceStatus:"Available",telephonyStatus:"Ringing",userStatus:"Available",dndStatus:"TakeAllCalls",extensionId:e}),this},e.prototype.subscribeGeneric=function(e){e=e||54e3;var t=new Date;return this.apiCall("POST","/restapi/v1.0/subscription",{eventFilters:["/restapi/v1.0/account/~/extension/~/presence"],expirationTime:new Date(t.getTime()+1e3*e).toISOString(),expiresIn:e,deliveryMode:{transportType:"PubNub",encryption:!1,address:"123_foo",subscriberKey:"sub-c-foo",secretKey:"sec-c-bar"},id:"foo-bar-baz",creationTime:t.toISOString(),status:"Active",uri:"https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz"}),this},e.prototype.subscribeOnPresence=function(e,t){e=e||"1";var r=new Date;return this.apiCall("POST","/restapi/v1.0/subscription",{eventFilters:["/restapi/v1.0/account/~/extension/"+e+"/presence"+(t?"?detailedTelephonyState=true":"")],expirationTime:new Date(r.getTime()+54e6).toISOString(),deliveryMode:{transportType:"PubNub",encryption:!0,address:"123_foo",subscriberKey:"sub-c-foo",secretKey:"sec-c-bar",encryptionAlgorithm:"AES",encryptionKey:"VQwb6EVNcQPBhE/JgFZ2zw=="},creationTime:r.toISOString(),id:"foo-bar-baz",status:"Active",uri:"https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz"}),this},e.prototype.tokenRefresh=function(e){return e?this.apiCall("POST","/restapi/oauth/token",{message:"Wrong token",error_description:"Wrong token",description:"Wrong token"},400):this.apiCall("POST","/restapi/oauth/token",{access_token:"ACCESS_TOKEN_FROM_REFRESH",token_type:"bearer",expires_in:3600,refresh_token:"REFRESH_TOKEN_FROM_REFRESH",refresh_token_expires_in:60480,scope:"SMS RCM Foo Boo"}),this},e}();t["default"]=u,e.exports=t["default"]},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var s=r(12),i=n(s),u=r(2),a=r(11),c=function(){function e(t,r,n,s,i,u){o(this,e),this._method=t.toUpperCase(),this._path=r,this._json=n||{},this._delay=u||10,this._status=s||200,this._statusText=i||"OK"}return e.prototype.path=function(){return this._path},e.prototype.method=function(){return this._method},e.prototype.test=function(e){return e.url.indexOf(this._path)>-1&&e.method.toUpperCase()==this._method},e.prototype.getResponse=function(e){return regeneratorRuntime.async(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,regeneratorRuntime.awrap(u.delay(this._delay));case 2:return e.abrupt("return",this.createResponse(this._json));case 3:case"end":return e.stop()}},null,this)},e.prototype.createResponse=function(e,t){t=t||{},t.status=t.status||this._status,t.statusText=t.statusText||this._statusText;var r=JSON.stringify(e),n=a.createResponse(r,t);return n.headers.set(i["default"]._contentType,i["default"]._jsonContentType),n},e}();t["default"]=c,e.exports=t["default"]},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var i=function(){function e(e,t){for(var r=0;r-1?"&":"?"),r.addMethod&&(n+="_method="+r.addMethod),r.addToken&&(n+=(r.addMethod?"&":"")+"access_token="+this._auth.accessToken()),n},t.prototype.authUrl=function(e){return e=e||{},this.createUrl(t._authorizeEndpoint+"?"+h.queryStringify({response_type:"code",redirect_uri:e.redirectUri||"",client_id:this._appKey,state:e.state||"",brand_id:e.brandId||"",display:e.display||"",prompt:e.prompt||""}),{addServer:!0})},t.prototype.parseAuthRedirectUrl=function(e){var t=h.parseQueryString(e.split("?").reverse()[0]),r=t.error_description||t.error;if(r){var n=new Error(r);throw n.error=t.error,n}return t},t.prototype.loggedIn=function(){return regeneratorRuntime.async(function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,regeneratorRuntime.awrap(this._ensureAuthentication());case 3:return e.abrupt("return",!0);case 6:return e.prev=6,e.t0=e["catch"](0),e.abrupt("return",!1);case 9:case"end":return e.stop()}},null,this,[[0,6]])},t.prototype.login=function(e){var r,n,o;return regeneratorRuntime.async(function(s){for(;;)switch(s.prev=s.next){case 0:return s.prev=0,e=e||{},e.remember=e.remember||!1,this.emit(this.events.beforeLogin),r={access_token_ttl:t._accessTokenTtl,refresh_token_ttl:e.remember?t._refreshTokenTtlRemember:t._refreshTokenTtl},e.code?e.code&&(r.grant_type="authorization_code",r.code=e.code,r.redirect_uri=e.redirectUri):(r.grant_type="password",r.username=e.username,r.password=e.password,r.extension=e.extension||""),e.endpointId&&(r.endpoint_id=e.endpointId),s.next=9,regeneratorRuntime.awrap(this._tokenRequest(t._tokenEndpoint,r));case 9:return n=s.sent,o=n.json(),this._auth.setData(o).setRemember(e.remember),this.emit(this.events.loginSuccess,n),s.abrupt("return",n);case 16:throw s.prev=16,s.t0=s["catch"](0),this._cache.clean(),this.emit(this.events.loginError,s.t0),s.t0;case 21:case"end":return s.stop()}},null,this,[[0,16]])},t.prototype.refresh=function(){var e,r;return regeneratorRuntime.async(function(n){for(;;)switch(n.prev=n.next){case 0:if(n.prev=0,this.emit(this.events.beforeRefresh),!this._queue.isPaused()){n.next=9;break}return n.next=5,regeneratorRuntime.awrap(this._queue.poll());case 5:if(this._isAccessTokenValid()){n.next=7;break}throw new Error("Automatic authentification timeout");case 7:return this.emit(this.events.refreshSuccess,null),n.abrupt("return",null);case 9:return this._queue.pause(),n.next=12,regeneratorRuntime.awrap(h.delay(t._refreshDelayMs));case 12:if(this._auth.refreshToken()){n.next=14;break}throw new Error("Refresh token is missing");case 14:if(this._auth.refreshTokenValid()){n.next=16;break}throw new Error("Refresh token has expired");case 16:if(this._queue.isPaused()){n.next=18;break}throw new Error("Queue was resumed before refresh call");case 18:return n.next=20,regeneratorRuntime.awrap(this._tokenRequest(t._tokenEndpoint,{grant_type:"refresh_token",refresh_token:this._auth.refreshToken(),access_token_ttl:t._accessTokenTtl,refresh_token_ttl:this._auth.remember()?t._refreshTokenTtlRemember:t._refreshTokenTtl}));case 20:if(e=n.sent,r=e.json(),r.access_token){n.next=24;break}throw this._client.makeError(new Error("Malformed OAuth response"),e);case 24:return this._auth.setData(r),this._queue.resume(),this.emit(this.events.refreshSuccess,e),n.abrupt("return",e);case 30:throw n.prev=30,n.t0=n["catch"](0),n.t0=this._client.makeError(n.t0),t._clearCacheOnRefreshError&&this._cache.clean(),this.emit(this.events.refreshError,n.t0),n.t0;case 36:case"end":return n.stop()}},null,this,[[0,30]])},t.prototype.logout=function(){var e;return regeneratorRuntime.async(function(r){for(;;)switch(r.prev=r.next){case 0:return r.prev=0,this.emit(this.events.beforeLogout),this._queue.pause(),r.next=5,regeneratorRuntime.awrap(this._tokenRequest(t._revokeEndpoint,{token:this._auth.accessToken()}));case 5:return e=r.sent,this._queue.resume(),this._cache.clean(),this.emit(this.events.logoutSuccess,e),r.abrupt("return",e);case 12:throw r.prev=12,r.t0=r["catch"](0),this._queue.resume(),this.emit(this.events.logoutError,r.t0),r.t0;case 17:case"end":return r.stop()}},null,this,[[0,12]])},t.prototype.inflateRequest=function(e,t){return regeneratorRuntime.async(function(r){for(;;)switch(r.prev=r.next){case 0:if(t=t||{},!t.skipAuthCheck){r.next=3;break}return r.abrupt("return",e);case 3:return r.next=5,regeneratorRuntime.awrap(this._ensureAuthentication());case 5:return e.headers.set("Authorization",this._authHeader()),r.abrupt("return",e);case 7:case"end":return r.stop()}},null,this)},t.prototype.sendRequest=function(e,t){return regeneratorRuntime.async(function(r){for(;;)switch(r.prev=r.next){case 0:return r.prev=0,r.next=3,regeneratorRuntime.awrap(this.inflateRequest(e,t));case 3:return e=r.sent,r.next=6,regeneratorRuntime.awrap(this._client.sendRequest(e));case 6:return r.abrupt("return",r.sent);case 9:if(r.prev=9,r.t0=r["catch"](0),r.t0.apiResponse&&r.t0.apiResponse.response()&&401==r.t0.apiResponse.response().status){r.next=13;break}throw r.t0;case 13:return this._auth.cancelAccessToken(),r.next=16,regeneratorRuntime.awrap(this.sendRequest(e,t));case 16:return r.abrupt("return",r.sent);case 17:case"end":return r.stop()}},null,this,[[0,9]])},t.prototype.send=function(){var e=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];return regeneratorRuntime.async(function(t){for(;;)switch(t.prev=t.next){case 0:return e.url=this.createUrl(e.url,{addServer:!0}),t.next=3,regeneratorRuntime.awrap(this.sendRequest(this._client.createRequest(e),e));case 3:return t.abrupt("return",t.sent);case 4:case"end":return t.stop()}},null,this)},t.prototype.get=function(e,t,r){return regeneratorRuntime.async(function(n){for(;;)switch(n.prev=n.next){case 0:return r=r||{},r.method="GET",r.url=e,r.query=t,n.next=6,regeneratorRuntime.awrap(this.send(r));case 6:return n.abrupt("return",n.sent);case 7:case"end":return n.stop()}},null,this)},t.prototype.post=function(e,t,r,n){return regeneratorRuntime.async(function(o){for(;;)switch(o.prev=o.next){case 0:return n=n||{},n.method="POST",n.url=e,n.query=r,n.body=t,o.next=7,regeneratorRuntime.awrap(this.send(n));case 7:return o.abrupt("return",o.sent);case 8:case"end":return o.stop()}},null,this)},t.prototype.put=function(e,t,r,n){return regeneratorRuntime.async(function(o){for(;;)switch(o.prev=o.next){case 0:return n=n||{},n.method="PUT",n.url=e,n.query=r,n.body=t,o.next=7,regeneratorRuntime.awrap(this.send(n));case 7:return o.abrupt("return",o.sent);case 8:case"end":return o.stop()}},null,this)},t.prototype["delete"]=function(e,t,r){return regeneratorRuntime.async(function(n){for(;;)switch(n.prev=n.next){case 0:return r=r||{},r.method="DELETE",r.url=e,r.query=t,n.next=6,regeneratorRuntime.awrap(this.send(r));case 6:return n.abrupt("return",n.sent);case 7:case"end":return n.stop()}},null,this)},t.prototype._tokenRequest=function(e,t){return regeneratorRuntime.async(function(r){for(;;)switch(r.prev=r.next){case 0:return r.next=2,regeneratorRuntime.awrap(this.send({url:e,skipAuthCheck:!0,body:t,method:"POST",headers:{Authorization:"Basic "+this._apiKey(),"Content-Type":"application/x-www-form-urlencoded"}}));case 2:return r.abrupt("return",r.sent);case 3:case"end":return r.stop()}},null,this)},t.prototype._ensureAuthentication=function(){return regeneratorRuntime.async(function(e){for(;;)switch(e.prev=e.next){case 0:if(!this._isAccessTokenValid()){e.next=2;break}return e.abrupt("return",null);case 2:return e.next=4,regeneratorRuntime.awrap(this.refresh());case 4:return e.abrupt("return",e.sent);case 5:case"end":return e.stop()}},null,this)},t.prototype._isAccessTokenValid=function(){return this._auth.accessTokenValid()&&!this._queue.isPaused()},t.prototype._apiKey=function(){var e=this._appKey+":"+this._appSecret;return"function"==typeof btoa?btoa(e):new Buffer(e).toString("base64")},t.prototype._authHeader=function(){var e=this._auth.accessToken();return this._auth.tokenType()+(e?" "+e:"")},t}(a["default"]);t["default"]=d,e.exports=t["default"]},function(e,t){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var n=function(){function e(e,t){for(var r=0;rDate.now()},e.prototype.refreshTokenValid=function(){return this.data().refresh_token_expire_time>Date.now()},e.prototype.cancelAccessToken=function(){return this.setData({access_token:"",expires_in:0})},e.prototype.forceAuthentication=function(){return this.setData({token_type:e.forcedTokenType,access_token:"",expires_in:0,refresh_token:"",refresh_token_expires_in:0}),this},e.prototype.setRemember=function(e){return this.setData({remember:e})},e.prototype.remember=function(){return!!this.data().remember},e}();t["default"]=o,e.exports=t["default"]},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var s=r(19),i=n(s),u=r(3),a=function(){function e(){o(this,e),this.crypto_obj=u.PUBNUB.crypto_obj}return e.prototype.init=function(e){return new i["default"](e)},e}();t["default"]=a,e.exports=t["default"]},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var i=r(8),u=n(i),a=r(3),c=function(e){function t(r){o(this,t),e.call(this),this.options=r,this.crypto_obj=a.PUBNUB.crypto_obj}return s(t,e),t.prototype.ready=function(){},t.prototype.subscribe=function(e){this.on("message-"+e.channel,e.message)},t.prototype.unsubscribe=function(e){this.off("message-"+e.channel)},t.prototype.receiveMessage=function(e,t){this.emit("message-"+t,e,"env",t)},t}(u["default"]);t["default"]=c,e.exports=t["default"]},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var i=function(){function e(e,t){for(var r=0;r=0;--n){var o=this.tryEntries[n],s=o.completion;if("root"===o.tryLoc)return t("end");if(o.tryLoc<=this.prev){var i=b.call(o,"catchLoc"),u=b.call(o,"finallyLoc");if(i&&u){if(this.prev=0;--r){var n=this.tryEntries[r];if(n.tryLoc<=this.prev&&b.call(n,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),f(r),T}},"catch":function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var o=n.arg;f(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,r){return this.delegate={iterator:d(e),resultName:t,nextLoc:r},T}}}("object"==typeof t?t:"object"==typeof window?window:"object"==typeof self?self:this)}).call(t,function(){return this}())}])}); //# sourceMappingURL=ringcentral.min.js.map diff --git a/build/ringcentral.min.js.map b/build/ringcentral.min.js.map index b6078687..b25a513f 100644 --- a/build/ringcentral.min.js.map +++ b/build/ringcentral.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","ringcentral.js","webpack:/webpack/bootstrap c0838cc3f17cb1b5a03c","webpack:///src/SDK.js","webpack:///src/core/Utils.js","webpack:///src/core/Externals.js","webpack:/external {\"commonjs\":\"es6-promise\",\"commonjs2\":\"es6-promise\"}","webpack:/external {\"commonjs\":\"node-fetch\",\"commonjs2\":\"node-fetch\"}","webpack:/external {\"commonjs\":\"pubnub\",\"commonjs2\":\"pubnub\",\"amd\":\"pubnub\"}","webpack:///src/core/Cache.js","webpack:///src/core/Observable.js","webpack:///src/http/Client.js","webpack:///src/http/Utils.js","webpack:///src/http/ApiResponse.js","webpack:///src/mocks/ClientMock.js","webpack:///src/mocks/Registry.js","webpack:///src/mocks/Mock.js","webpack:///src/platform/Platform.js","webpack:///src/platform/Queue.js","webpack:///src/platform/Auth.js","webpack:///src/pubnub/PubnubFactory.js","webpack:///src/pubnub/PubnubMock.js","webpack:///src/subscription/Subscription.js","webpack:///~/regenerator/runtime.js"],"names":["root","factory","exports","module","require","define","amd","undefined","this","__WEBPACK_EXTERNAL_MODULE_4__","__WEBPACK_EXTERNAL_MODULE_5__","__WEBPACK_EXTERNAL_MODULE_6__","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","_interopRequireDefault","obj","__esModule","default","_interopRequireWildcard","newObj","key","Object","prototype","hasOwnProperty","_classCallCheck","instance","Constructor","TypeError","_createClass","defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","defineProperty","protoProps","staticProps","_coreUtils","Utils","_coreCache","_coreCache2","_coreExternals","Externals","_coreObservable","_coreObservable2","_httpClient","_httpClient2","_httpApiResponse","_httpApiResponse2","_httpUtils","HttpUtils","_mocksClientMock","_mocksClientMock2","_mocksMock","_mocksMock2","_mocksRegistry","_mocksRegistry2","_platformPlatform","_platformPlatform2","_platformAuth","_platformAuth2","_platformQueue","_platformQueue2","_pubnubPubnubFactory","_pubnubPubnubFactory2","_subscriptionSubscription","_subscriptionSubscription2","SDK","options","_cache","localStorage","cachePrefix","_client","client","_platform","server","appKey","appSecret","_pubnubFactory","pubnubFactory","PUBNUB","value","sandbox","production","platform","createSubscription","cache","Cache","Observable","Client","ApiResponse","Auth","Platform","Queue","Subscription","Registry","Mock","PubnubMockFactory","queryStringify","parameters","array","keys","forEach","k","v","isArray","vv","push","encodeURIComponent","join","parseQueryString","queryString","argsParsed","split","arg","decodeURIComponent","indexOf","trim","pair","isFunction","Array","poll","fn","interval","timeout","stopPolling","next","delay","setTimeout","clearTimeout","isNodeJS","process","isBrowser","window","_ExternalsJs","Promise","resolve","reject","_es6Promise","_es6Promise2","_nodeFetch","_nodeFetch2","_pubnub","_pubnub2","fetch","Request","Response","Headers","storage","prefix","setPrefix","_storage","_prefix","defaultPrefix","setItem","data","_prefixKey","JSON","stringify","removeItem","getItem","item","parse","clean","off","hasListeners","event","_listeners","on","events","callback","_this","Error","emit","_this2","_len","arguments","args","_key","result","some","apply","_this3","cb","_inherits","subClass","superClass","create","constructor","setPrototypeOf","__proto__","_Utils","_ApiResponse","_ApiResponse2","_Observable","beforeRequest","requestSuccess","requestError","sendRequest","request","apiResponse","regeneratorRuntime","async","context$2$0","prev","awrap","_loadResponse","_response","sent","_isMultipart","_isJson","response","text","_text","ok","abrupt","t0","makeError","stop","e","originalMessage","message","error","createRequest","init","headers","url","method","_allowedMethods","credentials","mode","query","findHeaderName","_jsonContentType","body","contentTypeHeaderName","_contentType","contentType","_urlencodedContentType","req","originalBody","createResponse","stringBody","utils","_decode","name","toLowerCase","reduce","res","responseText","_request","_json","_multipart","json","skipOKCheck","status","statusText","error_description","description","multipart","boundary","_getContentType","match","parts","toString","_boundarySeparator","shift","pop","statusInfo","map","part","_isContentType","get","_multipartContentType","_isUrlEncoded","replace","headersAndBody","_bodySeparator","headersText","header","_headerSeparator","append","_Registry","_Registry2","_HttpClient","_registry","registry","mock","find","getResponse","_Mock","_Mock2","_mocks","add","clear","test","path","apiCall","authentication","access_token","token_type","expires_in","refresh_token","refresh_token_expires_in","scope","expireTime","Date","getTime","logout","presenceLoad","uri","extension","extensionNumber","activeCalls","presenceStatus","telephonyStatus","userStatus","dndStatus","extensionId","subscribeGeneric","expiresIn","date","eventFilters","expirationTime","toISOString","deliveryMode","transportType","encryption","address","subscriberKey","secretKey","creationTime","subscribeOnPresence","detailed","encryptionAlgorithm","encryptionKey","tokenRefresh","failure","_method","toUpperCase","_path","_delay","_status","_statusText","str","set","_Queue","_Queue2","_Auth","_Auth2","beforeLogin","loginSuccess","loginError","beforeRefresh","refreshSuccess","refreshError","beforeLogout","logoutSuccess","logoutError","_server","_appKey","_appSecret","_queue","_cacheId","_auth","auth","createUrl","builtUrl","hasHttp","addServer","_urlPrefix","_apiVersion","addMethod","addToken","accessToken","authUrl","_authorizeEndpoint","response_type","redirect_uri","redirectUri","client_id","state","brand_id","brandId","display","prompt","parseAuthRedirectUrl","qs","reverse","loggedIn","_ensureAuthentication","login","remember","access_token_ttl","_accessTokenTtl","refresh_token_ttl","_refreshTokenTtlRemember","_refreshTokenTtl","code","grant_type","username","password","endpointId","endpoint_id","_tokenRequest","_tokenEndpoint","setData","setRemember","refresh","isPaused","_isAccessTokenValid","pause","_refreshDelayMs","refreshToken","refreshTokenValid","resume","_clearCacheOnRefreshError","_revokeEndpoint","token","inflateRequest","skipAuthCheck","_authHeader","cancelAccessToken","send","post","put","Authorization","_apiKey","Content-Type","accessTokenValid","apiKey","btoa","Buffer","tokenType","cacheId","_promise","time","now","parseInt","_releaseTimeout","_pollInterval","newData","expire_time","refresh_token_expire_time","authData","forcedTokenType","refreshHandicapMs","forceAuthentication","_PubnubMockJs","_PubnubMockJs2","crypto_obj","PubnubMock","ready","subscribe","channel","unsubscribe","receiveMessage","msg","notification","removeSuccess","removeError","renewSuccess","renewError","subscribeSuccess","subscribeError","_timeout","_subscription","alive","_renewHandicapMs","setSubscription","subscription","_clearTimeout","_subscribeAtPubnub","_setTimeout","register","renew","addEventFilters","setEventFilters","concat","_getFullEventFilters","reset","remove","restoreFromCache","cacheKey","cachedSubscriptionData","_decrypt","decrypt","encryptKey","keyEncoding","keyLength","_notify","ssl","subscribe_key","bind","connect","global","wrap","innerFn","outerFn","self","tryLocsList","generator","Generator","context","Context","_invoke","makeInvokeMethod","tryCatch","type","err","GeneratorFunction","GeneratorFunctionPrototype","defineIteratorMethods","AwaitArgument","AsyncIterator","invoke","then","invokeNext","invokeThrow","unwrapped","enqueue","callInvokeWithMethodAndArg","previousPromise","domain","GenStateSuspendedStart","GenStateExecuting","GenStateCompleted","doneResult","delegate","iterator","returnMethod","record","info","done","GenStateSuspendedYield","resultName","nextLoc","dispatchException","ContinueSentinel","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","values","iterable","iteratorMethod","iteratorSymbol","isNaN","hasOwn","Symbol","inModule","runtime","Gp","displayName","isGeneratorFunction","genFun","ctor","mark","iter","object","skipTempReset","charAt","slice","rootEntry","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","catch","thrown","delegateYield"],"mappings":"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","file":"ringcentral.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"es6-promise\"), require(\"node-fetch\"), require(\"pubnub\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([, , \"pubnub\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"SDK\"] = factory(require(\"es6-promise\"), require(\"node-fetch\"), require(\"pubnub\"));\n\telse\n\t\troot[\"RingCentral\"] = root[\"RingCentral\"] || {}, root[\"RingCentral\"][\"SDK\"] = factory(root[undefined], root[undefined], root[undefined]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_4__, __WEBPACK_EXTERNAL_MODULE_5__, __WEBPACK_EXTERNAL_MODULE_6__) {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"es6-promise\"), require(\"node-fetch\"), require(\"pubnub\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([, , \"pubnub\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"SDK\"] = factory(require(\"es6-promise\"), require(\"node-fetch\"), require(\"pubnub\"));\n\telse\n\t\troot[\"RingCentral\"] = root[\"RingCentral\"] || {}, root[\"RingCentral\"][\"SDK\"] = factory(root[undefined], root[undefined], root[undefined]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_4__, __WEBPACK_EXTERNAL_MODULE_5__, __WEBPACK_EXTERNAL_MODULE_6__) {\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 = \"/build/\";\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\nmodule.exports = __webpack_require__(1);\n\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _coreUtils = __webpack_require__(2);\n\nvar Utils = _interopRequireWildcard(_coreUtils);\n\nvar _coreCache = __webpack_require__(7);\n\nvar _coreCache2 = _interopRequireDefault(_coreCache);\n\nvar _coreExternals = __webpack_require__(3);\n\nvar Externals = _interopRequireWildcard(_coreExternals);\n\nvar _coreObservable = __webpack_require__(8);\n\nvar _coreObservable2 = _interopRequireDefault(_coreObservable);\n\nvar _httpClient = __webpack_require__(9);\n\nvar _httpClient2 = _interopRequireDefault(_httpClient);\n\nvar _httpApiResponse = __webpack_require__(11);\n\nvar _httpApiResponse2 = _interopRequireDefault(_httpApiResponse);\n\nvar _httpUtils = __webpack_require__(10);\n\nvar HttpUtils = _interopRequireWildcard(_httpUtils);\n\nvar _mocksClientMock = __webpack_require__(12);\n\nvar _mocksClientMock2 = _interopRequireDefault(_mocksClientMock);\n\nvar _mocksMock = __webpack_require__(14);\n\nvar _mocksMock2 = _interopRequireDefault(_mocksMock);\n\nvar _mocksRegistry = __webpack_require__(13);\n\nvar _mocksRegistry2 = _interopRequireDefault(_mocksRegistry);\n\nvar _platformPlatform = __webpack_require__(15);\n\nvar _platformPlatform2 = _interopRequireDefault(_platformPlatform);\n\nvar _platformAuth = __webpack_require__(17);\n\nvar _platformAuth2 = _interopRequireDefault(_platformAuth);\n\nvar _platformQueue = __webpack_require__(16);\n\nvar _platformQueue2 = _interopRequireDefault(_platformQueue);\n\nvar _pubnubPubnubFactory = __webpack_require__(18);\n\nvar _pubnubPubnubFactory2 = _interopRequireDefault(_pubnubPubnubFactory);\n\nvar _subscriptionSubscription = __webpack_require__(20);\n\nvar _subscriptionSubscription2 = _interopRequireDefault(_subscriptionSubscription);\n\n__webpack_require__(21);\n\nvar SDK = (function () {\n _createClass(SDK, null, [{\n key: 'version',\n value: '2.0.0',\n enumerable: true\n }, {\n key: 'server',\n value: {\n sandbox: 'https://platform.devtest.ringcentral.com',\n production: 'https://platform.ringcentral.com'\n },\n\n /**\n * @constructor\n * @param {object} [options]\n * @param {string} [options.server]\n * @param {string} [options.cachePrefix]\n * @param {string} [options.appSecret]\n * @param {string} [options.appKey]\n * @param {string} [options.appName]\n * @param {string} [options.appVersion]\n * @param {string} [options.pubnubFactory]\n * @param {string} [options.client]\n */\n enumerable: true\n }]);\n\n function SDK(options) {\n _classCallCheck(this, SDK);\n\n options = options || {};\n\n this._cache = new _coreCache2['default'](Externals.localStorage, options.cachePrefix);\n\n this._client = options.client || new _httpClient2['default']();\n\n this._platform = new _platformPlatform2['default'](this._client, this._cache, options.server, options.appKey, options.appSecret);\n\n this._pubnubFactory = options.pubnubFactory || Externals.PUBNUB;\n }\n\n /**\n * @return {Platform}\n */\n\n SDK.prototype.platform = function platform() {\n return this._platform;\n };\n\n /**\n * @return {Subscription}\n */\n\n SDK.prototype.createSubscription = function createSubscription() {\n return new _subscriptionSubscription2['default'](this._pubnubFactory, this._platform, this._cache);\n };\n\n /**\n * @return {Cache}\n */\n\n SDK.prototype.cache = function cache() {\n return this._cache;\n };\n\n _createClass(SDK, null, [{\n key: 'core',\n value: {\n Cache: _coreCache2['default'],\n Observable: _coreObservable2['default'],\n Utils: Utils,\n Externals: Externals\n },\n enumerable: true\n }, {\n key: 'http',\n value: {\n Client: _httpClient2['default'],\n ApiResponse: _httpApiResponse2['default'],\n Utils: HttpUtils\n },\n enumerable: true\n }, {\n key: 'platform',\n value: {\n Auth: _platformAuth2['default'],\n Platform: _platformPlatform2['default'],\n Queue: _platformQueue2['default']\n },\n enumerable: true\n }, {\n key: 'subscription',\n value: {\n Subscription: _subscriptionSubscription2['default']\n },\n enumerable: true\n }, {\n key: 'mocks',\n value: {\n Client: _mocksClientMock2['default'],\n Registry: _mocksRegistry2['default'],\n Mock: _mocksMock2['default']\n },\n enumerable: true\n }, {\n key: 'pubnub',\n value: {\n PubnubMockFactory: _pubnubPubnubFactory2['default']\n },\n enumerable: true\n }]);\n\n return SDK;\n})();\n\nexports['default'] = SDK;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\nexports.queryStringify = queryStringify;\nexports.parseQueryString = parseQueryString;\nexports.isFunction = isFunction;\nexports.isArray = isArray;\nexports.poll = poll;\nexports.stopPolling = stopPolling;\nexports.isNodeJS = isNodeJS;\nexports.isBrowser = isBrowser;\nexports.delay = delay;\n\nvar _ExternalsJs = __webpack_require__(3);\n\n/**\n * TODO Replace with something better\n * @see https://github.com/joyent/node/blob/master/lib/querystring.js\n * @param {object} parameters\n * @returns {string}\n */\n\nfunction queryStringify(parameters) {\n\n var array = [];\n\n parameters = parameters || {};\n\n Object.keys(parameters).forEach(function (k) {\n\n var v = parameters[k];\n\n if (isArray(v)) {\n v.forEach(function (vv) {\n array.push(encodeURIComponent(k) + '=' + encodeURIComponent(vv));\n });\n } else {\n array.push(encodeURIComponent(k) + '=' + encodeURIComponent(v));\n }\n });\n\n return array.join('&');\n}\n\n/**\n * TODO Replace with something better\n * @see https://github.com/joyent/node/blob/master/lib/querystring.js\n * @param {string} queryString\n * @returns {object}\n */\n\nfunction parseQueryString(queryString) {\n\n var argsParsed = {};\n\n queryString.split('&').forEach(function (arg) {\n\n arg = decodeURIComponent(arg);\n\n if (arg.indexOf('=') == -1) {\n\n argsParsed[arg.trim()] = true;\n } else {\n\n var pair = arg.split('='),\n key = pair[0].trim(),\n value = pair[1].trim();\n\n if (key in argsParsed) {\n if (key in argsParsed && !isArray(argsParsed[key])) argsParsed[key] = [argsParsed[key]];\n argsParsed[key].push(value);\n } else {\n argsParsed[key] = value;\n }\n }\n });\n\n return argsParsed;\n}\n\n/**\n * @param obj\n * @return {boolean}\n */\n\nfunction isFunction(obj) {\n return typeof obj === \"function\";\n}\n\n/**\n * @param obj\n * @return {boolean}\n */\n\nfunction isArray(obj) {\n return Array.isArray ? Array.isArray(obj) : typeof obj === \"array\";\n}\n\n/**\n * @param fn\n * @param interval\n * @param timeout\n */\n\nfunction poll(fn, interval, timeout) {\n //NodeJS.Timer|number\n\n module.exports.stopPolling(timeout);\n\n interval = interval || 1000;\n\n var next = function next(delay) {\n\n delay = delay || interval;\n\n interval = delay;\n\n return setTimeout(function () {\n\n fn(next, delay);\n }, delay);\n };\n\n return next();\n}\n\nfunction stopPolling(timeout) {\n if (timeout) clearTimeout(timeout);\n}\n\nfunction isNodeJS() {\n return typeof process !== 'undefined';\n}\n\nfunction isBrowser() {\n return typeof window !== 'undefined';\n}\n\nfunction delay(timeout) {\n return new _ExternalsJs.Promise(function (resolve, reject) {\n setTimeout(function () {\n resolve(null);\n }, timeout);\n });\n}\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _es6Promise = __webpack_require__(4);\n\nvar _es6Promise2 = _interopRequireDefault(_es6Promise);\n\nvar _nodeFetch = __webpack_require__(5);\n\nvar _nodeFetch2 = _interopRequireDefault(_nodeFetch);\n\nvar _pubnub = __webpack_require__(6);\n\nvar _pubnub2 = _interopRequireDefault(_pubnub);\n\nvar Promise = _es6Promise2['default'] && _es6Promise2['default'].Promise || window.Promise;\n\nexports.Promise = Promise;\nvar fetch = _nodeFetch2['default'] || window.fetch;\nexports.fetch = fetch;\nvar Request = fetch.Request || window.Request;\nexports.Request = Request;\nvar Response = fetch.Response || window.Response;\nexports.Response = Response;\nvar Headers = fetch.Headers || window.Headers;\n\nexports.Headers = Headers;\nvar PUBNUB = _pubnub2['default'] || window.PUBNUB;\n\nexports.PUBNUB = PUBNUB;\nvar localStorage = typeof window !== 'undefined' && typeof window.localStorage !== 'undefined' ? window.localStorage : {};\nexports.localStorage = localStorage;\n\n/***/ },\n/* 4 */\n/***/ function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_4__;\n\n/***/ },\n/* 5 */\n/***/ function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_5__;\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_6__;\n\n/***/ },\n/* 7 */\n/***/ function(module, exports) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar Cache = (function () {\n _createClass(Cache, null, [{\n key: 'defaultPrefix',\n value: 'rc-',\n enumerable: true\n }]);\n\n function Cache(storage, prefix) {\n _classCallCheck(this, Cache);\n\n this.setPrefix(prefix);\n this._storage = storage;\n }\n\n Cache.prototype.setPrefix = function setPrefix(prefix) {\n this._prefix = prefix || Cache.defaultPrefix;\n return this;\n };\n\n Cache.prototype.setItem = function setItem(key, data) {\n this._storage[this._prefixKey(key)] = JSON.stringify(data);\n return this;\n };\n\n Cache.prototype.removeItem = function removeItem(key) {\n delete this._storage[this._prefixKey(key)];\n return this;\n };\n\n Cache.prototype.getItem = function getItem(key) {\n var item = this._storage[this._prefixKey(key)];\n if (!item) return null;\n return JSON.parse(item);\n };\n\n Cache.prototype.clean = function clean() {\n\n for (var key in this._storage) {\n\n if (!this._storage.hasOwnProperty(key)) continue;\n\n if (key.indexOf(this._prefix) === 0) {\n delete this._storage[key];\n }\n }\n\n return this;\n };\n\n Cache.prototype._prefixKey = function _prefixKey(key) {\n return this._prefix + key;\n };\n\n return Cache;\n})();\n\nexports['default'] = Cache;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 8 */\n/***/ function(module, exports) {\n\n'use strict';\n\nexports.__esModule = true;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar Observable = (function () {\n function Observable() {\n _classCallCheck(this, Observable);\n\n this.off();\n }\n\n Observable.prototype.hasListeners = function hasListeners(event) {\n return event in this._listeners;\n };\n\n Observable.prototype.on = function on(events, callback) {\n var _this = this;\n\n if (typeof events == 'string') events = [events];\n if (!events) throw new Error('No events to subscribe to');\n if (typeof callback !== 'function') throw new Error('Callback must be a function');\n\n events.forEach(function (event) {\n\n if (!_this.hasListeners(event)) _this._listeners[event] = [];\n\n _this._listeners[event].push(callback);\n });\n\n return this;\n };\n\n Observable.prototype.emit = function emit(event) {\n var _this2 = this;\n\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var result = null;\n\n if (!this.hasListeners(event)) return null;\n\n this._listeners[event].some(function (callback) {\n\n result = callback.apply(_this2, args);\n return result === false;\n });\n\n return result;\n };\n\n Observable.prototype.off = function off(event, callback) {\n var _this3 = this;\n\n if (!event) {\n\n this._listeners = {};\n } else {\n\n if (!callback) {\n\n delete this._listeners[event];\n } else {\n\n if (!this.hasListeners(event)) return this;\n\n this._listeners[event].forEach(function (cb, i) {\n\n if (cb === callback) delete _this3._listeners[event][i];\n });\n }\n }\n\n return this;\n };\n\n return Observable;\n})();\n\nexports['default'] = Observable;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 9 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _coreExternals = __webpack_require__(3);\n\nvar _coreUtils = __webpack_require__(2);\n\nvar _Utils = __webpack_require__(10);\n\nvar _coreObservable = __webpack_require__(8);\n\nvar _coreObservable2 = _interopRequireDefault(_coreObservable);\n\nvar _ApiResponse = __webpack_require__(11);\n\nvar _ApiResponse2 = _interopRequireDefault(_ApiResponse);\n\nvar Client = (function (_Observable) {\n _inherits(Client, _Observable);\n\n function Client() {\n _classCallCheck(this, Client);\n\n _Observable.apply(this, arguments);\n\n this.events = {\n beforeRequest: 'beforeRequest',\n requestSuccess: 'requestSuccess',\n requestError: 'requestError'\n };\n }\n\n /**\n * @name IApiError\n * @property {string} stack\n * @property {string} originalMessage\n * @property {ApiResponse} apiResponse\n */\n\n /**\n * @param {Request} request\n * @return {Promise}\n */\n\n Client.prototype.sendRequest = function sendRequest(request) {\n var apiResponse;\n return regeneratorRuntime.async(function sendRequest$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n apiResponse = new _ApiResponse2['default'](request);\n context$2$0.prev = 1;\n\n //TODO Stop request if listeners return false\n this.emit(this.events.beforeRequest, apiResponse);\n\n context$2$0.next = 5;\n return regeneratorRuntime.awrap(this._loadResponse(request));\n\n case 5:\n apiResponse._response = context$2$0.sent;\n\n if (!(apiResponse._isMultipart() || apiResponse._isJson())) {\n context$2$0.next = 10;\n break;\n }\n\n context$2$0.next = 9;\n return regeneratorRuntime.awrap(apiResponse.response().text());\n\n case 9:\n apiResponse._text = context$2$0.sent;\n\n case 10:\n if (apiResponse.ok()) {\n context$2$0.next = 12;\n break;\n }\n\n throw new Error('Response has unsuccessful status');\n\n case 12:\n\n this.emit(this.events.requestSuccess, apiResponse);\n\n return context$2$0.abrupt('return', apiResponse);\n\n case 16:\n context$2$0.prev = 16;\n context$2$0.t0 = context$2$0['catch'](1);\n\n if (!context$2$0.t0.apiResponse) context$2$0.t0 = this.makeError(context$2$0.t0, apiResponse);\n\n this.emit(this.events.requestError, context$2$0.t0);\n\n throw context$2$0.t0;\n\n case 21:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[1, 16]]);\n };\n\n /**\n * @param {Request} request\n * @return {Promise}\n * @private\n */\n\n Client.prototype._loadResponse = function _loadResponse(request) {\n return regeneratorRuntime.async(function _loadResponse$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.next = 2;\n return regeneratorRuntime.awrap(_coreExternals.fetch.call(null, request));\n\n case 2:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 3:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n /**\n * Wraps the JS Error object with transaction information\n * @param {Error|IApiError} e\n * @param {ApiResponse} apiResponse\n * @return {IApiError}\n */\n\n Client.prototype.makeError = function makeError(e, apiResponse) {\n\n // Wrap only if regular error\n if (!e.hasOwnProperty('apiResponse') && !e.hasOwnProperty('originalMessage')) {\n\n e.apiResponse = apiResponse;\n e.originalMessage = e.message;\n e.message = apiResponse && apiResponse.error(true) || e.originalMessage;\n }\n\n return e;\n };\n\n /**\n *\n * @param {object} init\n * @param {object} [init.url]\n * @param {object} [init.body]\n * @param {string} [init.method]\n * @param {object} [init.query]\n * @param {object} [init.headers]\n * @return {Request}\n */\n\n Client.prototype.createRequest = function createRequest(init) {\n\n init = init || {};\n init.headers = init.headers || {};\n\n // Sanity checks\n if (!init.url) throw new Error('Url is not defined');\n if (!init.method) init.method = 'GET';\n if (init.method && Client._allowedMethods.indexOf(init.method) < 0) throw new Error('Method has wrong value: ' + init.method);\n\n // Defaults\n init.credentials = init.credentials || 'include';\n init.mode = init.mode || 'cors';\n\n // Append Query String\n if (init.query) {\n init.url = init.url + (init.url.indexOf('?') > -1 ? '&' : '?') + _coreUtils.queryStringify(init.query);\n }\n\n if (!_Utils.findHeaderName('Accept', init.headers)) {\n init.headers['Accept'] = _ApiResponse2['default']._jsonContentType;\n }\n\n // Serialize body\n //TODO Check that body is a plain object\n if (typeof init.body !== 'string' || !init.body) {\n\n var contentTypeHeaderName = _Utils.findHeaderName(_ApiResponse2['default']._contentType, init.headers);\n\n if (!contentTypeHeaderName) {\n contentTypeHeaderName = _ApiResponse2['default']._contentType;\n init.headers[contentTypeHeaderName] = _ApiResponse2['default']._jsonContentType;\n }\n\n var contentType = init.headers[contentTypeHeaderName];\n\n // Assign a new encoded body\n if (contentType.indexOf(_ApiResponse2['default']._jsonContentType) > -1) {\n init.body = JSON.stringify(init.body);\n } else if (contentType.indexOf(_ApiResponse2['default']._urlencodedContentType) > -1) {\n init.body = _coreUtils.queryStringify(init.body);\n }\n }\n\n // Create a request with encoded body\n var req = new _coreExternals.Request(init.url, init);\n\n // Keep the original body accessible directly (for mocks)\n req.originalBody = init.body;\n\n return req;\n };\n\n _createClass(Client, null, [{\n key: '_allowedMethods',\n value: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'],\n enumerable: true\n }]);\n\n return Client;\n})(_coreObservable2['default']);\n\nexports['default'] = Client;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 10 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\nexports.createResponse = createResponse;\nexports.findHeaderName = findHeaderName;\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nvar _coreExternals = __webpack_require__(3);\n\nvar _coreUtils = __webpack_require__(2);\n\nvar utils = _interopRequireWildcard(_coreUtils);\n\n/**\n * Creates a response\n * @param stringBody\n * @param init\n * @return {Response}\n */\n\nfunction createResponse(stringBody, init) {\n\n init = init || {};\n\n var response = new _coreExternals.Response(stringBody, init);\n\n //TODO Wait for https://github.com/bitinn/node-fetch/issues/38\n if (utils.isNodeJS()) {\n\n response._text = stringBody;\n response._decode = function () {\n return this._text;\n };\n }\n\n return response;\n}\n\nfunction findHeaderName(name, headers) {\n name = name.toLowerCase();\n return Object.keys(headers).reduce(function (res, key) {\n if (res) return res;\n if (name == key.toLowerCase()) return key;\n return res;\n }, null);\n}\n\n/***/ },\n/* 11 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _coreExternals = __webpack_require__(3);\n\nvar _Utils = __webpack_require__(10);\n\nvar utils = _interopRequireWildcard(_Utils);\n\nvar ApiResponse = (function () {\n _createClass(ApiResponse, null, [{\n key: '_contentType',\n value: 'Content-Type',\n enumerable: true\n }, {\n key: '_jsonContentType',\n value: 'application/json',\n enumerable: true\n }, {\n key: '_multipartContentType',\n value: 'multipart/mixed',\n enumerable: true\n }, {\n key: '_urlencodedContentType',\n value: 'application/x-www-form-urlencoded',\n enumerable: true\n }, {\n key: '_headerSeparator',\n value: ':',\n enumerable: true\n }, {\n key: '_bodySeparator',\n value: '\\n\\n',\n enumerable: true\n }, {\n key: '_boundarySeparator',\n value: '--',\n\n /**\n * @param {Request} request\n * @param {Response} response\n * @param {string} responseText\n */\n enumerable: true\n }]);\n\n function ApiResponse(request, response, responseText) {\n _classCallCheck(this, ApiResponse);\n\n /** @type {Request} */\n this._request = request;\n\n /** @type {Response} */\n this._response = response;\n\n this._text = responseText;\n this._json = null;\n this._multipart = [];\n }\n\n /**\n * @return {Response}\n */\n\n ApiResponse.prototype.response = function response() {\n return this._response;\n };\n\n /**\n * @return {Request}\n */\n\n ApiResponse.prototype.request = function request() {\n return this._request;\n };\n\n /**\n * @return {boolean}\n */\n\n ApiResponse.prototype.ok = function ok() {\n return this._response && this._response.ok;\n };\n\n /**\n * @return {string}\n */\n\n ApiResponse.prototype.text = function text() {\n if (!this._isJson() && !this._isMultipart()) throw new Error('Response is not text');\n return this._text;\n };\n\n /**\n * @return {object}\n */\n\n ApiResponse.prototype.json = function json() {\n if (!this._isJson()) throw new Error('Response is not JSON');\n if (!this._json) {\n this._json = this._text ? JSON.parse(this._text) : null;\n }\n return this._json;\n };\n\n /**\n * @param [skipOKCheck]\n * @return {string}\n */\n\n ApiResponse.prototype.error = function error(skipOKCheck) {\n\n if (this.ok() && !skipOKCheck) return null;\n\n var message = (this._response && this._response.status ? this._response.status + ' ' : '') + (this._response && this._response.statusText ? this._response.statusText : '');\n\n try {\n\n if (this.json().message) message = this.json().message;\n if (this.json().error_description) message = this.json().error_description;\n if (this.json().description) message = this.json().description;\n } catch (e) {}\n\n return message;\n };\n\n /**\n * @return {ApiResponse[]}\n */\n\n ApiResponse.prototype.multipart = function multipart() {\n\n if (!this._isMultipart()) throw new Error('Response is not multipart');\n\n if (!this._multipart.length) {\n\n // Step 1. Split multipart response\n\n var text = this.text();\n\n if (!text) throw new Error('No response body');\n\n var boundary = this._getContentType().match(/boundary=([^;]+)/i)[1];\n\n if (!boundary) throw new Error('Cannot find boundary');\n\n var parts = text.toString().split(ApiResponse._boundarySeparator + boundary);\n\n if (parts[0].trim() === '') parts.shift();\n if (parts[parts.length - 1].trim() == ApiResponse._boundarySeparator) parts.pop();\n\n if (parts.length < 1) throw new Error('No parts in body');\n\n // Step 2. Parse status info\n\n var statusInfo = ApiResponse.create(parts.shift(), this._response.status, this._response.statusText).json();\n\n // Step 3. Parse all other parts\n\n this._multipart = parts.map(function (part, i) {\n\n var status = statusInfo.response[i].status;\n\n return ApiResponse.create(part, status);\n });\n }\n\n return this._multipart;\n };\n\n ApiResponse.prototype._isContentType = function _isContentType(contentType) {\n return this._getContentType().indexOf(contentType) > -1;\n };\n\n ApiResponse.prototype._getContentType = function _getContentType() {\n return this._response.headers.get(ApiResponse._contentType) || '';\n };\n\n ApiResponse.prototype._isMultipart = function _isMultipart() {\n return this._isContentType(ApiResponse._multipartContentType);\n };\n\n ApiResponse.prototype._isUrlEncoded = function _isUrlEncoded() {\n return this._isContentType(ApiResponse._urlencodedContentType);\n };\n\n ApiResponse.prototype._isJson = function _isJson() {\n return this._isContentType(ApiResponse._jsonContentType);\n };\n\n /**\n * Method is used to create ApiResponse object from string parts of multipart/mixed response\n * @param {string} [text]\n * @param {number} [status]\n * @param {string} [statusText]\n * @return {ApiResponse}\n */\n\n ApiResponse.create = function create(text, status, statusText) {\n\n text = text || '';\n status = status || 200;\n statusText = statusText || 'OK';\n\n text = text.replace(/\\r/g, '');\n\n var headers = new _coreExternals.Headers(),\n headersAndBody = text.split(ApiResponse._bodySeparator),\n headersText = headersAndBody.length > 1 ? headersAndBody.shift() : '';\n\n text = headersAndBody.join(ApiResponse._bodySeparator);\n\n (headersText || '').split('\\n').forEach(function (header) {\n\n var split = header.trim().split(ApiResponse._headerSeparator),\n key = split.shift().trim(),\n value = split.join(ApiResponse._headerSeparator).trim();\n\n if (key) headers.append(key, value);\n });\n\n return new ApiResponse(null, utils.createResponse(text, {\n headers: headers,\n status: status,\n statusText: statusText\n }), text);\n };\n\n return ApiResponse;\n})();\n\nexports['default'] = ApiResponse;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 12 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _Registry = __webpack_require__(13);\n\nvar _Registry2 = _interopRequireDefault(_Registry);\n\nvar _httpClient = __webpack_require__(9);\n\nvar _httpClient2 = _interopRequireDefault(_httpClient);\n\nvar Client = (function (_HttpClient) {\n _inherits(Client, _HttpClient);\n\n function Client() {\n _classCallCheck(this, Client);\n\n _HttpClient.call(this);\n this._registry = new _Registry2['default']();\n }\n\n Client.prototype.registry = function registry() {\n return this._registry;\n };\n\n Client.prototype._loadResponse = function _loadResponse(request) {\n var mock;\n return regeneratorRuntime.async(function _loadResponse$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n mock = this._registry.find(request);\n context$2$0.next = 3;\n return regeneratorRuntime.awrap(mock.getResponse(request));\n\n case 3:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 4:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n return Client;\n})(_httpClient2['default']);\n\nexports['default'] = Client;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 13 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _Mock = __webpack_require__(14);\n\nvar _Mock2 = _interopRequireDefault(_Mock);\n\nvar Registry = (function () {\n function Registry() {\n _classCallCheck(this, Registry);\n\n this._mocks = [];\n }\n\n Registry.prototype.add = function add(mock) {\n this._mocks.push(mock);\n return this;\n };\n\n Registry.prototype.clear = function clear() {\n this._mocks = [];\n return this;\n };\n\n Registry.prototype.find = function find(request) {\n\n //console.log('Registry is looking for', request);\n\n var mock = this._mocks.shift();\n\n if (!mock) throw new Error('No mock in registry for request ' + request.method + ' ' + request.url);\n\n if (!mock.test(request)) throw new Error('Wrong request ' + request.method + ' ' + request.url + ' for expected mock ' + mock.method() + ' ' + mock.path());\n\n return mock;\n };\n\n Registry.prototype.apiCall = function apiCall(method, path, response, status, statusText) {\n\n this.add(new _Mock2['default'](method, path, response, status, statusText));\n\n return this;\n };\n\n Registry.prototype.authentication = function authentication() {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'access_token': 'ACCESS_TOKEN',\n 'token_type': 'bearer',\n 'expires_in': 3600,\n 'refresh_token': 'REFRESH_TOKEN',\n 'refresh_token_expires_in': 60480,\n 'scope': 'SMS RCM Foo Boo',\n 'expireTime': new Date().getTime() + 3600000\n });\n\n return this;\n };\n\n Registry.prototype.logout = function logout() {\n\n this.apiCall('POST', '/restapi/oauth/revoke', {});\n\n return this;\n };\n\n Registry.prototype.presenceLoad = function presenceLoad(id) {\n\n this.apiCall('GET', '/restapi/v1.0/account/~/extension/' + id + '/presence', {\n \"uri\": \"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/\" + id + \"/presence\",\n \"extension\": {\n \"uri\": \"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/\" + id,\n \"id\": id,\n \"extensionNumber\": \"101\"\n },\n \"activeCalls\": [],\n \"presenceStatus\": \"Available\",\n \"telephonyStatus\": \"Ringing\",\n \"userStatus\": \"Available\",\n \"dndStatus\": \"TakeAllCalls\",\n \"extensionId\": id\n });\n\n return this;\n };\n\n Registry.prototype.subscribeGeneric = function subscribeGeneric(expiresIn) {\n\n expiresIn = expiresIn || 15 * 60 * 60;\n\n var date = new Date();\n\n this.apiCall('POST', '/restapi/v1.0/subscription', {\n 'eventFilters': ['/restapi/v1.0/account/~/extension/~/presence'],\n 'expirationTime': new Date(date.getTime() + expiresIn * 1000).toISOString(),\n 'expiresIn': expiresIn,\n 'deliveryMode': {\n 'transportType': 'PubNub',\n 'encryption': false,\n 'address': '123_foo',\n 'subscriberKey': 'sub-c-foo',\n 'secretKey': 'sec-c-bar'\n },\n 'id': 'foo-bar-baz',\n 'creationTime': date.toISOString(),\n 'status': 'Active',\n 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz'\n });\n\n return this;\n };\n\n Registry.prototype.subscribeOnPresence = function subscribeOnPresence(id, detailed) {\n\n id = id || '1';\n\n var date = new Date();\n\n this.apiCall('POST', '/restapi/v1.0/subscription', {\n 'eventFilters': ['/restapi/v1.0/account/~/extension/' + id + '/presence' + (detailed ? '?detailedTelephonyState=true' : '')],\n 'expirationTime': new Date(date.getTime() + 15 * 60 * 60 * 1000).toISOString(),\n 'deliveryMode': {\n 'transportType': 'PubNub',\n 'encryption': true,\n 'address': '123_foo',\n 'subscriberKey': 'sub-c-foo',\n 'secretKey': 'sec-c-bar',\n 'encryptionAlgorithm': 'AES',\n 'encryptionKey': 'VQwb6EVNcQPBhE/JgFZ2zw=='\n },\n 'creationTime': date.toISOString(),\n 'id': 'foo-bar-baz',\n 'status': 'Active',\n 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz'\n });\n\n return this;\n };\n\n Registry.prototype.tokenRefresh = function tokenRefresh(failure) {\n\n if (!failure) {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'access_token': 'ACCESS_TOKEN_FROM_REFRESH',\n 'token_type': 'bearer',\n 'expires_in': 3600,\n 'refresh_token': 'REFRESH_TOKEN_FROM_REFRESH',\n 'refresh_token_expires_in': 60480,\n 'scope': 'SMS RCM Foo Boo'\n });\n } else {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'message': 'Wrong token',\n 'error_description': 'Wrong token',\n 'description': 'Wrong token'\n }, 400);\n }\n\n return this;\n };\n\n return Registry;\n})();\n\nexports['default'] = Registry;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 14 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _httpApiResponse = __webpack_require__(11);\n\nvar _httpApiResponse2 = _interopRequireDefault(_httpApiResponse);\n\nvar _coreUtils = __webpack_require__(2);\n\nvar _httpUtils = __webpack_require__(10);\n\nvar Mock = (function () {\n function Mock(method, path, json, status, statusText, delay) {\n _classCallCheck(this, Mock);\n\n this._method = method.toUpperCase();\n this._path = path;\n this._json = json || {};\n this._delay = delay || 10;\n this._status = status || 200;\n this._statusText = statusText || 'OK';\n }\n\n Mock.prototype.path = function path() {\n return this._path;\n };\n\n Mock.prototype.method = function method() {\n return this._method;\n };\n\n Mock.prototype.test = function test(request) {\n\n return request.url.indexOf(this._path) > -1 && request.method.toUpperCase() == this._method;\n };\n\n Mock.prototype.getResponse = function getResponse(request) {\n return regeneratorRuntime.async(function getResponse$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.next = 2;\n return regeneratorRuntime.awrap(_coreUtils.delay(this._delay));\n\n case 2:\n return context$2$0.abrupt('return', this.createResponse(this._json));\n\n case 3:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n Mock.prototype.createResponse = function createResponse(json, init) {\n\n init = init || {};\n\n init.status = init.status || this._status;\n init.statusText = init.statusText || this._statusText;\n\n var str = JSON.stringify(json),\n res = _httpUtils.createResponse(str, init);\n\n res.headers.set(_httpApiResponse2['default']._contentType, _httpApiResponse2['default']._jsonContentType);\n\n return res;\n };\n\n return Mock;\n})();\n\nexports['default'] = Mock;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 15 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _coreObservable = __webpack_require__(8);\n\nvar _coreObservable2 = _interopRequireDefault(_coreObservable);\n\nvar _Queue = __webpack_require__(16);\n\nvar _Queue2 = _interopRequireDefault(_Queue);\n\nvar _Auth = __webpack_require__(17);\n\nvar _Auth2 = _interopRequireDefault(_Auth);\n\nvar _coreExternals = __webpack_require__(3);\n\nvar _coreUtils = __webpack_require__(2);\n\nvar Platform = (function (_Observable) {\n _inherits(Platform, _Observable);\n\n _createClass(Platform, null, [{\n key: '_urlPrefix',\n value: '/restapi',\n enumerable: true\n }, {\n key: '_apiVersion',\n value: 'v1.0',\n enumerable: true\n }, {\n key: '_accessTokenTtl',\n value: null,\n // Platform server by default sets it to 60 * 60 = 1 hour\n enumerable: true\n }, {\n key: '_refreshTokenTtl',\n value: 10 * 60 * 60,\n // 10 hours\n enumerable: true\n }, {\n key: '_refreshTokenTtlRemember',\n value: 7 * 24 * 60 * 60,\n // 1 week\n enumerable: true\n }, {\n key: '_tokenEndpoint',\n value: '/restapi/oauth/token',\n enumerable: true\n }, {\n key: '_revokeEndpoint',\n value: '/restapi/oauth/revoke',\n enumerable: true\n }, {\n key: '_authorizeEndpoint',\n value: '/restapi/oauth/authorize',\n enumerable: true\n }, {\n key: '_refreshDelayMs',\n value: 100,\n enumerable: true\n }, {\n key: '_cacheId',\n value: 'platform',\n enumerable: true\n }, {\n key: '_clearCacheOnRefreshError',\n value: true,\n enumerable: true\n }]);\n\n function Platform(client, cache, server, appKey, appSecret) {\n _classCallCheck(this, Platform);\n\n _Observable.call(this);\n\n this.events = {\n beforeLogin: 'beforeLogin',\n loginSuccess: 'loginSuccess',\n loginError: 'loginError',\n beforeRefresh: 'beforeRefresh',\n refreshSuccess: 'refreshSuccess',\n refreshError: 'refreshError',\n beforeLogout: 'beforeLogout',\n logoutSuccess: 'logoutSuccess',\n logoutError: 'logoutError'\n };\n this._server = server;\n this._appKey = appKey;\n this._appSecret = appSecret;\n\n /** @type {Cache} */\n this._cache = cache;\n\n /** @type {Client} */\n this._client = client;\n\n this._queue = new _Queue2['default'](this._cache, Platform._cacheId + '-refresh');\n\n this._auth = new _Auth2['default'](this._cache, Platform._cacheId);\n }\n\n /**\n * @return {Auth}\n */\n\n Platform.prototype.auth = function auth() {\n return this._auth;\n };\n\n /**\n * @return {Client}\n */\n\n Platform.prototype.client = function client() {\n return this._client;\n };\n\n /**\n * @param {string} path\n * @param {object} [options]\n * @param {boolean} [options.addServer]\n * @param {string} [options.addMethod]\n * @param {boolean} [options.addToken]\n * @return {string}\n */\n\n Platform.prototype.createUrl = function createUrl(path, options) {\n\n path = path || '';\n options = options || {};\n\n var builtUrl = '',\n hasHttp = path.indexOf('http://') != -1 || path.indexOf('https://') != -1;\n\n if (options.addServer && !hasHttp) builtUrl += this._server;\n\n if (path.indexOf(Platform._urlPrefix) == -1 && !hasHttp) builtUrl += Platform._urlPrefix + '/' + Platform._apiVersion;\n\n builtUrl += path;\n\n if (options.addMethod || options.addToken) builtUrl += path.indexOf('?') > -1 ? '&' : '?';\n\n if (options.addMethod) builtUrl += '_method=' + options.addMethod;\n if (options.addToken) builtUrl += (options.addMethod ? '&' : '') + 'access_token=' + this._auth.accessToken();\n\n return builtUrl;\n };\n\n /**\n * @param {string} options.redirectUri\n * @param {string} options.state\n * @param {string} options.brandId\n * @param {string} options.display\n * @param {string} options.prompt\n * @return {string}\n */\n\n Platform.prototype.authUrl = function authUrl(options) {\n\n options = options || {};\n\n return this.createUrl(Platform._authorizeEndpoint + '?' + _coreUtils.queryStringify({\n 'response_type': 'code',\n 'redirect_uri': options.redirectUri || '',\n 'client_id': this._appKey,\n 'state': options.state || '',\n 'brand_id': options.brandId || '',\n 'display': options.display || '',\n 'prompt': options.prompt || ''\n }), { addServer: true });\n };\n\n /**\n * @param {string} url\n * @return {Object}\n */\n\n Platform.prototype.parseAuthRedirectUrl = function parseAuthRedirectUrl(url) {\n\n var qs = _coreUtils.parseQueryString(url.split('?').reverse()[0]),\n error = qs.error_description || qs.error;\n\n if (error) {\n var e = new Error(error);\n e.error = qs.error;\n throw e;\n }\n\n return qs;\n };\n\n /**\n * @return {Promise}\n */\n\n Platform.prototype.loggedIn = function loggedIn() {\n return regeneratorRuntime.async(function loggedIn$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n context$2$0.next = 3;\n return regeneratorRuntime.awrap(this._ensureAuthentication());\n\n case 3:\n return context$2$0.abrupt('return', true);\n\n case 6:\n context$2$0.prev = 6;\n context$2$0.t0 = context$2$0['catch'](0);\n return context$2$0.abrupt('return', false);\n\n case 9:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 6]]);\n };\n\n /**\n * @param {string} options.username\n * @param {string} options.password\n * @param {string} options.extension\n * @param {string} options.code\n * @param {string} options.redirectUri\n * @param {string} options.endpointId\n * @returns {Promise}\n */\n\n Platform.prototype.login = function login(options) {\n var body, apiResponse, json;\n return regeneratorRuntime.async(function login$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n\n options = options || {};\n\n options.remember = options.remember || false;\n\n this.emit(this.events.beforeLogin);\n\n body = {\n \"access_token_ttl\": Platform._accessTokenTtl,\n \"refresh_token_ttl\": options.remember ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl\n };\n\n if (!options.code) {\n\n body.grant_type = 'password';\n body.username = options.username;\n body.password = options.password;\n body.extension = options.extension || '';\n } else if (options.code) {\n\n body.grant_type = 'authorization_code';\n body.code = options.code;\n body.redirect_uri = options.redirectUri;\n //body.client_id = this.getCredentials().key; // not needed\n }\n\n if (options.endpointId) body.endpoint_id = options.endpointId;\n\n context$2$0.next = 9;\n return regeneratorRuntime.awrap(this._tokenRequest(Platform._tokenEndpoint, body));\n\n case 9:\n apiResponse = context$2$0.sent;\n json = apiResponse.json();\n\n this._auth.setData(json).setRemember(options.remember);\n\n this.emit(this.events.loginSuccess, apiResponse);\n\n return context$2$0.abrupt('return', apiResponse);\n\n case 16:\n context$2$0.prev = 16;\n context$2$0.t0 = context$2$0['catch'](0);\n\n this._cache.clean();\n\n this.emit(this.events.loginError, context$2$0.t0);\n\n throw context$2$0.t0;\n\n case 21:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 16]]);\n };\n\n /**\n * @returns {Promise}\n */\n\n Platform.prototype.refresh = function refresh() {\n var res, json;\n return regeneratorRuntime.async(function refresh$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n\n this.emit(this.events.beforeRefresh);\n\n if (!this._queue.isPaused()) {\n context$2$0.next = 9;\n break;\n }\n\n context$2$0.next = 5;\n return regeneratorRuntime.awrap(this._queue.poll());\n\n case 5:\n if (this._isAccessTokenValid()) {\n context$2$0.next = 7;\n break;\n }\n\n throw new Error('Automatic authentification timeout');\n\n case 7:\n\n this.emit(this.events.refreshSuccess, null);\n\n return context$2$0.abrupt('return', null);\n\n case 9:\n\n this._queue.pause();\n\n // Make sure all existing AJAX calls had a chance to reach the server\n context$2$0.next = 12;\n return regeneratorRuntime.awrap(_coreUtils.delay(Platform._refreshDelayMs));\n\n case 12:\n if (this._auth.refreshToken()) {\n context$2$0.next = 14;\n break;\n }\n\n throw new Error('Refresh token is missing');\n\n case 14:\n if (this._auth.refreshTokenValid()) {\n context$2$0.next = 16;\n break;\n }\n\n throw new Error('Refresh token has expired');\n\n case 16:\n if (this._queue.isPaused()) {\n context$2$0.next = 18;\n break;\n }\n\n throw new Error('Queue was resumed before refresh call');\n\n case 18:\n context$2$0.next = 20;\n return regeneratorRuntime.awrap(this._tokenRequest(Platform._tokenEndpoint, {\n \"grant_type\": \"refresh_token\",\n \"refresh_token\": this._auth.refreshToken(),\n \"access_token_ttl\": Platform._accessTokenTtl,\n \"refresh_token_ttl\": this._auth.remember() ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl\n }));\n\n case 20:\n res = context$2$0.sent;\n json = res.json();\n\n if (json.access_token) {\n context$2$0.next = 24;\n break;\n }\n\n throw this._client.makeError(new Error('Malformed OAuth response'), res);\n\n case 24:\n\n this._auth.setData(json);\n this._queue.resume();\n\n this.emit(this.events.refreshSuccess, res);\n\n return context$2$0.abrupt('return', res);\n\n case 30:\n context$2$0.prev = 30;\n context$2$0.t0 = context$2$0['catch'](0);\n\n context$2$0.t0 = this._client.makeError(context$2$0.t0);\n\n if (Platform._clearCacheOnRefreshError) {\n this._cache.clean();\n }\n\n this.emit(this.events.refreshError, context$2$0.t0);\n\n throw context$2$0.t0;\n\n case 36:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 30]]);\n };\n\n /**\n * @returns {Promise}\n */\n\n Platform.prototype.logout = function logout() {\n var res;\n return regeneratorRuntime.async(function logout$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n\n this.emit(this.events.beforeLogout);\n\n this._queue.pause();\n\n context$2$0.next = 5;\n return regeneratorRuntime.awrap(this._tokenRequest(Platform._revokeEndpoint, {\n token: this._auth.accessToken()\n }));\n\n case 5:\n res = context$2$0.sent;\n\n this._queue.resume();\n this._cache.clean();\n\n this.emit(this.events.logoutSuccess, res);\n\n return context$2$0.abrupt('return', res);\n\n case 12:\n context$2$0.prev = 12;\n context$2$0.t0 = context$2$0['catch'](0);\n\n this._queue.resume();\n\n this.emit(this.events.logoutError, context$2$0.t0);\n\n throw context$2$0.t0;\n\n case 17:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 12]]);\n };\n\n /**\n * @param {Request} request\n * @param {object} [options]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n\n Platform.prototype.inflateRequest = function inflateRequest(request, options) {\n return regeneratorRuntime.async(function inflateRequest$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n\n options = options || {};\n\n if (!options.skipAuthCheck) {\n context$2$0.next = 3;\n break;\n }\n\n return context$2$0.abrupt('return', request);\n\n case 3:\n context$2$0.next = 5;\n return regeneratorRuntime.awrap(this._ensureAuthentication());\n\n case 5:\n\n request.headers.set('Authorization', this._authHeader());\n //request.url = this.createUrl(request.url, {addServer: true}); //FIXME Spec prevents this...\n\n //TODO Add User-Agent here\n\n return context$2$0.abrupt('return', request);\n\n case 7:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n /**\n * @param {Request} request\n * @param {object} [options]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n\n Platform.prototype.sendRequest = function sendRequest(request, options) {\n return regeneratorRuntime.async(function sendRequest$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n context$2$0.next = 3;\n return regeneratorRuntime.awrap(this.inflateRequest(request, options));\n\n case 3:\n request = context$2$0.sent;\n context$2$0.next = 6;\n return regeneratorRuntime.awrap(this._client.sendRequest(request));\n\n case 6:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 9:\n context$2$0.prev = 9;\n context$2$0.t0 = context$2$0['catch'](0);\n\n if (!(!context$2$0.t0.apiResponse || !context$2$0.t0.apiResponse.response() || context$2$0.t0.apiResponse.response().status != 401)) {\n context$2$0.next = 13;\n break;\n }\n\n throw context$2$0.t0;\n\n case 13:\n\n this._auth.cancelAccessToken();\n\n context$2$0.next = 16;\n return regeneratorRuntime.awrap(this.sendRequest(request, options));\n\n case 16:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 17:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 9]]);\n };\n\n /**\n * General purpose function to send anything to server\n * @param {object} [options.body]\n * @param {string} [options.url]\n * @param {string} [options.method]\n * @param {object} [options.query]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n\n Platform.prototype.send = function send() {\n var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n return regeneratorRuntime.async(function send$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n\n //FIXME https://github.com/bitinn/node-fetch/issues/43\n options.url = this.createUrl(options.url, { addServer: true });\n\n context$2$0.next = 3;\n return regeneratorRuntime.awrap(this.sendRequest(this._client.createRequest(options), options));\n\n case 3:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 4:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n /**\n * @param {string} url\n * @param {object} query\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n\n Platform.prototype.get = function get(url, query, options) {\n return regeneratorRuntime.async(function get$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n options = options || {};\n options.method = 'GET';\n options.url = url;\n options.query = query;\n context$2$0.next = 6;\n return regeneratorRuntime.awrap(this.send(options));\n\n case 6:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 7:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n /**\n * @param {string} url\n * @param {object} body\n * @param {object} query\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n\n Platform.prototype.post = function post(url, body, query, options) {\n return regeneratorRuntime.async(function post$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n options = options || {};\n options.method = 'POST';\n options.url = url;\n options.query = query;\n options.body = body;\n context$2$0.next = 7;\n return regeneratorRuntime.awrap(this.send(options));\n\n case 7:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 8:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n /**\n * @param {string} url\n * @param {object} body\n * @param {object} query\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n\n Platform.prototype.put = function put(url, body, query, options) {\n return regeneratorRuntime.async(function put$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n options = options || {};\n options.method = 'PUT';\n options.url = url;\n options.query = query;\n options.body = body;\n context$2$0.next = 7;\n return regeneratorRuntime.awrap(this.send(options));\n\n case 7:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 8:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n /**\n * @param {string} url\n * @param {string} query\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n\n Platform.prototype['delete'] = function _delete(url, query, options) {\n return regeneratorRuntime.async(function _delete$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n options = options || {};\n options.method = 'DELETE';\n options.url = url;\n options.query = query;\n context$2$0.next = 6;\n return regeneratorRuntime.awrap(this.send(options));\n\n case 6:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 7:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n Platform.prototype._tokenRequest = function _tokenRequest(path, body) {\n return regeneratorRuntime.async(function _tokenRequest$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.next = 2;\n return regeneratorRuntime.awrap(this.send({\n url: path,\n skipAuthCheck: true,\n body: body,\n method: 'POST',\n headers: {\n 'Authorization': 'Basic ' + this._apiKey(),\n 'Content-Type': 'application/x-www-form-urlencoded'\n }\n }));\n\n case 2:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 3:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n Platform.prototype._ensureAuthentication = function _ensureAuthentication() {\n return regeneratorRuntime.async(function _ensureAuthentication$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n if (!this._isAccessTokenValid()) {\n context$2$0.next = 2;\n break;\n }\n\n return context$2$0.abrupt('return', null);\n\n case 2:\n context$2$0.next = 4;\n return regeneratorRuntime.awrap(this.refresh());\n\n case 4:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 5:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n Platform.prototype._isAccessTokenValid = function _isAccessTokenValid() {\n\n return this._auth.accessTokenValid() && !this._queue.isPaused();\n };\n\n Platform.prototype._apiKey = function _apiKey() {\n var apiKey = this._appKey + ':' + this._appSecret;\n return typeof btoa == 'function' ? btoa(apiKey) : new Buffer(apiKey).toString('base64');\n };\n\n Platform.prototype._authHeader = function _authHeader() {\n var token = this._auth.accessToken();\n return this._auth.tokenType() + (token ? ' ' + token : '');\n };\n\n return Platform;\n})(_coreObservable2['default']);\n\nexports['default'] = Platform;\nmodule.exports = exports['default'];\n\n// Perform sanity checks\n\n/** @type {ApiResponse} */\n\n// Guard is for errors that come from polling\n\n/***/ },\n/* 16 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _coreExternals = __webpack_require__(3);\n\nvar _coreUtils = __webpack_require__(2);\n\nvar Queue = (function () {\n _createClass(Queue, null, [{\n key: '_pollInterval',\n value: 250,\n enumerable: true\n }, {\n key: '_releaseTimeout',\n value: 5000,\n enumerable: true\n }]);\n\n function Queue(cache, cacheId) {\n _classCallCheck(this, Queue);\n\n this._cache = cache;\n this._cacheId = cacheId;\n this._promise = null;\n }\n\n Queue.prototype.isPaused = function isPaused() {\n\n var storage = this._cache,\n cacheId = this._cacheId,\n time = storage.getItem(cacheId);\n\n return !!time && Date.now() - parseInt(time) < Queue._releaseTimeout;\n };\n\n Queue.prototype.pause = function pause() {\n this._cache.setItem(this._cacheId, Date.now());\n return this;\n };\n\n Queue.prototype.resume = function resume() {\n this._cache.removeItem(this._cacheId);\n return this;\n };\n\n Queue.prototype.poll = function poll() {\n var _this = this;\n\n if (this._promise) return this._promise;\n\n this._promise = new _coreExternals.Promise(function (resolve, reject) {\n\n _coreUtils.poll(function (next) {\n\n if (_this.isPaused()) return next();\n\n _this._promise = null;\n\n _this.resume(); // this is actually not needed but why not\n\n resolve(null);\n }, Queue._pollInterval);\n });\n\n return this._promise;\n };\n\n return Queue;\n})();\n\nexports['default'] = Queue;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 17 */\n/***/ function(module, exports) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar Auth = (function () {\n _createClass(Auth, null, [{\n key: 'refreshHandicapMs',\n value: 60 * 1000,\n // 1 minute\n enumerable: true\n }, {\n key: 'forcedTokenType',\n value: 'forced',\n enumerable: true\n }]);\n\n function Auth(cache, cacheId) {\n _classCallCheck(this, Auth);\n\n /** @type {Cache} */\n this._cache = cache;\n this._cacheId = cacheId;\n }\n\n //export interface IAuthData {\n // remember?:boolean;\n // token_type?:string;\n // access_token?:string;\n // expires_in?:number; // actually it's string\n // expire_time?:number;\n // refresh_token?:string;\n // refresh_token_expires_in?:number; // actually it's string\n // refresh_token_expire_time?:number;\n // scope?:string;\n //}\n\n Auth.prototype.accessToken = function accessToken() {\n return this.data().access_token;\n };\n\n Auth.prototype.refreshToken = function refreshToken() {\n return this.data().refresh_token;\n };\n\n Auth.prototype.tokenType = function tokenType() {\n return this.data().token_type;\n };\n\n /**\n * @return {{token_type: string, access_token: string, expires_in: number, refresh_token: string, refresh_token_expires_in: number}}\n */\n\n Auth.prototype.data = function data() {\n\n return this._cache.getItem(this._cacheId) || {\n token_type: '',\n access_token: '',\n expires_in: 0,\n refresh_token: '',\n refresh_token_expires_in: 0\n };\n };\n\n /**\n * @param {object} newData\n * @return {Auth}\n */\n\n Auth.prototype.setData = function setData(newData) {\n\n newData = newData || {};\n\n var data = this.data();\n\n Object.keys(newData).forEach(function (key) {\n data[key] = newData[key];\n });\n\n data.expire_time = Date.now() + data.expires_in * 1000;\n data.refresh_token_expire_time = Date.now() + data.refresh_token_expires_in * 1000;\n\n this._cache.setItem(this._cacheId, data);\n\n return this;\n };\n\n /**\n * Check if there is a valid (not expired) access token\n * @return {boolean}\n */\n\n Auth.prototype.accessTokenValid = function accessTokenValid() {\n\n var authData = this.data();\n return authData.token_type === Auth.forcedTokenType || authData.expire_time - Auth.refreshHandicapMs > Date.now();\n };\n\n /**\n * Check if there is a valid (not expired) access token\n * @return {boolean}\n */\n\n Auth.prototype.refreshTokenValid = function refreshTokenValid() {\n\n return this.data().refresh_token_expire_time > Date.now();\n };\n\n /**\n * @return {Auth}\n */\n\n Auth.prototype.cancelAccessToken = function cancelAccessToken() {\n\n return this.setData({\n access_token: '',\n expires_in: 0\n });\n };\n\n /**\n * This method sets a special authentication mode used in Service Web\n * @return {Auth}\n */\n\n Auth.prototype.forceAuthentication = function forceAuthentication() {\n\n this.setData({\n token_type: Auth.forcedTokenType,\n access_token: '',\n expires_in: 0,\n refresh_token: '',\n refresh_token_expires_in: 0\n });\n\n return this;\n };\n\n /**\n * @param remember\n * @return {Auth}\n */\n\n Auth.prototype.setRemember = function setRemember(remember) {\n\n return this.setData({ remember: remember });\n };\n\n /**\n * @return {boolean}\n */\n\n Auth.prototype.remember = function remember() {\n\n return !!this.data().remember;\n };\n\n return Auth;\n})();\n\nexports['default'] = Auth;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 18 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _PubnubMockJs = __webpack_require__(19);\n\nvar _PubnubMockJs2 = _interopRequireDefault(_PubnubMockJs);\n\nvar _coreExternals = __webpack_require__(3);\n\nvar PubnubMockFactory = (function () {\n function PubnubMockFactory() {\n _classCallCheck(this, PubnubMockFactory);\n\n this.crypto_obj = _coreExternals.PUBNUB.crypto_obj;\n }\n\n PubnubMockFactory.prototype.init = function init(options) {\n return new _PubnubMockJs2['default'](options);\n };\n\n return PubnubMockFactory;\n})();\n\nexports['default'] = PubnubMockFactory;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 19 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _coreObservable = __webpack_require__(8);\n\nvar _coreObservable2 = _interopRequireDefault(_coreObservable);\n\nvar _coreExternals = __webpack_require__(3);\n\nvar PubnubMock = (function (_Observable) {\n _inherits(PubnubMock, _Observable);\n\n function PubnubMock(options) {\n _classCallCheck(this, PubnubMock);\n\n _Observable.call(this);\n this.options = options;\n this.crypto_obj = _coreExternals.PUBNUB.crypto_obj;\n }\n\n PubnubMock.prototype.ready = function ready() {};\n\n PubnubMock.prototype.subscribe = function subscribe(options) {\n this.on('message-' + options.channel, options.message);\n };\n\n PubnubMock.prototype.unsubscribe = function unsubscribe(options) {\n this.off('message-' + options.channel);\n };\n\n PubnubMock.prototype.receiveMessage = function receiveMessage(msg, channel) {\n this.emit('message-' + channel, msg, 'env', channel);\n };\n\n return PubnubMock;\n})(_coreObservable2['default']);\n\nexports['default'] = PubnubMock;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 20 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _coreObservable = __webpack_require__(8);\n\nvar _coreObservable2 = _interopRequireDefault(_coreObservable);\n\nvar _httpClient = __webpack_require__(9);\n\nvar _httpClient2 = _interopRequireDefault(_httpClient);\n\nvar _coreUtils = __webpack_require__(2);\n\nvar Subscription = (function (_Observable) {\n _inherits(Subscription, _Observable);\n\n _createClass(Subscription, null, [{\n key: '_renewHandicapMs',\n value: 2 * 60 * 1000,\n enumerable: true\n }, {\n key: '_pollInterval',\n value: 10 * 1000,\n enumerable: true\n }]);\n\n function Subscription(pubnubFactory, platform, cache) {\n _classCallCheck(this, Subscription);\n\n _Observable.call(this);\n\n this.events = {\n notification: 'notification',\n removeSuccess: 'removeSuccess',\n removeError: 'removeError',\n renewSuccess: 'renewSuccess',\n renewError: 'renewError',\n subscribeSuccess: 'subscribeSuccess',\n subscribeError: 'subscribeError'\n };\n this._pubnubFactory = pubnubFactory;\n this._platform = platform;\n this._cache = cache;\n this._pubnub = null;\n this._timeout = null;\n this._subscription = {};\n }\n\n //export interface ISubscription {\n // id?:string;\n // uri?: string;\n // eventFilters?:string[];\n // expirationTime?:string; // 2014-03-12T19:54:35.613Z\n // expiresIn?:number;\n // deliveryMode?: {\n // transportType?:string;\n // encryption?:boolean;\n // address?:string;\n // subscriberKey?:string;\n // encryptionKey?:string;\n // secretKey?:string;\n // };\n // creationTime?:string; // 2014-03-12T19:54:35.613Z\n // status?:string; // Active\n //}\n\n /**\n * @return {boolean}\n */\n\n Subscription.prototype.alive = function alive() {\n\n return !!(this._subscription.id && this._subscription.deliveryMode && this._subscription.deliveryMode.subscriberKey && this._subscription.deliveryMode.address && Date.now() < this.expirationTime());\n };\n\n Subscription.prototype.expirationTime = function expirationTime() {\n return new Date(this._subscription.expirationTime || 0).getTime() - Subscription._renewHandicapMs;\n };\n\n Subscription.prototype.setSubscription = function setSubscription(subscription) {\n\n subscription = subscription || {};\n\n this._clearTimeout();\n\n this._subscription = subscription;\n\n if (!this._pubnub) this._subscribeAtPubnub();\n\n this._setTimeout();\n\n return this;\n };\n\n Subscription.prototype.subscription = function subscription() {\n return this._subscription;\n };\n\n /**\n * Creates or updates subscription if there is an active one\n * @param {{events?:string[]}} [options] New array of events\n * @returns {Promise}\n */\n\n Subscription.prototype.register = function register(options) {\n return regeneratorRuntime.async(function register$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n if (!this.alive()) {\n context$2$0.next = 6;\n break;\n }\n\n context$2$0.next = 3;\n return regeneratorRuntime.awrap(this.renew(options));\n\n case 3:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 6:\n context$2$0.next = 8;\n return regeneratorRuntime.awrap(this.subscribe(options));\n\n case 8:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 9:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n Subscription.prototype.eventFilters = function eventFilters() {\n return this._subscription.eventFilters || [];\n };\n\n /**\n * @param {string[]} events\n * @return {Subscription}\n */\n\n Subscription.prototype.addEventFilters = function addEventFilters(events) {\n this.setEventFilters(this.eventFilters().concat(events));\n return this;\n };\n\n /**\n * @param {string[]} events\n * @return {Subscription}\n */\n\n Subscription.prototype.setEventFilters = function setEventFilters(events) {\n this._subscription.eventFilters = events;\n return this;\n };\n\n /**\n * @param {{events?:string[]}} [options] New array of events\n * @returns {Promise}\n */\n\n Subscription.prototype.subscribe = function subscribe(options) {\n var response, json;\n return regeneratorRuntime.async(function subscribe$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n\n options = options || {};\n\n if (options.events) this.setEventFilters(options.events);\n\n this._clearTimeout();\n\n if (this.eventFilters().length) {\n context$2$0.next = 6;\n break;\n }\n\n throw new Error('Events are undefined');\n\n case 6:\n context$2$0.next = 8;\n return regeneratorRuntime.awrap(this._platform.post('/restapi/v1.0/subscription', {\n eventFilters: this._getFullEventFilters(),\n deliveryMode: {\n transportType: 'PubNub'\n }\n }));\n\n case 8:\n response = context$2$0.sent;\n json = response.json();\n\n this.setSubscription(json).emit(this.events.subscribeSuccess, response);\n\n return context$2$0.abrupt('return', response);\n\n case 14:\n context$2$0.prev = 14;\n context$2$0.t0 = context$2$0['catch'](0);\n\n context$2$0.t0 = this._platform.client().makeError(context$2$0.t0);\n\n this.reset().emit(this.events.subscribeError, context$2$0.t0);\n\n throw context$2$0.t0;\n\n case 19:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 14]]);\n };\n\n /**\n * @param {{events?:string[]}} [options] New array of events\n * @returns {Promise}\n */\n\n Subscription.prototype.renew = function renew(options) {\n var response, json;\n return regeneratorRuntime.async(function renew$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n\n options = options || {};\n\n if (options.events) this.setEventFilters(options.events);\n\n this._clearTimeout();\n\n if (this.alive()) {\n context$2$0.next = 6;\n break;\n }\n\n throw new Error('Subscription is not alive');\n\n case 6:\n if (this.eventFilters().length) {\n context$2$0.next = 8;\n break;\n }\n\n throw new Error('Events are undefined');\n\n case 8:\n context$2$0.next = 10;\n return regeneratorRuntime.awrap(this._platform.put('/restapi/v1.0/subscription/' + this._subscription.id, {\n eventFilters: this._getFullEventFilters()\n }));\n\n case 10:\n response = context$2$0.sent;\n json = response.json();\n\n this.setSubscription(json).emit(this.events.renewSuccess, response);\n\n return context$2$0.abrupt('return', response);\n\n case 16:\n context$2$0.prev = 16;\n context$2$0.t0 = context$2$0['catch'](0);\n\n context$2$0.t0 = this._platform.client().makeError(context$2$0.t0);\n\n this.reset().emit(this.events.renewError, context$2$0.t0);\n\n throw context$2$0.t0;\n\n case 21:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 16]]);\n };\n\n /**\n * @returns {Promise}\n */\n\n Subscription.prototype.remove = function remove() {\n var response;\n return regeneratorRuntime.async(function remove$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n\n if (this.alive()) {\n context$2$0.next = 3;\n break;\n }\n\n throw new Error('Subscription is not alive');\n\n case 3:\n context$2$0.next = 5;\n return regeneratorRuntime.awrap(this._platform['delete']('/restapi/v1.0/subscription/' + this._subscription.id));\n\n case 5:\n response = context$2$0.sent;\n\n this.reset().emit(this.events.removeSuccess, response);\n\n return context$2$0.abrupt('return', response);\n\n case 10:\n context$2$0.prev = 10;\n context$2$0.t0 = context$2$0['catch'](0);\n\n context$2$0.t0 = this._platform.client().makeError(context$2$0.t0);\n\n this.emit(this.events.removeError, context$2$0.t0);\n\n throw context$2$0.t0;\n\n case 15:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 10]]);\n };\n\n /**\n * Remove subscription and disconnect from PUBNUB\n * This method resets subscription at client side but backend is not notified\n */\n\n Subscription.prototype.reset = function reset() {\n this._clearTimeout();\n if (this.alive() && this._pubnub) this._pubnub.unsubscribe({ channel: this._subscription.deliveryMode.address });\n this._subscription = {};\n return this;\n };\n\n /**\n *\n * @param {string} cacheKey\n * @param {string[]} events\n * @return {Subscription}\n */\n\n Subscription.prototype.restoreFromCache = function restoreFromCache(cacheKey, events) {\n var _this = this;\n\n this.on([this.events.subscribeSuccess, this.events.renewSuccess], function () {\n\n _this._cache.setItem(cacheKey, _this.subscription());\n });\n\n this.on(this.events.renewError, function () {\n\n _this.reset().setEventFilters(events).register();\n });\n\n var cachedSubscriptionData = this._cache.getItem(cacheKey);\n\n if (cachedSubscriptionData) {\n try {\n this.setSubscription(cachedSubscriptionData);\n } catch (e) {}\n } else {\n this.setEventFilters(events);\n }\n\n return this;\n };\n\n Subscription.prototype._getFullEventFilters = function _getFullEventFilters() {\n var _this2 = this;\n\n return this.eventFilters().map(function (event) {\n return _this2._platform.createUrl(event);\n });\n };\n\n Subscription.prototype._setTimeout = function _setTimeout() {\n var _this3 = this;\n\n this._clearTimeout();\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n _coreUtils.poll(function (next) {\n\n if (_this3.alive()) return next();\n\n _this3.renew();\n }, Subscription._pollInterval, this._timeout);\n\n return this;\n };\n\n Subscription.prototype._clearTimeout = function _clearTimeout() {\n\n _coreUtils.stopPolling(this._timeout);\n\n return this;\n };\n\n Subscription.prototype._decrypt = function _decrypt(message) {\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n if (this._subscription.deliveryMode.encryptionKey) {\n\n var PUBNUB = this._pubnubFactory;\n\n message = PUBNUB.crypto_obj.decrypt(message, this._subscription.deliveryMode.encryptionKey, {\n encryptKey: false,\n keyEncoding: 'base64',\n keyLength: 128,\n mode: 'ecb'\n });\n }\n\n return message;\n };\n\n Subscription.prototype._notify = function _notify(message) {\n\n this.emit(this.events.notification, this._decrypt(message));\n\n return this;\n };\n\n Subscription.prototype._subscribeAtPubnub = function _subscribeAtPubnub() {\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n var PUBNUB = this._pubnubFactory;\n\n this._pubnub = PUBNUB.init({\n ssl: true,\n subscribe_key: this._subscription.deliveryMode.subscriberKey\n });\n\n this._pubnub.ready();\n\n this._pubnub.subscribe({\n channel: this._subscription.deliveryMode.address,\n message: this._notify.bind(this),\n connect: function connect() {}\n });\n\n return this;\n };\n\n return Subscription;\n})(_coreObservable2['default']);\n\nexports['default'] = Subscription;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 21 */\n/***/ function(module, exports) {\n\n/* WEBPACK VAR INJECTION */(function(global) {/**\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 // This invoke function is written in a style that assumes some\n // calling function (or Promise) will handle exceptions.\n function invoke(method, arg) {\n var result = generator[method](arg);\n var value = result.value;\n return value instanceof AwaitArgument\n ? Promise.resolve(value.arg).then(invokeNext, invokeThrow)\n : 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 return result;\n });\n }\n\n if (typeof process === \"object\" && process.domain) {\n invoke = process.domain.bind(invoke);\n }\n\n var invokeNext = invoke.bind(generator, \"next\");\n var invokeThrow = invoke.bind(generator, \"throw\");\n var invokeReturn = invoke.bind(generator, \"return\");\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return invoke(method, arg);\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 ) : new Promise(function (resolve) {\n resolve(callInvokeWithMethodAndArg());\n });\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/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ }\n/******/ ])\n});\n;\n//# sourceMappingURL=ringcentral.js.map"," \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 = \"/build/\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap c0838cc3f17cb1b5a03c\n **/","import * as Utils from './core/Utils';\nimport Cache from './core/Cache';\nimport * as Externals from './core/Externals';\nimport Observable from './core/Observable';\n\nimport Client from './http/Client';\nimport ApiResponse from './http/ApiResponse';\nimport * as HttpUtils from './http/Utils';\n\nimport {default as ClientMock} from './mocks/ClientMock';\nimport Mock from './mocks/Mock';\nimport Registry from './mocks/Registry';\n\nimport Platform from './platform/Platform';\nimport Auth from './platform/Auth';\nimport Queue from './platform/Queue';\n\nimport PubnubMockFactory from './pubnub/PubnubFactory';\n\nimport Subscription from './subscription/Subscription';\n\nrequire(\"regenerator/runtime\");\n\nexport default class SDK {\n\n static version = '2.0.0';\n\n static server = {\n sandbox: 'https://platform.devtest.ringcentral.com',\n production: 'https://platform.ringcentral.com'\n };\n\n /**\n * @constructor\n * @param {object} [options]\n * @param {string} [options.server]\n * @param {string} [options.cachePrefix]\n * @param {string} [options.appSecret]\n * @param {string} [options.appKey]\n * @param {string} [options.appName]\n * @param {string} [options.appVersion]\n * @param {string} [options.pubnubFactory]\n * @param {string} [options.client]\n */\n constructor(options) {\n\n options = options || {};\n\n this._cache = new Cache(Externals.localStorage, options.cachePrefix);\n\n this._client = options.client || new Client();\n\n this._platform = new Platform(this._client, this._cache, options.server, options.appKey, options.appSecret);\n\n this._pubnubFactory = options.pubnubFactory || Externals.PUBNUB;\n\n }\n\n /**\n * @return {Platform}\n */\n platform() {\n return this._platform;\n }\n\n /**\n * @return {Subscription}\n */\n createSubscription() {\n return new Subscription(this._pubnubFactory, this._platform, this._cache);\n }\n\n /**\n * @return {Cache}\n */\n cache() {\n return this._cache;\n }\n\n static core = {\n Cache: Cache,\n Observable: Observable,\n Utils: Utils,\n Externals: Externals\n };\n\n static http = {\n Client: Client,\n ApiResponse: ApiResponse,\n Utils: HttpUtils\n };\n\n static platform = {\n Auth: Auth,\n Platform: Platform,\n Queue: Queue\n };\n\n static subscription = {\n Subscription: Subscription\n };\n\n static mocks = {\n Client: ClientMock,\n Registry: Registry,\n Mock: Mock\n };\n\n static pubnub = {\n PubnubMockFactory: PubnubMockFactory\n };\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/SDK.js\n **/","import {Promise} from './Externals.js';\n\n/**\n * TODO Replace with something better\n * @see https://github.com/joyent/node/blob/master/lib/querystring.js\n * @param {object} parameters\n * @returns {string}\n */\nexport function queryStringify(parameters) {\n\n var array = [];\n\n parameters = parameters || {};\n\n Object.keys(parameters).forEach((k) => {\n\n var v = parameters[k];\n\n if (isArray(v)) {\n v.forEach((vv) => {\n array.push(encodeURIComponent(k) + '=' + encodeURIComponent(vv));\n });\n } else {\n array.push(encodeURIComponent(k) + '=' + encodeURIComponent(v));\n }\n\n });\n\n return array.join('&');\n\n}\n\n/**\n * TODO Replace with something better\n * @see https://github.com/joyent/node/blob/master/lib/querystring.js\n * @param {string} queryString\n * @returns {object}\n */\nexport function parseQueryString(queryString) {\n\n var argsParsed = {};\n\n queryString.split('&').forEach((arg) => {\n\n arg = decodeURIComponent(arg);\n\n if (arg.indexOf('=') == -1) {\n\n argsParsed[arg.trim()] = true;\n\n } else {\n\n var pair = arg.split('='),\n key = pair[0].trim(),\n value = pair[1].trim();\n\n if (key in argsParsed) {\n if (key in argsParsed && !isArray(argsParsed[key])) argsParsed[key] = [argsParsed[key]];\n argsParsed[key].push(value);\n } else {\n argsParsed[key] = value;\n }\n\n }\n\n });\n\n return argsParsed;\n\n}\n\n/**\n * @param obj\n * @return {boolean}\n */\nexport function isFunction(obj) {\n return typeof obj === \"function\";\n}\n\n/**\n * @param obj\n * @return {boolean}\n */\nexport function isArray(obj) {\n return Array.isArray ? Array.isArray(obj) : typeof obj === \"array\";\n}\n\n/**\n * @param fn\n * @param interval\n * @param timeout\n */\nexport function poll(fn, interval, timeout) { //NodeJS.Timer|number\n\n module.exports.stopPolling(timeout);\n\n interval = interval || 1000;\n\n var next = (delay) => {\n\n delay = delay || interval;\n\n interval = delay;\n\n return setTimeout(() => {\n\n fn(next, delay);\n\n }, delay);\n\n };\n\n return next();\n\n}\n\nexport function stopPolling(timeout) {\n if (timeout) clearTimeout(timeout);\n}\n\nexport function isNodeJS() {\n return (typeof process !== 'undefined');\n}\n\nexport function isBrowser() {\n return (typeof window !== 'undefined');\n}\n\nexport function delay(timeout) {\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n resolve(null);\n }, timeout);\n });\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Utils.js\n **/","import ES6Promise from 'es6-promise';\nimport nodeFetch from 'node-fetch';\nimport pubnub from 'pubnub';\n\nexport var Promise = (ES6Promise && ES6Promise.Promise) || window.Promise;\n\nexport var fetch = nodeFetch || window.fetch;\nexport var Request = fetch.Request || window.Request;\nexport var Response = fetch.Response || window.Response;\nexport var Headers = fetch.Headers || window.Headers;\n\nexport var PUBNUB = pubnub || window.PUBNUB;\n\nexport var localStorage = (typeof window !== 'undefined' &&\n typeof window.localStorage !== 'undefined') ? window.localStorage : {};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Externals.js\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_4__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external {\"commonjs\":\"es6-promise\",\"commonjs2\":\"es6-promise\"}\n ** module id = 4\n ** module chunks = 0\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_5__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external {\"commonjs\":\"node-fetch\",\"commonjs2\":\"node-fetch\"}\n ** module id = 5\n ** module chunks = 0\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_6__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external {\"commonjs\":\"pubnub\",\"commonjs2\":\"pubnub\",\"amd\":\"pubnub\"}\n ** module id = 6\n ** module chunks = 0\n **/","export default class Cache {\n\n static defaultPrefix = 'rc-';\n\n constructor(storage, prefix) {\n this.setPrefix(prefix);\n this._storage = storage;\n }\n\n setPrefix(prefix) {\n this._prefix = prefix || Cache.defaultPrefix;\n return this;\n }\n\n setItem(key, data) {\n this._storage[this._prefixKey(key)] = JSON.stringify(data);\n return this;\n }\n\n removeItem(key) {\n delete this._storage[this._prefixKey(key)];\n return this;\n }\n\n getItem(key) {\n var item = this._storage[this._prefixKey(key)];\n if (!item) return null;\n return JSON.parse(item);\n }\n\n clean() {\n\n for (var key in this._storage) {\n\n if (!this._storage.hasOwnProperty(key)) continue;\n\n if (key.indexOf(this._prefix) === 0) {\n delete this._storage[key];\n }\n\n }\n\n return this;\n\n }\n\n _prefixKey(key) {\n return this._prefix + key;\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Cache.js\n **/","export default class Observable {\n\n constructor() {\n this.off();\n }\n\n hasListeners(event) {\n return (event in this._listeners);\n }\n\n on(events, callback) {\n\n if (typeof events == 'string') events = [events];\n if (!events) throw new Error('No events to subscribe to');\n if (typeof callback !== 'function') throw new Error('Callback must be a function');\n\n events.forEach((event) => {\n\n if (!this.hasListeners(event)) this._listeners[event] = [];\n\n this._listeners[event].push(callback);\n\n });\n\n return this;\n\n }\n\n emit(event, ...args) {\n\n var result = null;\n\n if (!this.hasListeners(event)) return null;\n\n this._listeners[event].some((callback) => {\n\n result = callback.apply(this, args);\n return (result === false);\n\n });\n\n return result;\n\n }\n\n off(event, callback) {\n\n if (!event) {\n\n this._listeners = {};\n\n } else {\n\n if (!callback) {\n\n delete this._listeners[event];\n\n } else {\n\n if (!this.hasListeners(event)) return this;\n\n this._listeners[event].forEach((cb, i) => {\n\n if (cb === callback) delete this._listeners[event][i];\n\n });\n\n }\n\n }\n\n return this;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Observable.js\n **/","import {fetch, Request, Response, Headers, Promise} from '../core/Externals';\nimport {queryStringify} from '../core/Utils';\nimport {findHeaderName} from './Utils';\nimport Observable from '../core/Observable';\nimport ApiResponse from './ApiResponse';\n\nexport default class Client extends Observable {\n\n static _allowedMethods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'];\n\n events = {\n beforeRequest: 'beforeRequest',\n requestSuccess: 'requestSuccess',\n requestError: 'requestError'\n };\n\n /**\n * @param {Request} request\n * @return {Promise}\n */\n async sendRequest(request) {\n\n var apiResponse = new ApiResponse(request);\n\n try {\n\n //TODO Stop request if listeners return false\n this.emit(this.events.beforeRequest, apiResponse);\n\n apiResponse._response = await this._loadResponse(request);\n\n if (apiResponse._isMultipart() || apiResponse._isJson()) {\n apiResponse._text = await apiResponse.response().text();\n }\n\n if (!apiResponse.ok()) throw new Error('Response has unsuccessful status');\n\n this.emit(this.events.requestSuccess, apiResponse);\n\n return apiResponse;\n\n } catch (e) {\n\n if (!e.apiResponse) e = this.makeError(e, apiResponse);\n\n this.emit(this.events.requestError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @param {Request} request\n * @return {Promise}\n * @private\n */\n async _loadResponse(request) {\n return await fetch.call(null, request);\n }\n\n /**\n * Wraps the JS Error object with transaction information\n * @param {Error|IApiError} e\n * @param {ApiResponse} apiResponse\n * @return {IApiError}\n */\n makeError(e, apiResponse) {\n\n // Wrap only if regular error\n if (!e.hasOwnProperty('apiResponse') && !e.hasOwnProperty('originalMessage')) {\n\n e.apiResponse = apiResponse;\n e.originalMessage = e.message;\n e.message = (apiResponse && apiResponse.error(true)) || e.originalMessage;\n\n }\n\n return e;\n\n }\n\n /**\n *\n * @param {object} init\n * @param {object} [init.url]\n * @param {object} [init.body]\n * @param {string} [init.method]\n * @param {object} [init.query]\n * @param {object} [init.headers]\n * @return {Request}\n */\n createRequest(init) {\n\n init = init || {};\n init.headers = init.headers || {};\n\n // Sanity checks\n if (!init.url) throw new Error('Url is not defined');\n if (!init.method) init.method = 'GET';\n if (init.method && Client._allowedMethods.indexOf(init.method) < 0) throw new Error('Method has wrong value: ' + init.method);\n\n // Defaults\n init.credentials = init.credentials || 'include';\n init.mode = init.mode || 'cors';\n\n // Append Query String\n if (init.query) {\n init.url = init.url + (init.url.indexOf('?') > -1 ? '&' : '?') + queryStringify(init.query);\n }\n\n if (!(findHeaderName('Accept', init.headers))) {\n init.headers['Accept'] = ApiResponse._jsonContentType;\n }\n\n // Serialize body\n //TODO Check that body is a plain object\n if (typeof init.body !== 'string' || !init.body) {\n\n var contentTypeHeaderName = findHeaderName(ApiResponse._contentType, init.headers);\n\n if (!contentTypeHeaderName) {\n contentTypeHeaderName = ApiResponse._contentType;\n init.headers[contentTypeHeaderName] = ApiResponse._jsonContentType;\n }\n\n var contentType = init.headers[contentTypeHeaderName];\n\n // Assign a new encoded body\n if (contentType.indexOf(ApiResponse._jsonContentType) > -1) {\n init.body = JSON.stringify(init.body);\n } else if (contentType.indexOf(ApiResponse._urlencodedContentType) > -1) {\n init.body = queryStringify(init.body);\n }\n\n }\n\n // Create a request with encoded body\n var req = new Request(init.url, init);\n\n // Keep the original body accessible directly (for mocks)\n req.originalBody = init.body;\n\n return req;\n\n }\n\n}\n\n/**\n * @name IApiError\n * @property {string} stack\n * @property {string} originalMessage\n * @property {ApiResponse} apiResponse\n */\n\n\n/** WEBPACK FOOTER **\n ** ./src/http/Client.js\n **/","import {fetch, Request, Response, Headers, Promise} from '../core/Externals';\nimport * as utils from '../core/Utils';\n\n/**\n * Creates a response\n * @param stringBody\n * @param init\n * @return {Response}\n */\nexport function createResponse(stringBody, init) {\n\n init = init || {};\n\n var response = new Response(stringBody, init);\n\n //TODO Wait for https://github.com/bitinn/node-fetch/issues/38\n if (utils.isNodeJS()) {\n\n response._text = stringBody;\n response._decode = function() {\n return this._text;\n };\n\n }\n\n return response;\n\n}\n\nexport function findHeaderName(name, headers) {\n name = name.toLowerCase();\n return Object.keys(headers).reduce(function(res, key) {\n if (res) return res;\n if (name == key.toLowerCase()) return key;\n return res;\n }, null);\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/http/Utils.js\n **/","import {fetch, Request, Response, Headers, Promise} from '../core/Externals';\nimport * as utils from './Utils';\n\nexport default class ApiResponse {\n\n static _contentType = 'Content-Type';\n static _jsonContentType = 'application/json';\n static _multipartContentType = 'multipart/mixed';\n static _urlencodedContentType = 'application/x-www-form-urlencoded';\n static _headerSeparator = ':';\n static _bodySeparator = '\\n\\n';\n static _boundarySeparator = '--';\n\n /**\n * @param {Request} request\n * @param {Response} response\n * @param {string} responseText\n */\n constructor(request, response, responseText) {\n\n /** @type {Request} */\n this._request = request;\n\n /** @type {Response} */\n this._response = response;\n\n this._text = responseText;\n this._json = null;\n this._multipart = [];\n\n }\n\n /**\n * @return {Response}\n */\n response() {\n return this._response;\n }\n\n /**\n * @return {Request}\n */\n request() {\n return this._request;\n }\n\n /**\n * @return {boolean}\n */\n ok() {\n return this._response && this._response.ok;\n }\n\n /**\n * @return {string}\n */\n text() {\n if (!this._isJson() && !this._isMultipart()) throw new Error('Response is not text');\n return this._text;\n }\n\n /**\n * @return {object}\n */\n json() {\n if (!this._isJson()) throw new Error('Response is not JSON');\n if (!this._json) {\n this._json = this._text ? JSON.parse(this._text) : null;\n }\n return this._json;\n }\n\n /**\n * @param [skipOKCheck]\n * @return {string}\n */\n error(skipOKCheck) {\n\n if (this.ok() && !skipOKCheck) return null;\n\n var message = (this._response && this._response.status ? this._response.status + ' ' : '') +\n (this._response && this._response.statusText ? this._response.statusText : '');\n\n try {\n\n if (this.json().message) message = this.json().message;\n if (this.json().error_description) message = this.json().error_description;\n if (this.json().description) message = this.json().description;\n\n } catch (e) {}\n\n return message;\n\n }\n\n /**\n * @return {ApiResponse[]}\n */\n multipart() {\n\n if (!this._isMultipart()) throw new Error('Response is not multipart');\n\n if (!this._multipart.length) {\n\n // Step 1. Split multipart response\n\n var text = this.text();\n\n if (!text) throw new Error('No response body');\n\n var boundary = this._getContentType().match(/boundary=([^;]+)/i)[1];\n\n if (!boundary) throw new Error('Cannot find boundary');\n\n var parts = text.toString().split(ApiResponse._boundarySeparator + boundary);\n\n if (parts[0].trim() === '') parts.shift();\n if (parts[parts.length - 1].trim() == ApiResponse._boundarySeparator) parts.pop();\n\n if (parts.length < 1) throw new Error('No parts in body');\n\n // Step 2. Parse status info\n\n var statusInfo = ApiResponse.create(parts.shift(), this._response.status, this._response.statusText).json();\n\n // Step 3. Parse all other parts\n\n this._multipart = parts.map((part:string, i) => {\n\n var status = statusInfo.response[i].status;\n\n return ApiResponse.create(part, status);\n\n });\n\n }\n\n return this._multipart;\n\n }\n\n _isContentType(contentType) {\n return this._getContentType().indexOf(contentType) > -1;\n }\n\n _getContentType() {\n return this._response.headers.get(ApiResponse._contentType) || '';\n }\n\n _isMultipart() {\n return this._isContentType(ApiResponse._multipartContentType);\n }\n\n _isUrlEncoded() {\n return this._isContentType(ApiResponse._urlencodedContentType);\n }\n\n _isJson() {\n return this._isContentType(ApiResponse._jsonContentType);\n }\n\n /**\n * Method is used to create ApiResponse object from string parts of multipart/mixed response\n * @param {string} [text]\n * @param {number} [status]\n * @param {string} [statusText]\n * @return {ApiResponse}\n */\n static create(text, status, statusText) {\n\n text = text || '';\n status = status || 200;\n statusText = statusText || 'OK';\n\n text = text.replace(/\\r/g, '');\n\n var headers = new Headers(),\n headersAndBody = text.split(ApiResponse._bodySeparator),\n headersText = (headersAndBody.length > 1) ? headersAndBody.shift() : '';\n\n text = headersAndBody.join(ApiResponse._bodySeparator);\n\n (headersText || '')\n .split('\\n')\n .forEach((header:string) => {\n\n var split = header.trim().split(ApiResponse._headerSeparator),\n key = split.shift().trim(),\n value = split.join(ApiResponse._headerSeparator).trim();\n\n if (key) headers.append(key, value);\n\n });\n\n return new ApiResponse(null, utils.createResponse(text, {\n headers: headers,\n status: status,\n statusText: statusText\n }), text);\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/http/ApiResponse.js\n **/","import Registry from './Registry';\nimport {default as HttpClient} from '../http/Client';\n\nexport default class Client extends HttpClient {\n\n constructor() {\n super();\n this._registry = new Registry();\n }\n\n registry() {\n return this._registry;\n }\n\n async _loadResponse(request) {\n\n var mock = this._registry.find(request);\n\n return await mock.getResponse(request);\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/mocks/ClientMock.js\n **/","import Mock from './Mock';\n\nexport default class Registry {\n\n constructor() {\n this._mocks = [];\n }\n\n add(mock) {\n this._mocks.push(mock);\n return this;\n }\n\n clear() {\n this._mocks = [];\n return this;\n }\n\n find(request) {\n\n //console.log('Registry is looking for', request);\n\n var mock = this._mocks.shift();\n\n if (!mock) throw new Error('No mock in registry for request ' + request.method + ' ' + request.url);\n\n if (!mock.test(request)) throw new Error('Wrong request ' + request.method + ' ' + request.url +\n ' for expected mock ' + mock.method() + ' ' + mock.path());\n\n return mock;\n\n }\n\n apiCall(method:string, path:string, response:any, status, statusText) {\n\n this.add(new Mock(method, path, response, status, statusText));\n\n return this;\n\n }\n\n authentication() {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'access_token': 'ACCESS_TOKEN',\n 'token_type': 'bearer',\n 'expires_in': 3600,\n 'refresh_token': 'REFRESH_TOKEN',\n 'refresh_token_expires_in': 60480,\n 'scope': 'SMS RCM Foo Boo',\n 'expireTime': new Date().getTime() + 3600000\n });\n\n return this;\n\n }\n\n logout() {\n\n this.apiCall('POST', '/restapi/oauth/revoke', {});\n\n return this;\n\n }\n\n presenceLoad(id) {\n\n this.apiCall('GET', '/restapi/v1.0/account/~/extension/' + id + '/presence', {\n \"uri\": \"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/\" + id + \"/presence\",\n \"extension\": {\n \"uri\": \"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/\" + id,\n \"id\": id,\n \"extensionNumber\": \"101\"\n },\n \"activeCalls\": [],\n \"presenceStatus\": \"Available\",\n \"telephonyStatus\": \"Ringing\",\n \"userStatus\": \"Available\",\n \"dndStatus\": \"TakeAllCalls\",\n \"extensionId\": id\n });\n\n return this;\n\n }\n\n subscribeGeneric(expiresIn) {\n\n expiresIn = expiresIn || 15 * 60 * 60;\n\n var date = new Date();\n\n this.apiCall('POST', '/restapi/v1.0/subscription', {\n 'eventFilters': [\n '/restapi/v1.0/account/~/extension/~/presence'\n ],\n 'expirationTime': new Date(date.getTime() + (expiresIn * 1000)).toISOString(),\n 'expiresIn': expiresIn,\n 'deliveryMode': {\n 'transportType': 'PubNub',\n 'encryption': false,\n 'address': '123_foo',\n 'subscriberKey': 'sub-c-foo',\n 'secretKey': 'sec-c-bar'\n },\n 'id': 'foo-bar-baz',\n 'creationTime': date.toISOString(),\n 'status': 'Active',\n 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz'\n });\n\n return this;\n\n }\n\n subscribeOnPresence(id, detailed) {\n\n id = id || '1';\n\n var date = new Date();\n\n this.apiCall('POST', '/restapi/v1.0/subscription', {\n 'eventFilters': ['/restapi/v1.0/account/~/extension/' + id + '/presence' + (detailed ? '?detailedTelephonyState=true' : '')],\n 'expirationTime': new Date(date.getTime() + (15 * 60 * 60 * 1000)).toISOString(),\n 'deliveryMode': {\n 'transportType': 'PubNub',\n 'encryption': true,\n 'address': '123_foo',\n 'subscriberKey': 'sub-c-foo',\n 'secretKey': 'sec-c-bar',\n 'encryptionAlgorithm': 'AES',\n 'encryptionKey': 'VQwb6EVNcQPBhE/JgFZ2zw=='\n },\n 'creationTime': date.toISOString(),\n 'id': 'foo-bar-baz',\n 'status': 'Active',\n 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz'\n });\n\n return this;\n\n }\n\n tokenRefresh(failure) {\n\n if (!failure) {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'access_token': 'ACCESS_TOKEN_FROM_REFRESH',\n 'token_type': 'bearer',\n 'expires_in': 3600,\n 'refresh_token': 'REFRESH_TOKEN_FROM_REFRESH',\n 'refresh_token_expires_in': 60480,\n 'scope': 'SMS RCM Foo Boo'\n });\n\n } else {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'message': 'Wrong token',\n 'error_description': 'Wrong token',\n 'description': 'Wrong token'\n }, 400);\n\n }\n\n return this;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/mocks/Registry.js\n **/","import ApiResponse from '../http/ApiResponse';\nimport {delay} from '../core/Utils';\nimport {createResponse} from '../http/Utils';\n\nexport default class Mock {\n\n constructor(method, path, json, status, statusText, delay) {\n this._method = method.toUpperCase();\n this._path = path;\n this._json = json || {};\n this._delay = delay || 10;\n this._status = status || 200;\n this._statusText = statusText || 'OK';\n }\n\n path() {\n return this._path;\n }\n\n method() {\n return this._method;\n }\n\n test(request:Request) {\n\n return request.url.indexOf(this._path) > -1 &&\n request.method.toUpperCase() == this._method;\n\n }\n\n async getResponse(request) {\n\n await delay(this._delay);\n\n return this.createResponse(this._json);\n\n }\n\n createResponse(json, init) {\n\n init = init || {};\n\n init.status = init.status || this._status;\n init.statusText = init.statusText || this._statusText;\n\n var str = JSON.stringify(json),\n res = createResponse(str, init);\n\n res.headers.set(ApiResponse._contentType, ApiResponse._jsonContentType);\n\n return res;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/mocks/Mock.js\n **/","import Observable from '../core/Observable';\nimport Queue from './Queue';\nimport Auth from './Auth';\nimport {Promise} from '../core/Externals';\nimport {queryStringify, parseQueryString, delay} from '../core/Utils';\n\nexport default class Platform extends Observable {\n\n static _urlPrefix = '/restapi';\n static _apiVersion = 'v1.0';\n static _accessTokenTtl = null; // Platform server by default sets it to 60 * 60 = 1 hour\n static _refreshTokenTtl = 10 * 60 * 60; // 10 hours\n static _refreshTokenTtlRemember = 7 * 24 * 60 * 60; // 1 week\n static _tokenEndpoint = '/restapi/oauth/token';\n static _revokeEndpoint = '/restapi/oauth/revoke';\n static _authorizeEndpoint = '/restapi/oauth/authorize';\n static _refreshDelayMs = 100;\n static _cacheId = 'platform';\n static _clearCacheOnRefreshError = true;\n\n events = {\n beforeLogin: 'beforeLogin',\n loginSuccess: 'loginSuccess',\n loginError: 'loginError',\n beforeRefresh: 'beforeRefresh',\n refreshSuccess: 'refreshSuccess',\n refreshError: 'refreshError',\n beforeLogout: 'beforeLogout',\n logoutSuccess: 'logoutSuccess',\n logoutError: 'logoutError'\n };\n\n constructor(client, cache, server, appKey, appSecret) {\n\n super();\n\n this._server = server;\n this._appKey = appKey;\n this._appSecret = appSecret;\n\n /** @type {Cache} */\n this._cache = cache;\n\n /** @type {Client} */\n this._client = client;\n\n this._queue = new Queue(this._cache, Platform._cacheId + '-refresh');\n\n this._auth = new Auth(this._cache, Platform._cacheId);\n\n }\n\n /**\n * @return {Auth}\n */\n auth() {\n return this._auth;\n }\n\n /**\n * @return {Client}\n */\n client() {\n return this._client;\n }\n\n /**\n * @param {string} path\n * @param {object} [options]\n * @param {boolean} [options.addServer]\n * @param {string} [options.addMethod]\n * @param {boolean} [options.addToken]\n * @return {string}\n */\n createUrl(path, options) {\n\n path = path || '';\n options = options || {};\n\n var builtUrl = '',\n hasHttp = path.indexOf('http://') != -1 || path.indexOf('https://') != -1;\n\n if (options.addServer && !hasHttp) builtUrl += this._server;\n\n if (path.indexOf(Platform._urlPrefix) == -1 && !hasHttp) builtUrl += Platform._urlPrefix + '/' + Platform._apiVersion;\n\n builtUrl += path;\n\n if (options.addMethod || options.addToken) builtUrl += (path.indexOf('?') > -1 ? '&' : '?');\n\n if (options.addMethod) builtUrl += '_method=' + options.addMethod;\n if (options.addToken) builtUrl += (options.addMethod ? '&' : '') + 'access_token=' + this._auth.accessToken();\n\n return builtUrl;\n\n }\n\n /**\n * @param {string} options.redirectUri\n * @param {string} options.state\n * @param {string} options.brandId\n * @param {string} options.display\n * @param {string} options.prompt\n * @return {string}\n */\n authUrl(options) {\n\n options = options || {};\n\n return this.createUrl(Platform._authorizeEndpoint + '?' + queryStringify({\n 'response_type': 'code',\n 'redirect_uri': options.redirectUri || '',\n 'client_id': this._appKey,\n 'state': options.state || '',\n 'brand_id': options.brandId || '',\n 'display': options.display || '',\n 'prompt': options.prompt || ''\n }), {addServer: true})\n\n }\n\n /**\n * @param {string} url\n * @return {Object}\n */\n parseAuthRedirectUrl(url:string) {\n\n var qs = parseQueryString(url.split('?').reverse()[0]),\n error = qs.error_description || qs.error;\n\n if (error) {\n var e = new Error(error);\n e.error = qs.error;\n throw e;\n }\n\n return qs;\n\n }\n\n /**\n * @return {Promise}\n */\n async loggedIn() {\n\n try {\n await this._ensureAuthentication();\n return true;\n } catch (e) {\n return false;\n }\n\n }\n\n /**\n * @param {string} options.username\n * @param {string} options.password\n * @param {string} options.extension\n * @param {string} options.code\n * @param {string} options.redirectUri\n * @param {string} options.endpointId\n * @returns {Promise}\n */\n async login(options) {\n\n try {\n\n options = options || {};\n\n options.remember = options.remember || false;\n\n this.emit(this.events.beforeLogin);\n\n var body = {\n \"access_token_ttl\": Platform._accessTokenTtl,\n \"refresh_token_ttl\": options.remember ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl\n };\n\n if (!options.code) {\n\n body.grant_type = 'password';\n body.username = options.username;\n body.password = options.password;\n body.extension = options.extension || '';\n\n } else if (options.code) {\n\n body.grant_type = 'authorization_code';\n body.code = options.code;\n body.redirect_uri = options.redirectUri;\n //body.client_id = this.getCredentials().key; // not needed\n\n }\n\n if (options.endpointId) body.endpoint_id = options.endpointId;\n\n var apiResponse = await this._tokenRequest(Platform._tokenEndpoint, body),\n json = apiResponse.json();\n\n this._auth\n .setData(json)\n .setRemember(options.remember);\n\n this.emit(this.events.loginSuccess, apiResponse);\n\n return apiResponse;\n\n } catch (e) {\n\n this._cache.clean();\n\n this.emit(this.events.loginError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n async refresh() {\n\n try {\n\n this.emit(this.events.beforeRefresh);\n\n if (this._queue.isPaused()) {\n\n await this._queue.poll();\n\n if (!this._isAccessTokenValid()) {\n throw new Error('Automatic authentification timeout');\n }\n\n this.emit(this.events.refreshSuccess, null);\n\n return null;\n\n }\n\n this._queue.pause();\n\n // Make sure all existing AJAX calls had a chance to reach the server\n await delay(Platform._refreshDelayMs);\n\n // Perform sanity checks\n if (!this._auth.refreshToken()) throw new Error('Refresh token is missing');\n if (!this._auth.refreshTokenValid()) throw new Error('Refresh token has expired');\n if (!this._queue.isPaused()) throw new Error('Queue was resumed before refresh call');\n\n /** @type {ApiResponse} */\n var res = await this._tokenRequest(Platform._tokenEndpoint, {\n \"grant_type\": \"refresh_token\",\n \"refresh_token\": this._auth.refreshToken(),\n \"access_token_ttl\": Platform._accessTokenTtl,\n \"refresh_token_ttl\": this._auth.remember() ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl\n }),\n json = res.json();\n\n if (!json.access_token) {\n throw this._client.makeError(new Error('Malformed OAuth response'), res);\n }\n\n this._auth.setData(json);\n this._queue.resume();\n\n this.emit(this.events.refreshSuccess, res);\n\n return res;\n\n } catch (e) {\n\n e = this._client.makeError(e);\n\n if (Platform._clearCacheOnRefreshError) {\n this._cache.clean();\n }\n\n this.emit(this.events.refreshError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n async logout() {\n\n try {\n\n this.emit(this.events.beforeLogout);\n\n this._queue.pause();\n\n var res = await this._tokenRequest(Platform._revokeEndpoint, {\n token: this._auth.accessToken()\n });\n\n this._queue.resume();\n this._cache.clean();\n\n this.emit(this.events.logoutSuccess, res);\n\n return res;\n\n } catch (e) {\n\n this._queue.resume();\n\n this.emit(this.events.logoutError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @param {Request} request\n * @param {object} [options]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async inflateRequest(request, options) {\n\n options = options || {};\n\n if (options.skipAuthCheck) return request;\n\n await this._ensureAuthentication();\n\n request.headers.set('Authorization', this._authHeader());\n //request.url = this.createUrl(request.url, {addServer: true}); //FIXME Spec prevents this...\n\n //TODO Add User-Agent here\n\n return request;\n\n }\n\n /**\n * @param {Request} request\n * @param {object} [options]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async sendRequest(request, options) {\n\n try {\n\n request = await this.inflateRequest(request, options);\n\n return (await this._client.sendRequest(request));\n\n } catch (e) {\n\n // Guard is for errors that come from polling\n if (!e.apiResponse || !e.apiResponse.response() || (e.apiResponse.response().status != 401)) throw e;\n\n this._auth.cancelAccessToken();\n\n return (await this.sendRequest(request, options));\n\n }\n\n }\n\n /**\n * General purpose function to send anything to server\n * @param {object} [options.body]\n * @param {string} [options.url]\n * @param {string} [options.method]\n * @param {object} [options.query]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async send(options = {}) {\n\n //FIXME https://github.com/bitinn/node-fetch/issues/43\n options.url = this.createUrl(options.url, {addServer: true});\n\n return await this.sendRequest(this._client.createRequest(options), options);\n\n }\n\n /**\n * @param {string} url\n * @param {object} query\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async get(url, query, options) {\n options = options || {};\n options.method = 'GET';\n options.url = url;\n options.query = query;\n return await this.send(options);\n }\n\n /**\n * @param {string} url\n * @param {object} body\n * @param {object} query\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async post(url, body, query, options) {\n options = options || {};\n options.method = 'POST';\n options.url = url;\n options.query = query;\n options.body = body;\n return await this.send(options);\n }\n\n /**\n * @param {string} url\n * @param {object} body\n * @param {object} query\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async put(url, body, query, options) {\n options = options || {};\n options.method = 'PUT';\n options.url = url;\n options.query = query;\n options.body = body;\n return await this.send(options);\n }\n\n /**\n * @param {string} url\n * @param {string} query\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async 'delete'(url, query, options) {\n options = options || {};\n options.method = 'DELETE';\n options.url = url;\n options.query = query;\n return await this.send(options);\n }\n\n async _tokenRequest(path, body) {\n\n return await this.send({\n url: path,\n skipAuthCheck: true,\n body: body,\n method: 'POST',\n headers: {\n 'Authorization': 'Basic ' + this._apiKey(),\n 'Content-Type': 'application/x-www-form-urlencoded'\n }\n });\n\n }\n\n async _ensureAuthentication() {\n\n if (this._isAccessTokenValid()) return null;\n return await this.refresh();\n\n }\n\n _isAccessTokenValid() {\n\n return (this._auth.accessTokenValid() && !this._queue.isPaused());\n\n }\n\n _apiKey() {\n var apiKey = this._appKey + ':' + this._appSecret;\n return (typeof btoa == 'function') ? btoa(apiKey) : new Buffer(apiKey).toString('base64');\n }\n\n _authHeader() {\n var token = this._auth.accessToken();\n return this._auth.tokenType() + (token ? ' ' + token : '');\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/platform/Platform.js\n **/","import {Promise} from '../core/Externals';\nimport {poll, stopPolling} from '../core/Utils';\n\nexport default class Queue {\n\n static _pollInterval = 250;\n static _releaseTimeout = 5000;\n\n constructor(cache, cacheId) {\n\n this._cache = cache;\n this._cacheId = cacheId;\n this._promise = null;\n\n }\n\n isPaused() {\n\n var storage = this._cache,\n cacheId = this._cacheId,\n time = storage.getItem(cacheId);\n\n return !!time && Date.now() - parseInt(time) < Queue._releaseTimeout;\n }\n\n pause() {\n this._cache.setItem(this._cacheId, Date.now());\n return this;\n }\n\n resume() {\n this._cache.removeItem(this._cacheId);\n return this;\n }\n\n poll() {\n\n if (this._promise) return this._promise;\n\n this._promise = new Promise((resolve, reject) => {\n\n poll((next) => {\n\n if (this.isPaused()) return next();\n\n this._promise = null;\n\n this.resume(); // this is actually not needed but why not\n\n resolve(null);\n\n }, Queue._pollInterval);\n\n });\n\n return this._promise;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/platform/Queue.js\n **/","export default class Auth {\n\n static refreshHandicapMs:number = 60 * 1000; // 1 minute\n static forcedTokenType = 'forced';\n\n constructor(cache, cacheId:string) {\n\n /** @type {Cache} */\n this._cache = cache;\n this._cacheId = cacheId;\n\n }\n\n accessToken() {\n return this.data().access_token;\n }\n\n refreshToken() {\n return this.data().refresh_token;\n }\n\n tokenType() {\n return this.data().token_type;\n }\n\n /**\n * @return {{token_type: string, access_token: string, expires_in: number, refresh_token: string, refresh_token_expires_in: number}}\n */\n data() {\n\n return this._cache.getItem(this._cacheId) || {\n token_type: '',\n access_token: '',\n expires_in: 0,\n refresh_token: '',\n refresh_token_expires_in: 0\n };\n\n }\n\n /**\n * @param {object} newData\n * @return {Auth}\n */\n setData(newData) {\n\n newData = newData || {};\n\n var data = this.data();\n\n Object.keys(newData).forEach((key) => {\n data[key] = newData[key];\n });\n\n data.expire_time = Date.now() + (data.expires_in * 1000);\n data.refresh_token_expire_time = Date.now() + (data.refresh_token_expires_in * 1000);\n\n this._cache.setItem(this._cacheId, data);\n\n return this;\n\n }\n\n /**\n * Check if there is a valid (not expired) access token\n * @return {boolean}\n */\n accessTokenValid() {\n\n var authData = this.data();\n return (authData.token_type === Auth.forcedTokenType || (authData.expire_time - Auth.refreshHandicapMs > Date.now()));\n\n }\n\n /**\n * Check if there is a valid (not expired) access token\n * @return {boolean}\n */\n refreshTokenValid() {\n\n return (this.data().refresh_token_expire_time > Date.now());\n\n }\n\n /**\n * @return {Auth}\n */\n cancelAccessToken() {\n\n return this.setData({\n access_token: '',\n expires_in: 0\n });\n\n }\n\n /**\n * This method sets a special authentication mode used in Service Web\n * @return {Auth}\n */\n forceAuthentication() {\n\n this.setData({\n token_type: Auth.forcedTokenType,\n access_token: '',\n expires_in: 0,\n refresh_token: '',\n refresh_token_expires_in: 0\n });\n\n return this;\n\n }\n\n /**\n * @param remember\n * @return {Auth}\n */\n setRemember(remember) {\n\n return this.setData({remember: remember});\n\n }\n\n /**\n * @return {boolean}\n */\n remember() {\n\n return !!this.data().remember;\n\n }\n\n}\n\n//export interface IAuthData {\n// remember?:boolean;\n// token_type?:string;\n// access_token?:string;\n// expires_in?:number; // actually it's string\n// expire_time?:number;\n// refresh_token?:string;\n// refresh_token_expires_in?:number; // actually it's string\n// refresh_token_expire_time?:number;\n// scope?:string;\n//}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/platform/Auth.js\n **/","import PubnubMock from './PubnubMock.js';\nimport {PUBNUB} from '../core/Externals';\n\nexport default class PubnubMockFactory {\n\n constructor() {\n this.crypto_obj = PUBNUB.crypto_obj;\n }\n\n init(options:PUBNUBInitOptions) {\n return new PubnubMock(options);\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/pubnub/PubnubFactory.js\n **/","import Observable from '../core/Observable';\nimport {PUBNUB} from '../core/Externals';\n\nexport default class PubnubMock extends Observable {\n\n constructor(options) {\n super();\n this.options = options;\n this.crypto_obj = PUBNUB.crypto_obj;\n }\n\n ready() {}\n\n subscribe(options:PUBNUBSubscribeOptions) {\n this.on('message-' + options.channel, options.message);\n }\n\n unsubscribe(options:PUBNUBUnsubscribeOptions) {\n this.off('message-' + options.channel);\n }\n\n receiveMessage(msg, channel) {\n this.emit('message-' + channel, msg, 'env', channel);\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/pubnub/PubnubMock.js\n **/","import Observable from '../core/Observable';\nimport Client from '../http/Client';\nimport {poll, stopPolling} from '../core/Utils';\n\nexport default class Subscription extends Observable {\n\n static _renewHandicapMs = 2 * 60 * 1000;\n static _pollInterval = 10 * 1000;\n\n events = {\n notification: 'notification',\n removeSuccess: 'removeSuccess',\n removeError: 'removeError',\n renewSuccess: 'renewSuccess',\n renewError: 'renewError',\n subscribeSuccess: 'subscribeSuccess',\n subscribeError: 'subscribeError'\n };\n\n constructor(pubnubFactory, platform, cache) {\n\n super();\n\n this._pubnubFactory = pubnubFactory;\n this._platform = platform;\n this._cache = cache;\n this._pubnub = null;\n this._timeout = null;\n this._subscription = {};\n\n }\n\n /**\n * @return {boolean}\n */\n alive() {\n\n return !!(this._subscription.id &&\n this._subscription.deliveryMode &&\n this._subscription.deliveryMode.subscriberKey &&\n this._subscription.deliveryMode.address &&\n Date.now() < this.expirationTime());\n\n }\n\n expirationTime() {\n return new Date(this._subscription.expirationTime || 0).getTime() - Subscription._renewHandicapMs;\n }\n\n setSubscription(subscription) {\n\n subscription = subscription || {};\n\n this._clearTimeout();\n\n this._subscription = subscription;\n\n if (!this._pubnub) this._subscribeAtPubnub();\n\n this._setTimeout();\n\n return this;\n\n }\n\n subscription() {\n return this._subscription;\n }\n\n /**\n * Creates or updates subscription if there is an active one\n * @param {{events?:string[]}} [options] New array of events\n * @returns {Promise}\n */\n async register(options) {\n\n if (this.alive()) {\n return await this.renew(options);\n } else {\n return await this.subscribe(options);\n }\n\n }\n\n eventFilters() {\n return this._subscription.eventFilters || [];\n }\n\n /**\n * @param {string[]} events\n * @return {Subscription}\n */\n addEventFilters(events) {\n this.setEventFilters(this.eventFilters().concat(events));\n return this;\n }\n\n /**\n * @param {string[]} events\n * @return {Subscription}\n */\n setEventFilters(events) {\n this._subscription.eventFilters = events;\n return this;\n }\n\n /**\n * @param {{events?:string[]}} [options] New array of events\n * @returns {Promise}\n */\n async subscribe(options) {\n\n try {\n\n options = options || {};\n\n if (options.events) this.setEventFilters(options.events);\n\n this._clearTimeout();\n\n if (!this.eventFilters().length) throw new Error('Events are undefined');\n\n var response = await this._platform.post('/restapi/v1.0/subscription', {\n eventFilters: this._getFullEventFilters(),\n deliveryMode: {\n transportType: 'PubNub'\n }\n }),\n json = response.json();\n\n this.setSubscription(json)\n .emit(this.events.subscribeSuccess, response);\n\n return response;\n\n\n } catch (e) {\n\n e = this._platform.client().makeError(e);\n\n this.reset()\n .emit(this.events.subscribeError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @param {{events?:string[]}} [options] New array of events\n * @returns {Promise}\n */\n async renew(options) {\n\n try {\n\n options = options || {};\n\n if (options.events) this.setEventFilters(options.events);\n\n this._clearTimeout();\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n if (!this.eventFilters().length) throw new Error('Events are undefined');\n\n var response = await this._platform.put('/restapi/v1.0/subscription/' + this._subscription.id, {\n eventFilters: this._getFullEventFilters()\n });\n\n var json = response.json();\n\n this.setSubscription(json)\n .emit(this.events.renewSuccess, response);\n\n return response;\n\n } catch (e) {\n\n e = this._platform.client().makeError(e);\n\n this.reset()\n .emit(this.events.renewError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n async remove() {\n\n try {\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n var response = await this._platform.delete('/restapi/v1.0/subscription/' + this._subscription.id);\n\n this.reset()\n .emit(this.events.removeSuccess, response);\n\n return response;\n\n } catch (e) {\n\n e = this._platform.client().makeError(e);\n\n this.emit(this.events.removeError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * Remove subscription and disconnect from PUBNUB\n * This method resets subscription at client side but backend is not notified\n */\n reset() {\n this._clearTimeout();\n if (this.alive() && this._pubnub) this._pubnub.unsubscribe({channel: this._subscription.deliveryMode.address});\n this._subscription = {};\n return this;\n }\n\n /**\n *\n * @param {string} cacheKey\n * @param {string[]} events\n * @return {Subscription}\n */\n restoreFromCache(cacheKey, events) {\n\n this.on([this.events.subscribeSuccess, this.events.renewSuccess], () => {\n\n this._cache.setItem(cacheKey, this.subscription());\n\n });\n\n this.on(this.events.renewError, () => {\n\n this.reset()\n .setEventFilters(events)\n .register();\n\n });\n\n var cachedSubscriptionData = this._cache.getItem(cacheKey);\n\n if (cachedSubscriptionData) {\n try {\n this.setSubscription(cachedSubscriptionData);\n } catch (e) {}\n } else {\n this.setEventFilters(events);\n }\n\n return this;\n\n }\n\n _getFullEventFilters() {\n\n return this.eventFilters().map((event) => {\n return this._platform.createUrl(event);\n });\n\n }\n\n _setTimeout() {\n\n this._clearTimeout();\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n poll((next)=> {\n\n if (this.alive()) return next();\n\n this.renew();\n\n }, Subscription._pollInterval, this._timeout);\n\n return this;\n\n }\n\n _clearTimeout() {\n\n stopPolling(this._timeout);\n\n return this;\n\n }\n\n _decrypt(message:any) {\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n if (this._subscription.deliveryMode.encryptionKey) {\n\n var PUBNUB = this._pubnubFactory;\n\n message = PUBNUB.crypto_obj.decrypt(message, this._subscription.deliveryMode.encryptionKey, {\n encryptKey: false,\n keyEncoding: 'base64',\n keyLength: 128,\n mode: 'ecb'\n });\n\n }\n\n return message;\n\n }\n\n _notify(message:any) {\n\n this.emit(this.events.notification, this._decrypt(message));\n\n return this;\n\n }\n\n _subscribeAtPubnub():Subscription {\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n var PUBNUB = this._pubnubFactory;\n\n this._pubnub = PUBNUB.init({\n ssl: true,\n subscribe_key: this._subscription.deliveryMode.subscriberKey\n });\n\n this._pubnub.ready();\n\n this._pubnub.subscribe({\n channel: this._subscription.deliveryMode.address,\n message: this._notify.bind(this),\n connect: () => {}\n });\n\n return this;\n\n }\n\n}\n\n//export interface ISubscription {\n// id?:string;\n// uri?: string;\n// eventFilters?:string[];\n// expirationTime?:string; // 2014-03-12T19:54:35.613Z\n// expiresIn?:number;\n// deliveryMode?: {\n// transportType?:string;\n// encryption?:boolean;\n// address?:string;\n// subscriberKey?:string;\n// encryptionKey?:string;\n// secretKey?:string;\n// };\n// creationTime?:string; // 2014-03-12T19:54:35.613Z\n// status?:string; // Active\n//}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/subscription/Subscription.js\n **/","/**\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 // This invoke function is written in a style that assumes some\n // calling function (or Promise) will handle exceptions.\n function invoke(method, arg) {\n var result = generator[method](arg);\n var value = result.value;\n return value instanceof AwaitArgument\n ? Promise.resolve(value.arg).then(invokeNext, invokeThrow)\n : 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 return result;\n });\n }\n\n if (typeof process === \"object\" && process.domain) {\n invoke = process.domain.bind(invoke);\n }\n\n var invokeNext = invoke.bind(generator, \"next\");\n var invokeThrow = invoke.bind(generator, \"throw\");\n var invokeReturn = invoke.bind(generator, \"return\");\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return invoke(method, arg);\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 ) : new Promise(function (resolve) {\n resolve(callInvokeWithMethodAndArg());\n });\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\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/regenerator/runtime.js\n ** module id = 21\n ** module chunks = 0\n **/"],"sourceRoot":"/source/"} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","ringcentral.js","webpack:/webpack/bootstrap 5d800152b5167bf356e8","webpack:///src/SDK.js","webpack:///src/core/Utils.js","webpack:///src/core/Externals.js","webpack:/external {\"commonjs\":\"es6-promise\",\"commonjs2\":\"es6-promise\"}","webpack:/external {\"commonjs\":\"node-fetch\",\"commonjs2\":\"node-fetch\"}","webpack:/external {\"commonjs\":\"pubnub\",\"commonjs2\":\"pubnub\",\"amd\":\"pubnub\"}","webpack:///src/core/Cache.js","webpack:///src/core/Observable.js","webpack:///src/core/Queue.js","webpack:///src/http/Client.js","webpack:///src/http/Utils.js","webpack:///src/http/ApiResponse.js","webpack:///src/mocks/ClientMock.js","webpack:///src/mocks/Registry.js","webpack:///src/mocks/Mock.js","webpack:///src/platform/Platform.js","webpack:///src/platform/Auth.js","webpack:///src/pubnub/PubnubFactory.js","webpack:///src/pubnub/PubnubMock.js","webpack:///src/subscription/Subscription.js","webpack:///src/subscription/CachedSubscription.js","webpack:///~/regenerator/runtime.js"],"names":["root","factory","exports","module","require","define","amd","undefined","this","__WEBPACK_EXTERNAL_MODULE_4__","__WEBPACK_EXTERNAL_MODULE_5__","__WEBPACK_EXTERNAL_MODULE_6__","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","_interopRequireDefault","obj","__esModule","default","_interopRequireWildcard","newObj","key","Object","prototype","hasOwnProperty","_classCallCheck","instance","Constructor","TypeError","_createClass","defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","defineProperty","protoProps","staticProps","_coreUtils","Utils","_coreCache","_coreCache2","_coreExternals","Externals","_coreObservable","_coreObservable2","_coreQueue","_coreQueue2","_httpClient","_httpClient2","_httpApiResponse","_httpApiResponse2","_httpUtils","HttpUtils","_mocksClientMock","_mocksClientMock2","_mocksMock","_mocksMock2","_mocksRegistry","_mocksRegistry2","_platformPlatform","_platformPlatform2","_platformAuth","_platformAuth2","_pubnubPubnubFactory","_pubnubPubnubFactory2","_subscriptionSubscription","_subscriptionSubscription2","_subscriptionCachedSubscription","_subscriptionCachedSubscription2","SDK","options","_cache","localStorage","cachePrefix","_client","client","_platform","server","appKey","appSecret","_pubnubFactory","pubnubFactory","PUBNUB","value","sandbox","production","platform","createSubscription","createCachedSubscription","cacheKey","cache","Cache","Observable","Queue","Client","ApiResponse","Auth","Platform","Subscription","Registry","Mock","PubnubMockFactory","queryStringify","parameters","array","keys","forEach","k","v","isArray","vv","push","encodeURIComponent","join","parseQueryString","queryString","argsParsed","split","arg","decodeURIComponent","indexOf","trim","pair","isFunction","Array","poll","fn","interval","timeout","stopPolling","next","delay","setTimeout","clearTimeout","isNodeJS","process","isBrowser","window","_ExternalsJs","Promise","resolve","reject","_es6Promise","_es6Promise2","_nodeFetch","_nodeFetch2","_pubnub","_pubnub2","Function","fetch","Request","Response","Headers","storage","prefix","setPrefix","_storage","_prefix","defaultPrefix","setItem","data","_prefixKey","JSON","stringify","removeItem","getItem","item","parse","clean","off","hasListeners","event","_listeners","on","events","callback","_this","Error","emit","_this2","_len","arguments","args","_key","result","some","apply","_this3","cb","_Utils","cacheId","_cacheId","_promise","isPaused","time","Date","now","parseInt","_releaseTimeout","pause","resume","_pollInterval","_inherits","subClass","superClass","create","constructor","setPrototypeOf","__proto__","_ApiResponse","_ApiResponse2","_Observable","beforeRequest","requestSuccess","requestError","sendRequest","request","apiResponse","regeneratorRuntime","async","context$2$0","prev","awrap","_loadResponse","_response","sent","_isMultipart","_isJson","response","text","_text","ok","abrupt","t0","makeError","stop","e","originalMessage","message","error","createRequest","init","headers","url","method","_allowedMethods","credentials","mode","query","findHeaderName","_jsonContentType","body","contentTypeHeaderName","_contentType","contentType","_urlencodedContentType","req","originalBody","createResponse","stringBody","utils","_decode","name","toLowerCase","reduce","res","responseText","_request","_json","_multipart","json","skipOKCheck","status","statusText","error_description","description","multipart","boundary","_getContentType","match","parts","toString","_boundarySeparator","shift","pop","statusInfo","map","part","_isContentType","get","_multipartContentType","_isUrlEncoded","replace","headersAndBody","_bodySeparator","headersText","header","_headerSeparator","append","_Registry","_Registry2","_HttpClient","_registry","registry","mock","find","getResponse","_Mock","_Mock2","_mocks","add","clear","test","path","apiCall","authentication","access_token","token_type","expires_in","refresh_token","refresh_token_expires_in","scope","expireTime","getTime","logout","presenceLoad","uri","extension","extensionNumber","activeCalls","presenceStatus","telephonyStatus","userStatus","dndStatus","extensionId","subscribeGeneric","expiresIn","date","eventFilters","expirationTime","toISOString","deliveryMode","transportType","encryption","address","subscriberKey","secretKey","creationTime","subscribeOnPresence","detailed","encryptionAlgorithm","encryptionKey","tokenRefresh","failure","_method","toUpperCase","_path","_delay","_status","_statusText","str","set","_Auth","_Auth2","beforeLogin","loginSuccess","loginError","beforeRefresh","refreshSuccess","refreshError","beforeLogout","logoutSuccess","logoutError","_server","_appKey","_appSecret","_queue","_auth","auth","createUrl","builtUrl","hasHttp","addServer","_urlPrefix","_apiVersion","addMethod","addToken","accessToken","authUrl","_authorizeEndpoint","response_type","redirect_uri","redirectUri","client_id","state","brand_id","brandId","display","prompt","parseAuthRedirectUrl","qs","reverse","loggedIn","_ensureAuthentication","login","remember","access_token_ttl","_accessTokenTtl","refresh_token_ttl","_refreshTokenTtlRemember","_refreshTokenTtl","code","grant_type","username","password","endpointId","endpoint_id","_tokenRequest","_tokenEndpoint","setData","setRemember","refresh","_isAccessTokenValid","_refreshDelayMs","refreshToken","refreshTokenValid","_clearCacheOnRefreshError","_revokeEndpoint","token","inflateRequest","skipAuthCheck","_authHeader","cancelAccessToken","send","post","put","Authorization","_apiKey","Content-Type","accessTokenValid","apiKey","btoa","Buffer","tokenType","newData","expire_time","refresh_token_expire_time","authData","forcedTokenType","refreshHandicapMs","forceAuthentication","_PubnubMockJs","_PubnubMockJs2","crypto_obj","PubnubMock","ready","subscribe","channel","unsubscribe","receiveMessage","msg","notification","removeSuccess","removeError","renewSuccess","renewError","subscribeSuccess","subscribeError","_timeout","_subscription","subscribed","alive","_renewHandicapMs","setSubscription","subscription","_clearTimeout","_subscribeAtPubnub","_setTimeout","register","renew","addEventFilters","setEventFilters","concat","_getFullEventFilters","reset","remove","resubscribe","_decrypt","decrypt","encryptKey","keyEncoding","keyLength","_notify","ssl","subscribe_key","bind","connect","_extends","assign","source","_Subscription2","_Subscription3","CachedSubscription","_Subscription","_cacheKey","_renewQueue","_resubscribeQueue","queuedRenewSuccess","queuedRenewError","queuedResubscribeSuccess","queuedResubscribeError","actionCb","queue","successEvent","errorEvent","errorMessage","restore","cachedSubscriptionData","global","wrap","innerFn","outerFn","self","tryLocsList","generator","Generator","context","Context","_invoke","makeInvokeMethod","tryCatch","type","err","GeneratorFunction","GeneratorFunctionPrototype","defineIteratorMethods","AwaitArgument","AsyncIterator","invoke","then","invokeNext","invokeThrow","unwrapped","enqueue","callInvokeWithMethodAndArg","previousPromise","domain","GenStateSuspendedStart","GenStateExecuting","GenStateCompleted","doneResult","delegate","iterator","returnMethod","record","info","done","GenStateSuspendedYield","resultName","nextLoc","dispatchException","ContinueSentinel","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","values","iterable","iteratorMethod","iteratorSymbol","isNaN","hasOwn","Symbol","inModule","runtime","Gp","displayName","isGeneratorFunction","genFun","ctor","mark","iter","object","skipTempReset","charAt","slice","rootEntry","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","catch","thrown","delegateYield"],"mappings":"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","file":"ringcentral.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"es6-promise\"), require(\"node-fetch\"), require(\"pubnub\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([, , \"pubnub\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"SDK\"] = factory(require(\"es6-promise\"), require(\"node-fetch\"), require(\"pubnub\"));\n\telse\n\t\troot[\"RingCentral\"] = root[\"RingCentral\"] || {}, root[\"RingCentral\"][\"SDK\"] = factory(root[undefined], root[undefined], root[undefined]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_4__, __WEBPACK_EXTERNAL_MODULE_5__, __WEBPACK_EXTERNAL_MODULE_6__) {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"es6-promise\"), require(\"node-fetch\"), require(\"pubnub\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([, , \"pubnub\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"SDK\"] = factory(require(\"es6-promise\"), require(\"node-fetch\"), require(\"pubnub\"));\n\telse\n\t\troot[\"RingCentral\"] = root[\"RingCentral\"] || {}, root[\"RingCentral\"][\"SDK\"] = factory(root[undefined], root[undefined], root[undefined]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_4__, __WEBPACK_EXTERNAL_MODULE_5__, __WEBPACK_EXTERNAL_MODULE_6__) {\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 = \"/build/\";\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\nmodule.exports = __webpack_require__(1);\n\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _coreUtils = __webpack_require__(2);\n\nvar Utils = _interopRequireWildcard(_coreUtils);\n\nvar _coreCache = __webpack_require__(7);\n\nvar _coreCache2 = _interopRequireDefault(_coreCache);\n\nvar _coreExternals = __webpack_require__(3);\n\nvar Externals = _interopRequireWildcard(_coreExternals);\n\nvar _coreObservable = __webpack_require__(8);\n\nvar _coreObservable2 = _interopRequireDefault(_coreObservable);\n\nvar _coreQueue = __webpack_require__(9);\n\nvar _coreQueue2 = _interopRequireDefault(_coreQueue);\n\nvar _httpClient = __webpack_require__(10);\n\nvar _httpClient2 = _interopRequireDefault(_httpClient);\n\nvar _httpApiResponse = __webpack_require__(12);\n\nvar _httpApiResponse2 = _interopRequireDefault(_httpApiResponse);\n\nvar _httpUtils = __webpack_require__(11);\n\nvar HttpUtils = _interopRequireWildcard(_httpUtils);\n\nvar _mocksClientMock = __webpack_require__(13);\n\nvar _mocksClientMock2 = _interopRequireDefault(_mocksClientMock);\n\nvar _mocksMock = __webpack_require__(15);\n\nvar _mocksMock2 = _interopRequireDefault(_mocksMock);\n\nvar _mocksRegistry = __webpack_require__(14);\n\nvar _mocksRegistry2 = _interopRequireDefault(_mocksRegistry);\n\nvar _platformPlatform = __webpack_require__(16);\n\nvar _platformPlatform2 = _interopRequireDefault(_platformPlatform);\n\nvar _platformAuth = __webpack_require__(17);\n\nvar _platformAuth2 = _interopRequireDefault(_platformAuth);\n\nvar _pubnubPubnubFactory = __webpack_require__(18);\n\nvar _pubnubPubnubFactory2 = _interopRequireDefault(_pubnubPubnubFactory);\n\nvar _subscriptionSubscription = __webpack_require__(20);\n\nvar _subscriptionSubscription2 = _interopRequireDefault(_subscriptionSubscription);\n\nvar _subscriptionCachedSubscription = __webpack_require__(21);\n\nvar _subscriptionCachedSubscription2 = _interopRequireDefault(_subscriptionCachedSubscription);\n\n__webpack_require__(22);\n\nvar SDK = (function () {\n _createClass(SDK, null, [{\n key: 'version',\n value: '2.0.0',\n enumerable: true\n }, {\n key: 'server',\n value: {\n sandbox: 'https://platform.devtest.ringcentral.com',\n production: 'https://platform.ringcentral.com'\n },\n\n /**\n * @constructor\n * @param {object} [options]\n * @param {string} [options.server]\n * @param {string} [options.cachePrefix]\n * @param {string} [options.appSecret]\n * @param {string} [options.appKey]\n * @param {string} [options.appName]\n * @param {string} [options.appVersion]\n * @param {string} [options.pubnubFactory]\n * @param {string} [options.client]\n */\n enumerable: true\n }]);\n\n function SDK(options) {\n _classCallCheck(this, SDK);\n\n options = options || {};\n\n this._cache = new _coreCache2['default'](Externals.localStorage, options.cachePrefix);\n\n this._client = options.client || new _httpClient2['default']();\n\n this._platform = new _platformPlatform2['default'](this._client, this._cache, options.server, options.appKey, options.appSecret);\n\n this._pubnubFactory = options.pubnubFactory || Externals.PUBNUB;\n }\n\n /**\n * @return {Platform}\n */\n\n SDK.prototype.platform = function platform() {\n return this._platform;\n };\n\n /**\n * @return {Subscription}\n */\n\n SDK.prototype.createSubscription = function createSubscription() {\n return new _subscriptionSubscription2['default'](this._pubnubFactory, this._platform);\n };\n\n /**\n * @return {CachedSubscription}\n */\n\n SDK.prototype.createCachedSubscription = function createCachedSubscription(cacheKey) {\n return new _subscriptionCachedSubscription2['default'](this._pubnubFactory, this._platform, this._cache, cacheKey);\n };\n\n /**\n * @return {Cache}\n */\n\n SDK.prototype.cache = function cache() {\n return this._cache;\n };\n\n _createClass(SDK, null, [{\n key: 'core',\n value: {\n Cache: _coreCache2['default'],\n Observable: _coreObservable2['default'],\n Utils: Utils,\n Externals: Externals,\n Queue: _coreQueue2['default']\n },\n enumerable: true\n }, {\n key: 'http',\n value: {\n Client: _httpClient2['default'],\n ApiResponse: _httpApiResponse2['default'],\n Utils: HttpUtils\n },\n enumerable: true\n }, {\n key: 'platform',\n value: {\n Auth: _platformAuth2['default'],\n Platform: _platformPlatform2['default']\n },\n enumerable: true\n }, {\n key: 'subscription',\n value: {\n Subscription: _subscriptionSubscription2['default']\n },\n enumerable: true\n }, {\n key: 'mocks',\n value: {\n Client: _mocksClientMock2['default'],\n Registry: _mocksRegistry2['default'],\n Mock: _mocksMock2['default']\n },\n enumerable: true\n }, {\n key: 'pubnub',\n value: {\n PubnubMockFactory: _pubnubPubnubFactory2['default']\n },\n enumerable: true\n }]);\n\n return SDK;\n})();\n\nexports['default'] = SDK;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\nexports.queryStringify = queryStringify;\nexports.parseQueryString = parseQueryString;\nexports.isFunction = isFunction;\nexports.isArray = isArray;\nexports.poll = poll;\nexports.stopPolling = stopPolling;\nexports.isNodeJS = isNodeJS;\nexports.isBrowser = isBrowser;\nexports.delay = delay;\n\nvar _ExternalsJs = __webpack_require__(3);\n\n/**\n * TODO Replace with something better\n * @see https://github.com/joyent/node/blob/master/lib/querystring.js\n * @param {object} parameters\n * @returns {string}\n */\n\nfunction queryStringify(parameters) {\n\n var array = [];\n\n parameters = parameters || {};\n\n Object.keys(parameters).forEach(function (k) {\n\n var v = parameters[k];\n\n if (isArray(v)) {\n v.forEach(function (vv) {\n array.push(encodeURIComponent(k) + '=' + encodeURIComponent(vv));\n });\n } else {\n array.push(encodeURIComponent(k) + '=' + encodeURIComponent(v));\n }\n });\n\n return array.join('&');\n}\n\n/**\n * TODO Replace with something better\n * @see https://github.com/joyent/node/blob/master/lib/querystring.js\n * @param {string} queryString\n * @returns {object}\n */\n\nfunction parseQueryString(queryString) {\n\n var argsParsed = {};\n\n queryString.split('&').forEach(function (arg) {\n\n arg = decodeURIComponent(arg);\n\n if (arg.indexOf('=') == -1) {\n\n argsParsed[arg.trim()] = true;\n } else {\n\n var pair = arg.split('='),\n key = pair[0].trim(),\n value = pair[1].trim();\n\n if (key in argsParsed) {\n if (key in argsParsed && !isArray(argsParsed[key])) argsParsed[key] = [argsParsed[key]];\n argsParsed[key].push(value);\n } else {\n argsParsed[key] = value;\n }\n }\n });\n\n return argsParsed;\n}\n\n/**\n * @param obj\n * @return {boolean}\n */\n\nfunction isFunction(obj) {\n return typeof obj === \"function\";\n}\n\n/**\n * @param obj\n * @return {boolean}\n */\n\nfunction isArray(obj) {\n return Array.isArray ? Array.isArray(obj) : typeof obj === \"array\";\n}\n\n/**\n * @param fn\n * @param interval\n * @param timeout\n */\n\nfunction poll(fn, interval, timeout) {\n //NodeJS.Timer|number\n\n module.exports.stopPolling(timeout);\n\n interval = interval || 1000;\n\n var next = function next(delay) {\n\n delay = delay || interval;\n\n interval = delay;\n\n return setTimeout(function () {\n\n fn(next, delay);\n }, delay);\n };\n\n return next();\n}\n\nfunction stopPolling(timeout) {\n if (timeout) clearTimeout(timeout);\n}\n\nfunction isNodeJS() {\n return typeof process !== 'undefined';\n}\n\nfunction isBrowser() {\n return typeof window !== 'undefined';\n}\n\nfunction delay(timeout) {\n return new _ExternalsJs.Promise(function (resolve, reject) {\n setTimeout(function () {\n resolve(null);\n }, timeout);\n });\n}\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _es6Promise = __webpack_require__(4);\n\nvar _es6Promise2 = _interopRequireDefault(_es6Promise);\n\nvar _nodeFetch = __webpack_require__(5);\n\nvar _nodeFetch2 = _interopRequireDefault(_nodeFetch);\n\nvar _pubnub = __webpack_require__(6);\n\nvar _pubnub2 = _interopRequireDefault(_pubnub);\n\nvar root = new Function('return this')();\n\nvar Promise = _es6Promise2['default'] && _es6Promise2['default'].Promise || root.Promise;\n\nexports.Promise = Promise;\nvar fetch = root.fetch || _nodeFetch2['default'];\nexports.fetch = fetch;\nvar Request = root.Request || fetch.Request;\nexports.Request = Request;\nvar Response = root.Response || fetch.Response;\nexports.Response = Response;\nvar Headers = root.Headers || fetch.Headers;\n\nexports.Headers = Headers;\nvar PUBNUB = root.PUBNUB || _pubnub2['default'];\n\nexports.PUBNUB = PUBNUB;\nvar localStorage = typeof root.localStorage !== 'undefined' ? root.localStorage : {};\nexports.localStorage = localStorage;\n\n/***/ },\n/* 4 */\n/***/ function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_4__;\n\n/***/ },\n/* 5 */\n/***/ function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_5__;\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_6__;\n\n/***/ },\n/* 7 */\n/***/ function(module, exports) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar Cache = (function () {\n _createClass(Cache, null, [{\n key: 'defaultPrefix',\n value: 'rc-',\n enumerable: true\n }]);\n\n function Cache(storage, prefix) {\n _classCallCheck(this, Cache);\n\n this.setPrefix(prefix);\n this._storage = storage;\n }\n\n Cache.prototype.setPrefix = function setPrefix(prefix) {\n this._prefix = prefix || Cache.defaultPrefix;\n return this;\n };\n\n Cache.prototype.setItem = function setItem(key, data) {\n this._storage[this._prefixKey(key)] = JSON.stringify(data);\n return this;\n };\n\n Cache.prototype.removeItem = function removeItem(key) {\n delete this._storage[this._prefixKey(key)];\n return this;\n };\n\n Cache.prototype.getItem = function getItem(key) {\n var item = this._storage[this._prefixKey(key)];\n if (!item) return null;\n return JSON.parse(item);\n };\n\n Cache.prototype.clean = function clean() {\n\n for (var key in this._storage) {\n\n if (!this._storage.hasOwnProperty(key)) continue;\n\n if (key.indexOf(this._prefix) === 0) {\n delete this._storage[key];\n }\n }\n\n return this;\n };\n\n Cache.prototype._prefixKey = function _prefixKey(key) {\n return this._prefix + key;\n };\n\n return Cache;\n})();\n\nexports['default'] = Cache;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 8 */\n/***/ function(module, exports) {\n\n'use strict';\n\nexports.__esModule = true;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar Observable = (function () {\n function Observable() {\n _classCallCheck(this, Observable);\n\n this.off();\n }\n\n Observable.prototype.hasListeners = function hasListeners(event) {\n return event in this._listeners;\n };\n\n Observable.prototype.on = function on(events, callback) {\n var _this = this;\n\n if (typeof events == 'string') events = [events];\n if (!events) throw new Error('No events to subscribe to');\n if (typeof callback !== 'function') throw new Error('Callback must be a function');\n\n events.forEach(function (event) {\n\n if (!_this.hasListeners(event)) _this._listeners[event] = [];\n\n _this._listeners[event].push(callback);\n });\n\n return this;\n };\n\n Observable.prototype.emit = function emit(event) {\n var _this2 = this;\n\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var result = null;\n\n if (!this.hasListeners(event)) return null;\n\n this._listeners[event].some(function (callback) {\n\n result = callback.apply(_this2, args);\n return result === false;\n });\n\n return result;\n };\n\n Observable.prototype.off = function off(event, callback) {\n var _this3 = this;\n\n if (!event) {\n\n this._listeners = {};\n } else {\n\n if (!callback) {\n\n delete this._listeners[event];\n } else {\n\n if (!this.hasListeners(event)) return this;\n\n this._listeners[event].forEach(function (cb, i) {\n\n if (cb === callback) delete _this3._listeners[event][i];\n });\n }\n }\n\n return this;\n };\n\n return Observable;\n})();\n\nexports['default'] = Observable;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 9 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _coreExternals = __webpack_require__(3);\n\nvar _Utils = __webpack_require__(2);\n\nvar Queue = (function () {\n _createClass(Queue, null, [{\n key: '_pollInterval',\n value: 250,\n enumerable: true\n }, {\n key: '_releaseTimeout',\n value: 5000,\n enumerable: true\n }]);\n\n function Queue(cache, cacheId) {\n _classCallCheck(this, Queue);\n\n this._cache = cache;\n this._cacheId = cacheId;\n this._promise = null;\n }\n\n Queue.prototype.isPaused = function isPaused() {\n\n var time = this._cache.getItem(this._cacheId);\n\n return !!time && Date.now() - parseInt(time) < Queue._releaseTimeout;\n };\n\n Queue.prototype.pause = function pause() {\n this._cache.setItem(this._cacheId, Date.now());\n return this;\n };\n\n Queue.prototype.resume = function resume() {\n this._cache.removeItem(this._cacheId);\n return this;\n };\n\n Queue.prototype.poll = function poll() {\n var _this = this;\n\n if (this._promise) return this._promise;\n\n this._promise = new _coreExternals.Promise(function (resolve, reject) {\n\n _Utils.poll(function (next) {\n\n if (_this.isPaused()) return next();\n\n _this._promise = null;\n\n _this.resume(); // this is actually not needed but why not\n\n resolve(null);\n }, Queue._pollInterval);\n });\n\n return this._promise;\n };\n\n return Queue;\n})();\n\nexports['default'] = Queue;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 10 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _coreExternals = __webpack_require__(3);\n\nvar _coreUtils = __webpack_require__(2);\n\nvar _Utils = __webpack_require__(11);\n\nvar _coreObservable = __webpack_require__(8);\n\nvar _coreObservable2 = _interopRequireDefault(_coreObservable);\n\nvar _ApiResponse = __webpack_require__(12);\n\nvar _ApiResponse2 = _interopRequireDefault(_ApiResponse);\n\nvar Client = (function (_Observable) {\n _inherits(Client, _Observable);\n\n function Client() {\n _classCallCheck(this, Client);\n\n _Observable.apply(this, arguments);\n\n this.events = {\n beforeRequest: 'beforeRequest',\n requestSuccess: 'requestSuccess',\n requestError: 'requestError'\n };\n }\n\n /**\n * @name IApiError\n * @property {string} stack\n * @property {string} originalMessage\n * @property {ApiResponse} apiResponse\n */\n\n /**\n * @param {Request} request\n * @return {Promise}\n */\n\n Client.prototype.sendRequest = function sendRequest(request) {\n var apiResponse;\n return regeneratorRuntime.async(function sendRequest$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n apiResponse = new _ApiResponse2['default'](request);\n context$2$0.prev = 1;\n\n //TODO Stop request if listeners return false\n this.emit(this.events.beforeRequest, apiResponse);\n\n context$2$0.next = 5;\n return regeneratorRuntime.awrap(this._loadResponse(request));\n\n case 5:\n apiResponse._response = context$2$0.sent;\n\n if (!(apiResponse._isMultipart() || apiResponse._isJson())) {\n context$2$0.next = 10;\n break;\n }\n\n context$2$0.next = 9;\n return regeneratorRuntime.awrap(apiResponse.response().text());\n\n case 9:\n apiResponse._text = context$2$0.sent;\n\n case 10:\n if (apiResponse.ok()) {\n context$2$0.next = 12;\n break;\n }\n\n throw new Error('Response has unsuccessful status');\n\n case 12:\n\n this.emit(this.events.requestSuccess, apiResponse);\n\n return context$2$0.abrupt('return', apiResponse);\n\n case 16:\n context$2$0.prev = 16;\n context$2$0.t0 = context$2$0['catch'](1);\n\n if (!context$2$0.t0.apiResponse) context$2$0.t0 = this.makeError(context$2$0.t0, apiResponse);\n\n this.emit(this.events.requestError, context$2$0.t0);\n\n throw context$2$0.t0;\n\n case 21:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[1, 16]]);\n };\n\n /**\n * @param {Request} request\n * @return {Promise}\n * @private\n */\n\n Client.prototype._loadResponse = function _loadResponse(request) {\n return regeneratorRuntime.async(function _loadResponse$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.next = 2;\n return regeneratorRuntime.awrap(_coreExternals.fetch.call(null, request));\n\n case 2:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 3:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n /**\n * Wraps the JS Error object with transaction information\n * @param {Error|IApiError} e\n * @param {ApiResponse} apiResponse\n * @return {IApiError}\n */\n\n Client.prototype.makeError = function makeError(e, apiResponse) {\n\n // Wrap only if regular error\n if (!e.hasOwnProperty('apiResponse') && !e.hasOwnProperty('originalMessage')) {\n\n e.apiResponse = apiResponse;\n e.originalMessage = e.message;\n e.message = apiResponse && apiResponse.error(true) || e.originalMessage;\n }\n\n return e;\n };\n\n /**\n *\n * @param {object} init\n * @param {object} [init.url]\n * @param {object} [init.body]\n * @param {string} [init.method]\n * @param {object} [init.query]\n * @param {object} [init.headers]\n * @return {Request}\n */\n\n Client.prototype.createRequest = function createRequest(init) {\n\n init = init || {};\n init.headers = init.headers || {};\n\n // Sanity checks\n if (!init.url) throw new Error('Url is not defined');\n if (!init.method) init.method = 'GET';\n if (init.method && Client._allowedMethods.indexOf(init.method) < 0) throw new Error('Method has wrong value: ' + init.method);\n\n // Defaults\n init.credentials = init.credentials || 'include';\n init.mode = init.mode || 'cors';\n\n // Append Query String\n if (init.query) {\n init.url = init.url + (init.url.indexOf('?') > -1 ? '&' : '?') + _coreUtils.queryStringify(init.query);\n }\n\n if (!_Utils.findHeaderName('Accept', init.headers)) {\n init.headers['Accept'] = _ApiResponse2['default']._jsonContentType;\n }\n\n // Serialize body\n //TODO Check that body is a plain object\n if (typeof init.body !== 'string' || !init.body) {\n\n var contentTypeHeaderName = _Utils.findHeaderName(_ApiResponse2['default']._contentType, init.headers);\n\n if (!contentTypeHeaderName) {\n contentTypeHeaderName = _ApiResponse2['default']._contentType;\n init.headers[contentTypeHeaderName] = _ApiResponse2['default']._jsonContentType;\n }\n\n var contentType = init.headers[contentTypeHeaderName];\n\n // Assign a new encoded body\n if (contentType.indexOf(_ApiResponse2['default']._jsonContentType) > -1) {\n init.body = JSON.stringify(init.body);\n } else if (contentType.indexOf(_ApiResponse2['default']._urlencodedContentType) > -1) {\n init.body = _coreUtils.queryStringify(init.body);\n }\n }\n\n // Create a request with encoded body\n var req = new _coreExternals.Request(init.url, init);\n\n // Keep the original body accessible directly (for mocks)\n req.originalBody = init.body;\n\n return req;\n };\n\n _createClass(Client, null, [{\n key: '_allowedMethods',\n value: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'],\n enumerable: true\n }]);\n\n return Client;\n})(_coreObservable2['default']);\n\nexports['default'] = Client;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 11 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\nexports.createResponse = createResponse;\nexports.findHeaderName = findHeaderName;\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nvar _coreExternals = __webpack_require__(3);\n\nvar _coreUtils = __webpack_require__(2);\n\nvar utils = _interopRequireWildcard(_coreUtils);\n\n/**\n * Creates a response\n * @param stringBody\n * @param init\n * @return {Response}\n */\n\nfunction createResponse(stringBody, init) {\n\n init = init || {};\n\n var response = new _coreExternals.Response(stringBody, init);\n\n //TODO Wait for https://github.com/bitinn/node-fetch/issues/38\n if (utils.isNodeJS()) {\n\n response._text = stringBody;\n response._decode = function () {\n return this._text;\n };\n }\n\n return response;\n}\n\nfunction findHeaderName(name, headers) {\n name = name.toLowerCase();\n return Object.keys(headers).reduce(function (res, key) {\n if (res) return res;\n if (name == key.toLowerCase()) return key;\n return res;\n }, null);\n}\n\n/***/ },\n/* 12 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _coreExternals = __webpack_require__(3);\n\nvar _Utils = __webpack_require__(11);\n\nvar utils = _interopRequireWildcard(_Utils);\n\nvar ApiResponse = (function () {\n _createClass(ApiResponse, null, [{\n key: '_contentType',\n value: 'Content-Type',\n enumerable: true\n }, {\n key: '_jsonContentType',\n value: 'application/json',\n enumerable: true\n }, {\n key: '_multipartContentType',\n value: 'multipart/mixed',\n enumerable: true\n }, {\n key: '_urlencodedContentType',\n value: 'application/x-www-form-urlencoded',\n enumerable: true\n }, {\n key: '_headerSeparator',\n value: ':',\n enumerable: true\n }, {\n key: '_bodySeparator',\n value: '\\n\\n',\n enumerable: true\n }, {\n key: '_boundarySeparator',\n value: '--',\n\n /**\n * @param {Request} request\n * @param {Response} response\n * @param {string} responseText\n */\n enumerable: true\n }]);\n\n function ApiResponse(request, response, responseText) {\n _classCallCheck(this, ApiResponse);\n\n /** @type {Request} */\n this._request = request;\n\n /** @type {Response} */\n this._response = response;\n\n this._text = responseText;\n this._json = null;\n this._multipart = [];\n }\n\n /**\n * @return {Response}\n */\n\n ApiResponse.prototype.response = function response() {\n return this._response;\n };\n\n /**\n * @return {Request}\n */\n\n ApiResponse.prototype.request = function request() {\n return this._request;\n };\n\n /**\n * @return {boolean}\n */\n\n ApiResponse.prototype.ok = function ok() {\n return this._response && this._response.ok;\n };\n\n /**\n * @return {string}\n */\n\n ApiResponse.prototype.text = function text() {\n if (!this._isJson() && !this._isMultipart()) throw new Error('Response is not text');\n return this._text;\n };\n\n /**\n * @return {object}\n */\n\n ApiResponse.prototype.json = function json() {\n if (!this._isJson()) throw new Error('Response is not JSON');\n if (!this._json) {\n this._json = this._text ? JSON.parse(this._text) : null;\n }\n return this._json;\n };\n\n /**\n * @param [skipOKCheck]\n * @return {string}\n */\n\n ApiResponse.prototype.error = function error(skipOKCheck) {\n\n if (this.ok() && !skipOKCheck) return null;\n\n var message = (this._response && this._response.status ? this._response.status + ' ' : '') + (this._response && this._response.statusText ? this._response.statusText : '');\n\n try {\n\n if (this.json().message) message = this.json().message;\n if (this.json().error_description) message = this.json().error_description;\n if (this.json().description) message = this.json().description;\n } catch (e) {}\n\n return message;\n };\n\n /**\n * @return {ApiResponse[]}\n */\n\n ApiResponse.prototype.multipart = function multipart() {\n\n if (!this._isMultipart()) throw new Error('Response is not multipart');\n\n if (!this._multipart.length) {\n\n // Step 1. Split multipart response\n\n var text = this.text();\n\n if (!text) throw new Error('No response body');\n\n var boundary = this._getContentType().match(/boundary=([^;]+)/i)[1];\n\n if (!boundary) throw new Error('Cannot find boundary');\n\n var parts = text.toString().split(ApiResponse._boundarySeparator + boundary);\n\n if (parts[0].trim() === '') parts.shift();\n if (parts[parts.length - 1].trim() == ApiResponse._boundarySeparator) parts.pop();\n\n if (parts.length < 1) throw new Error('No parts in body');\n\n // Step 2. Parse status info\n\n var statusInfo = ApiResponse.create(parts.shift(), this._response.status, this._response.statusText).json();\n\n // Step 3. Parse all other parts\n\n this._multipart = parts.map(function (part, i) {\n\n var status = statusInfo.response[i].status;\n\n return ApiResponse.create(part, status);\n });\n }\n\n return this._multipart;\n };\n\n ApiResponse.prototype._isContentType = function _isContentType(contentType) {\n return this._getContentType().indexOf(contentType) > -1;\n };\n\n ApiResponse.prototype._getContentType = function _getContentType() {\n return this._response.headers.get(ApiResponse._contentType) || '';\n };\n\n ApiResponse.prototype._isMultipart = function _isMultipart() {\n return this._isContentType(ApiResponse._multipartContentType);\n };\n\n ApiResponse.prototype._isUrlEncoded = function _isUrlEncoded() {\n return this._isContentType(ApiResponse._urlencodedContentType);\n };\n\n ApiResponse.prototype._isJson = function _isJson() {\n return this._isContentType(ApiResponse._jsonContentType);\n };\n\n /**\n * Method is used to create ApiResponse object from string parts of multipart/mixed response\n * @param {string} [text]\n * @param {number} [status]\n * @param {string} [statusText]\n * @return {ApiResponse}\n */\n\n ApiResponse.create = function create(text, status, statusText) {\n\n text = text || '';\n status = status || 200;\n statusText = statusText || 'OK';\n\n text = text.replace(/\\r/g, '');\n\n var headers = new _coreExternals.Headers(),\n headersAndBody = text.split(ApiResponse._bodySeparator),\n headersText = headersAndBody.length > 1 ? headersAndBody.shift() : '';\n\n text = headersAndBody.join(ApiResponse._bodySeparator);\n\n (headersText || '').split('\\n').forEach(function (header) {\n\n var split = header.trim().split(ApiResponse._headerSeparator),\n key = split.shift().trim(),\n value = split.join(ApiResponse._headerSeparator).trim();\n\n if (key) headers.append(key, value);\n });\n\n return new ApiResponse(null, utils.createResponse(text, {\n headers: headers,\n status: status,\n statusText: statusText\n }), text);\n };\n\n return ApiResponse;\n})();\n\nexports['default'] = ApiResponse;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 13 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _Registry = __webpack_require__(14);\n\nvar _Registry2 = _interopRequireDefault(_Registry);\n\nvar _httpClient = __webpack_require__(10);\n\nvar _httpClient2 = _interopRequireDefault(_httpClient);\n\nvar Client = (function (_HttpClient) {\n _inherits(Client, _HttpClient);\n\n function Client() {\n _classCallCheck(this, Client);\n\n _HttpClient.call(this);\n this._registry = new _Registry2['default']();\n }\n\n Client.prototype.registry = function registry() {\n return this._registry;\n };\n\n Client.prototype._loadResponse = function _loadResponse(request) {\n var mock;\n return regeneratorRuntime.async(function _loadResponse$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n mock = this._registry.find(request);\n context$2$0.next = 3;\n return regeneratorRuntime.awrap(mock.getResponse(request));\n\n case 3:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 4:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n return Client;\n})(_httpClient2['default']);\n\nexports['default'] = Client;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 14 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _Mock = __webpack_require__(15);\n\nvar _Mock2 = _interopRequireDefault(_Mock);\n\nvar Registry = (function () {\n function Registry() {\n _classCallCheck(this, Registry);\n\n this._mocks = [];\n }\n\n Registry.prototype.add = function add(mock) {\n this._mocks.push(mock);\n return this;\n };\n\n Registry.prototype.clear = function clear() {\n this._mocks = [];\n return this;\n };\n\n Registry.prototype.find = function find(request) {\n\n //console.log('Registry is looking for', request);\n\n var mock = this._mocks.shift();\n\n if (!mock) throw new Error('No mock in registry for request ' + request.method + ' ' + request.url);\n\n if (!mock.test(request)) throw new Error('Wrong request ' + request.method + ' ' + request.url + ' for expected mock ' + mock.method() + ' ' + mock.path());\n\n return mock;\n };\n\n Registry.prototype.apiCall = function apiCall(method, path, response, status, statusText) {\n\n this.add(new _Mock2['default'](method, path, response, status, statusText));\n\n return this;\n };\n\n Registry.prototype.authentication = function authentication() {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'access_token': 'ACCESS_TOKEN',\n 'token_type': 'bearer',\n 'expires_in': 3600,\n 'refresh_token': 'REFRESH_TOKEN',\n 'refresh_token_expires_in': 60480,\n 'scope': 'SMS RCM Foo Boo',\n 'expireTime': new Date().getTime() + 3600000\n });\n\n return this;\n };\n\n Registry.prototype.logout = function logout() {\n\n this.apiCall('POST', '/restapi/oauth/revoke', {});\n\n return this;\n };\n\n Registry.prototype.presenceLoad = function presenceLoad(id) {\n\n this.apiCall('GET', '/restapi/v1.0/account/~/extension/' + id + '/presence', {\n \"uri\": \"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/\" + id + \"/presence\",\n \"extension\": {\n \"uri\": \"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/\" + id,\n \"id\": id,\n \"extensionNumber\": \"101\"\n },\n \"activeCalls\": [],\n \"presenceStatus\": \"Available\",\n \"telephonyStatus\": \"Ringing\",\n \"userStatus\": \"Available\",\n \"dndStatus\": \"TakeAllCalls\",\n \"extensionId\": id\n });\n\n return this;\n };\n\n Registry.prototype.subscribeGeneric = function subscribeGeneric(expiresIn) {\n\n expiresIn = expiresIn || 15 * 60 * 60;\n\n var date = new Date();\n\n this.apiCall('POST', '/restapi/v1.0/subscription', {\n 'eventFilters': ['/restapi/v1.0/account/~/extension/~/presence'],\n 'expirationTime': new Date(date.getTime() + expiresIn * 1000).toISOString(),\n 'expiresIn': expiresIn,\n 'deliveryMode': {\n 'transportType': 'PubNub',\n 'encryption': false,\n 'address': '123_foo',\n 'subscriberKey': 'sub-c-foo',\n 'secretKey': 'sec-c-bar'\n },\n 'id': 'foo-bar-baz',\n 'creationTime': date.toISOString(),\n 'status': 'Active',\n 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz'\n });\n\n return this;\n };\n\n Registry.prototype.subscribeOnPresence = function subscribeOnPresence(id, detailed) {\n\n id = id || '1';\n\n var date = new Date();\n\n this.apiCall('POST', '/restapi/v1.0/subscription', {\n 'eventFilters': ['/restapi/v1.0/account/~/extension/' + id + '/presence' + (detailed ? '?detailedTelephonyState=true' : '')],\n 'expirationTime': new Date(date.getTime() + 15 * 60 * 60 * 1000).toISOString(),\n 'deliveryMode': {\n 'transportType': 'PubNub',\n 'encryption': true,\n 'address': '123_foo',\n 'subscriberKey': 'sub-c-foo',\n 'secretKey': 'sec-c-bar',\n 'encryptionAlgorithm': 'AES',\n 'encryptionKey': 'VQwb6EVNcQPBhE/JgFZ2zw=='\n },\n 'creationTime': date.toISOString(),\n 'id': 'foo-bar-baz',\n 'status': 'Active',\n 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz'\n });\n\n return this;\n };\n\n Registry.prototype.tokenRefresh = function tokenRefresh(failure) {\n\n if (!failure) {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'access_token': 'ACCESS_TOKEN_FROM_REFRESH',\n 'token_type': 'bearer',\n 'expires_in': 3600,\n 'refresh_token': 'REFRESH_TOKEN_FROM_REFRESH',\n 'refresh_token_expires_in': 60480,\n 'scope': 'SMS RCM Foo Boo'\n });\n } else {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'message': 'Wrong token',\n 'error_description': 'Wrong token',\n 'description': 'Wrong token'\n }, 400);\n }\n\n return this;\n };\n\n return Registry;\n})();\n\nexports['default'] = Registry;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 15 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _httpApiResponse = __webpack_require__(12);\n\nvar _httpApiResponse2 = _interopRequireDefault(_httpApiResponse);\n\nvar _coreUtils = __webpack_require__(2);\n\nvar _httpUtils = __webpack_require__(11);\n\nvar Mock = (function () {\n function Mock(method, path, json, status, statusText, delay) {\n _classCallCheck(this, Mock);\n\n this._method = method.toUpperCase();\n this._path = path;\n this._json = json || {};\n this._delay = delay || 10;\n this._status = status || 200;\n this._statusText = statusText || 'OK';\n }\n\n Mock.prototype.path = function path() {\n return this._path;\n };\n\n Mock.prototype.method = function method() {\n return this._method;\n };\n\n Mock.prototype.test = function test(request) {\n\n return request.url.indexOf(this._path) > -1 && request.method.toUpperCase() == this._method;\n };\n\n Mock.prototype.getResponse = function getResponse(request) {\n return regeneratorRuntime.async(function getResponse$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.next = 2;\n return regeneratorRuntime.awrap(_coreUtils.delay(this._delay));\n\n case 2:\n return context$2$0.abrupt('return', this.createResponse(this._json));\n\n case 3:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n Mock.prototype.createResponse = function createResponse(json, init) {\n\n init = init || {};\n\n init.status = init.status || this._status;\n init.statusText = init.statusText || this._statusText;\n\n var str = JSON.stringify(json),\n res = _httpUtils.createResponse(str, init);\n\n res.headers.set(_httpApiResponse2['default']._contentType, _httpApiResponse2['default']._jsonContentType);\n\n return res;\n };\n\n return Mock;\n})();\n\nexports['default'] = Mock;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 16 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _coreObservable = __webpack_require__(8);\n\nvar _coreObservable2 = _interopRequireDefault(_coreObservable);\n\nvar _coreQueue = __webpack_require__(9);\n\nvar _coreQueue2 = _interopRequireDefault(_coreQueue);\n\nvar _Auth = __webpack_require__(17);\n\nvar _Auth2 = _interopRequireDefault(_Auth);\n\nvar _coreExternals = __webpack_require__(3);\n\nvar _coreUtils = __webpack_require__(2);\n\nvar Platform = (function (_Observable) {\n _inherits(Platform, _Observable);\n\n _createClass(Platform, null, [{\n key: '_urlPrefix',\n value: '/restapi',\n enumerable: true\n }, {\n key: '_apiVersion',\n value: 'v1.0',\n enumerable: true\n }, {\n key: '_accessTokenTtl',\n value: null,\n // Platform server by default sets it to 60 * 60 = 1 hour\n enumerable: true\n }, {\n key: '_refreshTokenTtl',\n value: 10 * 60 * 60,\n // 10 hours\n enumerable: true\n }, {\n key: '_refreshTokenTtlRemember',\n value: 7 * 24 * 60 * 60,\n // 1 week\n enumerable: true\n }, {\n key: '_tokenEndpoint',\n value: '/restapi/oauth/token',\n enumerable: true\n }, {\n key: '_revokeEndpoint',\n value: '/restapi/oauth/revoke',\n enumerable: true\n }, {\n key: '_authorizeEndpoint',\n value: '/restapi/oauth/authorize',\n enumerable: true\n }, {\n key: '_refreshDelayMs',\n value: 100,\n enumerable: true\n }, {\n key: '_cacheId',\n value: 'platform',\n enumerable: true\n }, {\n key: '_clearCacheOnRefreshError',\n value: true,\n enumerable: true\n }]);\n\n function Platform(client, cache, server, appKey, appSecret) {\n _classCallCheck(this, Platform);\n\n _Observable.call(this);\n\n this.events = {\n beforeLogin: 'beforeLogin',\n loginSuccess: 'loginSuccess',\n loginError: 'loginError',\n beforeRefresh: 'beforeRefresh',\n refreshSuccess: 'refreshSuccess',\n refreshError: 'refreshError',\n beforeLogout: 'beforeLogout',\n logoutSuccess: 'logoutSuccess',\n logoutError: 'logoutError'\n };\n this._server = server;\n this._appKey = appKey;\n this._appSecret = appSecret;\n\n /** @type {Cache} */\n this._cache = cache;\n\n /** @type {Client} */\n this._client = client;\n\n this._queue = new _coreQueue2['default'](this._cache, Platform._cacheId + '-refresh');\n\n this._auth = new _Auth2['default'](this._cache, Platform._cacheId);\n }\n\n /**\n * @return {Auth}\n */\n\n Platform.prototype.auth = function auth() {\n return this._auth;\n };\n\n /**\n * @return {Client}\n */\n\n Platform.prototype.client = function client() {\n return this._client;\n };\n\n /**\n * @param {string} path\n * @param {object} [options]\n * @param {boolean} [options.addServer]\n * @param {string} [options.addMethod]\n * @param {boolean} [options.addToken]\n * @return {string}\n */\n\n Platform.prototype.createUrl = function createUrl(path, options) {\n\n path = path || '';\n options = options || {};\n\n var builtUrl = '',\n hasHttp = path.indexOf('http://') != -1 || path.indexOf('https://') != -1;\n\n if (options.addServer && !hasHttp) builtUrl += this._server;\n\n if (path.indexOf(Platform._urlPrefix) == -1 && !hasHttp) builtUrl += Platform._urlPrefix + '/' + Platform._apiVersion;\n\n builtUrl += path;\n\n if (options.addMethod || options.addToken) builtUrl += path.indexOf('?') > -1 ? '&' : '?';\n\n if (options.addMethod) builtUrl += '_method=' + options.addMethod;\n if (options.addToken) builtUrl += (options.addMethod ? '&' : '') + 'access_token=' + this._auth.accessToken();\n\n return builtUrl;\n };\n\n /**\n * @param {string} options.redirectUri\n * @param {string} options.state\n * @param {string} options.brandId\n * @param {string} options.display\n * @param {string} options.prompt\n * @return {string}\n */\n\n Platform.prototype.authUrl = function authUrl(options) {\n\n options = options || {};\n\n return this.createUrl(Platform._authorizeEndpoint + '?' + _coreUtils.queryStringify({\n 'response_type': 'code',\n 'redirect_uri': options.redirectUri || '',\n 'client_id': this._appKey,\n 'state': options.state || '',\n 'brand_id': options.brandId || '',\n 'display': options.display || '',\n 'prompt': options.prompt || ''\n }), { addServer: true });\n };\n\n /**\n * @param {string} url\n * @return {Object}\n */\n\n Platform.prototype.parseAuthRedirectUrl = function parseAuthRedirectUrl(url) {\n\n var qs = _coreUtils.parseQueryString(url.split('?').reverse()[0]),\n error = qs.error_description || qs.error;\n\n if (error) {\n var e = new Error(error);\n e.error = qs.error;\n throw e;\n }\n\n return qs;\n };\n\n /**\n * @return {Promise}\n */\n\n Platform.prototype.loggedIn = function loggedIn() {\n return regeneratorRuntime.async(function loggedIn$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n context$2$0.next = 3;\n return regeneratorRuntime.awrap(this._ensureAuthentication());\n\n case 3:\n return context$2$0.abrupt('return', true);\n\n case 6:\n context$2$0.prev = 6;\n context$2$0.t0 = context$2$0['catch'](0);\n return context$2$0.abrupt('return', false);\n\n case 9:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 6]]);\n };\n\n /**\n * @param {string} options.username\n * @param {string} options.password\n * @param {string} options.extension\n * @param {string} options.code\n * @param {string} options.redirectUri\n * @param {string} options.endpointId\n * @returns {Promise}\n */\n\n Platform.prototype.login = function login(options) {\n var body, apiResponse, json;\n return regeneratorRuntime.async(function login$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n\n options = options || {};\n\n options.remember = options.remember || false;\n\n this.emit(this.events.beforeLogin);\n\n body = {\n \"access_token_ttl\": Platform._accessTokenTtl,\n \"refresh_token_ttl\": options.remember ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl\n };\n\n if (!options.code) {\n\n body.grant_type = 'password';\n body.username = options.username;\n body.password = options.password;\n body.extension = options.extension || '';\n } else if (options.code) {\n\n body.grant_type = 'authorization_code';\n body.code = options.code;\n body.redirect_uri = options.redirectUri;\n //body.client_id = this.getCredentials().key; // not needed\n }\n\n if (options.endpointId) body.endpoint_id = options.endpointId;\n\n context$2$0.next = 9;\n return regeneratorRuntime.awrap(this._tokenRequest(Platform._tokenEndpoint, body));\n\n case 9:\n apiResponse = context$2$0.sent;\n json = apiResponse.json();\n\n this._auth.setData(json).setRemember(options.remember);\n\n this.emit(this.events.loginSuccess, apiResponse);\n\n return context$2$0.abrupt('return', apiResponse);\n\n case 16:\n context$2$0.prev = 16;\n context$2$0.t0 = context$2$0['catch'](0);\n\n this._cache.clean();\n\n this.emit(this.events.loginError, context$2$0.t0);\n\n throw context$2$0.t0;\n\n case 21:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 16]]);\n };\n\n /**\n * @returns {Promise}\n */\n\n Platform.prototype.refresh = function refresh() {\n var res, json;\n return regeneratorRuntime.async(function refresh$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n\n this.emit(this.events.beforeRefresh);\n\n if (!this._queue.isPaused()) {\n context$2$0.next = 9;\n break;\n }\n\n context$2$0.next = 5;\n return regeneratorRuntime.awrap(this._queue.poll());\n\n case 5:\n if (this._isAccessTokenValid()) {\n context$2$0.next = 7;\n break;\n }\n\n throw new Error('Automatic authentification timeout');\n\n case 7:\n\n this.emit(this.events.refreshSuccess, null);\n\n return context$2$0.abrupt('return', null);\n\n case 9:\n\n this._queue.pause();\n\n // Make sure all existing AJAX calls had a chance to reach the server\n context$2$0.next = 12;\n return regeneratorRuntime.awrap(_coreUtils.delay(Platform._refreshDelayMs));\n\n case 12:\n if (this._auth.refreshToken()) {\n context$2$0.next = 14;\n break;\n }\n\n throw new Error('Refresh token is missing');\n\n case 14:\n if (this._auth.refreshTokenValid()) {\n context$2$0.next = 16;\n break;\n }\n\n throw new Error('Refresh token has expired');\n\n case 16:\n if (this._queue.isPaused()) {\n context$2$0.next = 18;\n break;\n }\n\n throw new Error('Queue was resumed before refresh call');\n\n case 18:\n context$2$0.next = 20;\n return regeneratorRuntime.awrap(this._tokenRequest(Platform._tokenEndpoint, {\n \"grant_type\": \"refresh_token\",\n \"refresh_token\": this._auth.refreshToken(),\n \"access_token_ttl\": Platform._accessTokenTtl,\n \"refresh_token_ttl\": this._auth.remember() ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl\n }));\n\n case 20:\n res = context$2$0.sent;\n json = res.json();\n\n if (json.access_token) {\n context$2$0.next = 24;\n break;\n }\n\n throw this._client.makeError(new Error('Malformed OAuth response'), res);\n\n case 24:\n\n this._auth.setData(json);\n this._queue.resume();\n\n this.emit(this.events.refreshSuccess, res);\n\n return context$2$0.abrupt('return', res);\n\n case 30:\n context$2$0.prev = 30;\n context$2$0.t0 = context$2$0['catch'](0);\n\n context$2$0.t0 = this._client.makeError(context$2$0.t0);\n\n if (Platform._clearCacheOnRefreshError) {\n this._cache.clean();\n }\n\n this.emit(this.events.refreshError, context$2$0.t0);\n\n throw context$2$0.t0;\n\n case 36:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 30]]);\n };\n\n /**\n * @returns {Promise}\n */\n\n Platform.prototype.logout = function logout() {\n var res;\n return regeneratorRuntime.async(function logout$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n\n this.emit(this.events.beforeLogout);\n\n this._queue.pause();\n\n context$2$0.next = 5;\n return regeneratorRuntime.awrap(this._tokenRequest(Platform._revokeEndpoint, {\n token: this._auth.accessToken()\n }));\n\n case 5:\n res = context$2$0.sent;\n\n this._queue.resume();\n this._cache.clean();\n\n this.emit(this.events.logoutSuccess, res);\n\n return context$2$0.abrupt('return', res);\n\n case 12:\n context$2$0.prev = 12;\n context$2$0.t0 = context$2$0['catch'](0);\n\n this._queue.resume();\n\n this.emit(this.events.logoutError, context$2$0.t0);\n\n throw context$2$0.t0;\n\n case 17:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 12]]);\n };\n\n /**\n * @param {Request} request\n * @param {object} [options]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n\n Platform.prototype.inflateRequest = function inflateRequest(request, options) {\n return regeneratorRuntime.async(function inflateRequest$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n\n options = options || {};\n\n if (!options.skipAuthCheck) {\n context$2$0.next = 3;\n break;\n }\n\n return context$2$0.abrupt('return', request);\n\n case 3:\n context$2$0.next = 5;\n return regeneratorRuntime.awrap(this._ensureAuthentication());\n\n case 5:\n\n request.headers.set('Authorization', this._authHeader());\n //request.url = this.createUrl(request.url, {addServer: true}); //FIXME Spec prevents this...\n\n //TODO Add User-Agent here\n\n return context$2$0.abrupt('return', request);\n\n case 7:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n /**\n * @param {Request} request\n * @param {object} [options]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n\n Platform.prototype.sendRequest = function sendRequest(request, options) {\n return regeneratorRuntime.async(function sendRequest$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n context$2$0.next = 3;\n return regeneratorRuntime.awrap(this.inflateRequest(request, options));\n\n case 3:\n request = context$2$0.sent;\n context$2$0.next = 6;\n return regeneratorRuntime.awrap(this._client.sendRequest(request));\n\n case 6:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 9:\n context$2$0.prev = 9;\n context$2$0.t0 = context$2$0['catch'](0);\n\n if (!(!context$2$0.t0.apiResponse || !context$2$0.t0.apiResponse.response() || context$2$0.t0.apiResponse.response().status != 401)) {\n context$2$0.next = 13;\n break;\n }\n\n throw context$2$0.t0;\n\n case 13:\n\n this._auth.cancelAccessToken();\n\n context$2$0.next = 16;\n return regeneratorRuntime.awrap(this.sendRequest(request, options));\n\n case 16:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 17:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 9]]);\n };\n\n /**\n * General purpose function to send anything to server\n * @param {string} options.url\n * @param {object} [options.body]\n * @param {string} [options.method]\n * @param {object} [options.query]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n\n Platform.prototype.send = function send() {\n var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n return regeneratorRuntime.async(function send$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n\n //FIXME https://github.com/bitinn/node-fetch/issues/43\n options.url = this.createUrl(options.url, { addServer: true });\n\n context$2$0.next = 3;\n return regeneratorRuntime.awrap(this.sendRequest(this._client.createRequest(options), options));\n\n case 3:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 4:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n /**\n * @param {string} url\n * @param {object} [query]\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n\n Platform.prototype.get = function get(url, query, options) {\n return regeneratorRuntime.async(function get$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n options = options || {};\n options.method = 'GET';\n options.url = url;\n options.query = query;\n context$2$0.next = 6;\n return regeneratorRuntime.awrap(this.send(options));\n\n case 6:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 7:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n /**\n * @param {string} url\n * @param {object} body\n * @param {object} [query]\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n\n Platform.prototype.post = function post(url, body, query, options) {\n return regeneratorRuntime.async(function post$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n options = options || {};\n options.method = 'POST';\n options.url = url;\n options.query = query;\n options.body = body;\n context$2$0.next = 7;\n return regeneratorRuntime.awrap(this.send(options));\n\n case 7:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 8:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n /**\n * @param {string} url\n * @param {object} [body]\n * @param {object} [query]\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n\n Platform.prototype.put = function put(url, body, query, options) {\n return regeneratorRuntime.async(function put$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n options = options || {};\n options.method = 'PUT';\n options.url = url;\n options.query = query;\n options.body = body;\n context$2$0.next = 7;\n return regeneratorRuntime.awrap(this.send(options));\n\n case 7:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 8:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n /**\n * @param {string} url\n * @param {string} [query]\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n\n Platform.prototype['delete'] = function _delete(url, query, options) {\n return regeneratorRuntime.async(function _delete$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n options = options || {};\n options.method = 'DELETE';\n options.url = url;\n options.query = query;\n context$2$0.next = 6;\n return regeneratorRuntime.awrap(this.send(options));\n\n case 6:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 7:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n Platform.prototype._tokenRequest = function _tokenRequest(path, body) {\n return regeneratorRuntime.async(function _tokenRequest$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.next = 2;\n return regeneratorRuntime.awrap(this.send({\n url: path,\n skipAuthCheck: true,\n body: body,\n method: 'POST',\n headers: {\n 'Authorization': 'Basic ' + this._apiKey(),\n 'Content-Type': 'application/x-www-form-urlencoded'\n }\n }));\n\n case 2:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 3:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n Platform.prototype._ensureAuthentication = function _ensureAuthentication() {\n return regeneratorRuntime.async(function _ensureAuthentication$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n if (!this._isAccessTokenValid()) {\n context$2$0.next = 2;\n break;\n }\n\n return context$2$0.abrupt('return', null);\n\n case 2:\n context$2$0.next = 4;\n return regeneratorRuntime.awrap(this.refresh());\n\n case 4:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 5:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n Platform.prototype._isAccessTokenValid = function _isAccessTokenValid() {\n\n return this._auth.accessTokenValid() && !this._queue.isPaused();\n };\n\n Platform.prototype._apiKey = function _apiKey() {\n var apiKey = this._appKey + ':' + this._appSecret;\n return typeof btoa == 'function' ? btoa(apiKey) : new Buffer(apiKey).toString('base64');\n };\n\n Platform.prototype._authHeader = function _authHeader() {\n var token = this._auth.accessToken();\n return this._auth.tokenType() + (token ? ' ' + token : '');\n };\n\n return Platform;\n})(_coreObservable2['default']);\n\nexports['default'] = Platform;\nmodule.exports = exports['default'];\n\n// Perform sanity checks\n\n/** @type {ApiResponse} */\n\n// Guard is for errors that come from polling\n\n/***/ },\n/* 17 */\n/***/ function(module, exports) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar Auth = (function () {\n _createClass(Auth, null, [{\n key: 'refreshHandicapMs',\n value: 60 * 1000,\n // 1 minute\n enumerable: true\n }, {\n key: 'forcedTokenType',\n value: 'forced',\n enumerable: true\n }]);\n\n function Auth(cache, cacheId) {\n _classCallCheck(this, Auth);\n\n /** @type {Cache} */\n this._cache = cache;\n this._cacheId = cacheId;\n }\n\n //export interface IAuthData {\n // remember?:boolean;\n // token_type?:string;\n // access_token?:string;\n // expires_in?:number; // actually it's string\n // expire_time?:number;\n // refresh_token?:string;\n // refresh_token_expires_in?:number; // actually it's string\n // refresh_token_expire_time?:number;\n // scope?:string;\n //}\n\n Auth.prototype.accessToken = function accessToken() {\n return this.data().access_token;\n };\n\n Auth.prototype.refreshToken = function refreshToken() {\n return this.data().refresh_token;\n };\n\n Auth.prototype.tokenType = function tokenType() {\n return this.data().token_type;\n };\n\n /**\n * @return {{token_type: string, access_token: string, expires_in: number, refresh_token: string, refresh_token_expires_in: number}}\n */\n\n Auth.prototype.data = function data() {\n\n return this._cache.getItem(this._cacheId) || {\n token_type: '',\n access_token: '',\n expires_in: 0,\n refresh_token: '',\n refresh_token_expires_in: 0\n };\n };\n\n /**\n * @param {object} newData\n * @return {Auth}\n */\n\n Auth.prototype.setData = function setData(newData) {\n\n newData = newData || {};\n\n var data = this.data();\n\n Object.keys(newData).forEach(function (key) {\n data[key] = newData[key];\n });\n\n data.expire_time = Date.now() + data.expires_in * 1000;\n data.refresh_token_expire_time = Date.now() + data.refresh_token_expires_in * 1000;\n\n this._cache.setItem(this._cacheId, data);\n\n return this;\n };\n\n /**\n * Check if there is a valid (not expired) access token\n * @return {boolean}\n */\n\n Auth.prototype.accessTokenValid = function accessTokenValid() {\n\n var authData = this.data();\n return authData.token_type === Auth.forcedTokenType || authData.expire_time - Auth.refreshHandicapMs > Date.now();\n };\n\n /**\n * Check if there is a valid (not expired) access token\n * @return {boolean}\n */\n\n Auth.prototype.refreshTokenValid = function refreshTokenValid() {\n\n return this.data().refresh_token_expire_time > Date.now();\n };\n\n /**\n * @return {Auth}\n */\n\n Auth.prototype.cancelAccessToken = function cancelAccessToken() {\n\n return this.setData({\n access_token: '',\n expires_in: 0\n });\n };\n\n /**\n * This method sets a special authentication mode used in Service Web\n * @return {Auth}\n */\n\n Auth.prototype.forceAuthentication = function forceAuthentication() {\n\n this.setData({\n token_type: Auth.forcedTokenType,\n access_token: '',\n expires_in: 0,\n refresh_token: '',\n refresh_token_expires_in: 0\n });\n\n return this;\n };\n\n /**\n * @param remember\n * @return {Auth}\n */\n\n Auth.prototype.setRemember = function setRemember(remember) {\n\n return this.setData({ remember: remember });\n };\n\n /**\n * @return {boolean}\n */\n\n Auth.prototype.remember = function remember() {\n\n return !!this.data().remember;\n };\n\n return Auth;\n})();\n\nexports['default'] = Auth;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 18 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _PubnubMockJs = __webpack_require__(19);\n\nvar _PubnubMockJs2 = _interopRequireDefault(_PubnubMockJs);\n\nvar _coreExternals = __webpack_require__(3);\n\nvar PubnubMockFactory = (function () {\n function PubnubMockFactory() {\n _classCallCheck(this, PubnubMockFactory);\n\n this.crypto_obj = _coreExternals.PUBNUB.crypto_obj;\n }\n\n PubnubMockFactory.prototype.init = function init(options) {\n return new _PubnubMockJs2['default'](options);\n };\n\n return PubnubMockFactory;\n})();\n\nexports['default'] = PubnubMockFactory;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 19 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _coreObservable = __webpack_require__(8);\n\nvar _coreObservable2 = _interopRequireDefault(_coreObservable);\n\nvar _coreExternals = __webpack_require__(3);\n\nvar PubnubMock = (function (_Observable) {\n _inherits(PubnubMock, _Observable);\n\n function PubnubMock(options) {\n _classCallCheck(this, PubnubMock);\n\n _Observable.call(this);\n this.options = options;\n this.crypto_obj = _coreExternals.PUBNUB.crypto_obj;\n }\n\n PubnubMock.prototype.ready = function ready() {};\n\n PubnubMock.prototype.subscribe = function subscribe(options) {\n this.on('message-' + options.channel, options.message);\n };\n\n PubnubMock.prototype.unsubscribe = function unsubscribe(options) {\n this.off('message-' + options.channel);\n };\n\n PubnubMock.prototype.receiveMessage = function receiveMessage(msg, channel) {\n this.emit('message-' + channel, msg, 'env', channel);\n };\n\n return PubnubMock;\n})(_coreObservable2['default']);\n\nexports['default'] = PubnubMock;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 20 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _coreObservable = __webpack_require__(8);\n\nvar _coreObservable2 = _interopRequireDefault(_coreObservable);\n\nvar _httpClient = __webpack_require__(10);\n\nvar _httpClient2 = _interopRequireDefault(_httpClient);\n\nvar _coreUtils = __webpack_require__(2);\n\nvar Subscription = (function (_Observable) {\n _inherits(Subscription, _Observable);\n\n _createClass(Subscription, null, [{\n key: '_renewHandicapMs',\n value: 2 * 60 * 1000,\n enumerable: true\n }, {\n key: '_pollInterval',\n value: 10 * 1000,\n enumerable: true\n }]);\n\n function Subscription(pubnubFactory, platform) {\n _classCallCheck(this, Subscription);\n\n _Observable.call(this);\n\n this.events = {\n notification: 'notification',\n removeSuccess: 'removeSuccess',\n removeError: 'removeError',\n renewSuccess: 'renewSuccess',\n renewError: 'renewError',\n subscribeSuccess: 'subscribeSuccess',\n subscribeError: 'subscribeError'\n };\n this._pubnubFactory = pubnubFactory;\n this._platform = platform;\n this._pubnub = null;\n this._timeout = null;\n this._subscription = {};\n }\n\n //export interface ISubscription {\n // id?:string;\n // uri?: string;\n // eventFilters?:string[];\n // expirationTime?:string; // 2014-03-12T19:54:35.613Z\n // expiresIn?:number;\n // deliveryMode?: {\n // transportType?:string;\n // encryption?:boolean;\n // address?:string;\n // subscriberKey?:string;\n // encryptionKey?:string;\n // secretKey?:string;\n // };\n // creationTime?:string; // 2014-03-12T19:54:35.613Z\n // status?:string; // Active\n //}\n\n Subscription.prototype.subscribed = function subscribed() {\n\n return !!(this._subscription.id && this._subscription.deliveryMode && this._subscription.deliveryMode.subscriberKey && this._subscription.deliveryMode.address);\n };\n\n /**\n * @return {boolean}\n */\n\n Subscription.prototype.alive = function alive() {\n\n return this.subscribed() && Date.now() < this.expirationTime();\n };\n\n Subscription.prototype.expirationTime = function expirationTime() {\n return new Date(this._subscription.expirationTime || 0).getTime() - Subscription._renewHandicapMs;\n };\n\n Subscription.prototype.setSubscription = function setSubscription(subscription) {\n\n subscription = subscription || {};\n\n this._clearTimeout();\n\n this._subscription = subscription;\n\n if (!this._pubnub) this._subscribeAtPubnub();\n\n this._setTimeout();\n\n return this;\n };\n\n Subscription.prototype.subscription = function subscription() {\n return this._subscription;\n };\n\n /**\n * Creates or updates subscription if there is an active one\n * @returns {Promise}\n */\n\n Subscription.prototype.register = function register() {\n return regeneratorRuntime.async(function register$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n if (!this.alive()) {\n context$2$0.next = 6;\n break;\n }\n\n context$2$0.next = 3;\n return regeneratorRuntime.awrap(this.renew());\n\n case 3:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 6:\n context$2$0.next = 8;\n return regeneratorRuntime.awrap(this.subscribe());\n\n case 8:\n return context$2$0.abrupt('return', context$2$0.sent);\n\n case 9:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this);\n };\n\n Subscription.prototype.eventFilters = function eventFilters() {\n return this._subscription.eventFilters || [];\n };\n\n /**\n * @param {string[]} events\n * @return {Subscription}\n */\n\n Subscription.prototype.addEventFilters = function addEventFilters(events) {\n this.setEventFilters(this.eventFilters().concat(events));\n return this;\n };\n\n /**\n * @param {string[]} events\n * @return {Subscription}\n */\n\n Subscription.prototype.setEventFilters = function setEventFilters(events) {\n this._subscription.eventFilters = events;\n return this;\n };\n\n /**\n * @returns {Promise}\n */\n\n Subscription.prototype.subscribe = function subscribe() {\n var response, json;\n return regeneratorRuntime.async(function subscribe$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n\n this._clearTimeout();\n\n if (this.eventFilters().length) {\n context$2$0.next = 4;\n break;\n }\n\n throw new Error('Events are undefined');\n\n case 4:\n context$2$0.next = 6;\n return regeneratorRuntime.awrap(this._platform.post('/restapi/v1.0/subscription', {\n eventFilters: this._getFullEventFilters(),\n deliveryMode: {\n transportType: 'PubNub'\n }\n }));\n\n case 6:\n response = context$2$0.sent;\n json = response.json();\n\n this.setSubscription(json).emit(this.events.subscribeSuccess, response);\n\n return context$2$0.abrupt('return', response);\n\n case 12:\n context$2$0.prev = 12;\n context$2$0.t0 = context$2$0['catch'](0);\n\n context$2$0.t0 = this._platform.client().makeError(context$2$0.t0);\n\n this.reset().emit(this.events.subscribeError, context$2$0.t0);\n\n throw context$2$0.t0;\n\n case 17:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 12]]);\n };\n\n /**\n * @returns {Promise}\n */\n\n Subscription.prototype.renew = function renew() {\n var response, json;\n return regeneratorRuntime.async(function renew$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n\n this._clearTimeout();\n\n if (this.alive()) {\n context$2$0.next = 4;\n break;\n }\n\n throw new Error('Subscription is not alive');\n\n case 4:\n if (this.eventFilters().length) {\n context$2$0.next = 6;\n break;\n }\n\n throw new Error('Events are undefined');\n\n case 6:\n context$2$0.next = 8;\n return regeneratorRuntime.awrap(this._platform.put('/restapi/v1.0/subscription/' + this._subscription.id, {\n eventFilters: this._getFullEventFilters()\n }));\n\n case 8:\n response = context$2$0.sent;\n json = response.json();\n\n this.setSubscription(json).emit(this.events.renewSuccess, response);\n\n return context$2$0.abrupt('return', response);\n\n case 14:\n context$2$0.prev = 14;\n context$2$0.t0 = context$2$0['catch'](0);\n\n context$2$0.t0 = this._platform.client().makeError(context$2$0.t0);\n\n this.reset().emit(this.events.renewError, context$2$0.t0);\n\n throw context$2$0.t0;\n\n case 19:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 14]]);\n };\n\n /**\n * @returns {Promise}\n */\n\n Subscription.prototype.remove = function remove() {\n var response;\n return regeneratorRuntime.async(function remove$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n\n if (this.subscribed()) {\n context$2$0.next = 3;\n break;\n }\n\n throw new Error('No subscription');\n\n case 3:\n context$2$0.next = 5;\n return regeneratorRuntime.awrap(this._platform['delete']('/restapi/v1.0/subscription/' + this._subscription.id));\n\n case 5:\n response = context$2$0.sent;\n\n this.reset().emit(this.events.removeSuccess, response);\n\n return context$2$0.abrupt('return', response);\n\n case 10:\n context$2$0.prev = 10;\n context$2$0.t0 = context$2$0['catch'](0);\n\n context$2$0.t0 = this._platform.client().makeError(context$2$0.t0);\n\n this.emit(this.events.removeError, context$2$0.t0);\n\n throw context$2$0.t0;\n\n case 15:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 10]]);\n };\n\n /**\n * @returns {Promise}\n */\n\n Subscription.prototype.resubscribe = function resubscribe() {\n\n return this.reset().setEventFilters(this.eventFilters()).subscribe();\n };\n\n /**\n * Remove subscription and disconnect from PUBNUB\n * This method resets subscription at client side but backend is not notified\n */\n\n Subscription.prototype.reset = function reset() {\n this._clearTimeout();\n if (this.subscribed() && this._pubnub) this._pubnub.unsubscribe({ channel: this._subscription.deliveryMode.address });\n this._subscription = {};\n return this;\n };\n\n Subscription.prototype._getFullEventFilters = function _getFullEventFilters() {\n var _this = this;\n\n return this.eventFilters().map(function (event) {\n return _this._platform.createUrl(event);\n });\n };\n\n Subscription.prototype._setTimeout = function _setTimeout() {\n var _this2 = this;\n\n this._clearTimeout();\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n _coreUtils.poll(function (next) {\n\n if (_this2.alive()) return next();\n\n _this2.renew();\n }, Subscription._pollInterval, this._timeout);\n\n return this;\n };\n\n Subscription.prototype._clearTimeout = function _clearTimeout() {\n\n _coreUtils.stopPolling(this._timeout);\n\n return this;\n };\n\n Subscription.prototype._decrypt = function _decrypt(message) {\n\n if (!this.subscribed()) throw new Error('No subscription');\n\n if (this._subscription.deliveryMode.encryptionKey) {\n\n var PUBNUB = this._pubnubFactory;\n\n message = PUBNUB.crypto_obj.decrypt(message, this._subscription.deliveryMode.encryptionKey, {\n encryptKey: false,\n keyEncoding: 'base64',\n keyLength: 128,\n mode: 'ecb'\n });\n }\n\n return message;\n };\n\n Subscription.prototype._notify = function _notify(message) {\n\n this.emit(this.events.notification, this._decrypt(message));\n\n return this;\n };\n\n Subscription.prototype._subscribeAtPubnub = function _subscribeAtPubnub() {\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n var PUBNUB = this._pubnubFactory;\n\n this._pubnub = PUBNUB.init({\n ssl: true,\n subscribe_key: this._subscription.deliveryMode.subscriberKey\n });\n\n this._pubnub.ready();\n\n this._pubnub.subscribe({\n channel: this._subscription.deliveryMode.address,\n message: this._notify.bind(this),\n connect: function connect() {}\n });\n\n return this;\n };\n\n return Subscription;\n})(_coreObservable2['default']);\n\nexports['default'] = Subscription;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 21 */\n/***/ function(module, exports, __webpack_require__) {\n\n'use strict';\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _Subscription2 = __webpack_require__(20);\n\nvar _Subscription3 = _interopRequireDefault(_Subscription2);\n\nvar _coreQueue = __webpack_require__(9);\n\nvar _coreQueue2 = _interopRequireDefault(_coreQueue);\n\nvar CachedSubscription = (function (_Subscription) {\n _inherits(CachedSubscription, _Subscription);\n\n function CachedSubscription(pubnubFactory, platform, cache, cacheKey) {\n var _this = this;\n\n _classCallCheck(this, CachedSubscription);\n\n _Subscription.call(this, pubnubFactory, platform);\n\n this._cache = cache;\n this._cacheKey = cacheKey;\n this._renewQueue = new _coreQueue2['default'](this._cache, cacheKey + '-renew');\n this._resubscribeQueue = new _coreQueue2['default'](this._cache, cacheKey + '-resubscribe');\n\n this.events = _extends({}, this.events, {\n queuedRenewSuccess: 'queuedRenewSuccess',\n queuedRenewError: 'queuedRenewError',\n queuedResubscribeSuccess: 'queuedResubscribeSuccess',\n queuedResubscribeError: 'queuedResubscribeError'\n });\n\n this.on(this.events.renewError, function () {\n _this.resubscribe();\n });\n\n this.on([this.events.subscribeSuccess, this.events.renewSuccess], function () {\n _this._cache.setItem(_this._cacheKey, _this.subscription());\n });\n\n this.on(this.events.removeSuccess, function () {\n _this._cache.removeItem(_this._cacheKey);\n });\n }\n\n /**\n * TODO Combine with Platform.refresh and move elsewhere\n * @param actionCb\n * @param queue\n * @param successEvent\n * @param errorEvent\n * @param errorMessage\n * @return {*}\n * @private\n */\n\n CachedSubscription.prototype._queue = function _queue(actionCb, queue, successEvent, errorEvent, errorMessage) {\n var res;\n return regeneratorRuntime.async(function _queue$(context$2$0) {\n while (1) switch (context$2$0.prev = context$2$0.next) {\n case 0:\n context$2$0.prev = 0;\n\n if (!queue.isPaused()) {\n context$2$0.next = 8;\n break;\n }\n\n context$2$0.next = 4;\n return regeneratorRuntime.awrap(queue.poll());\n\n case 4:\n if (this.alive()) {\n context$2$0.next = 6;\n break;\n }\n\n throw new Error(errorMessage);\n\n case 6:\n\n this.emit(successEvent, null);\n\n return context$2$0.abrupt('return', null);\n\n case 8:\n\n queue.pause();\n\n context$2$0.next = 11;\n return regeneratorRuntime.awrap(actionCb.call(this));\n\n case 11:\n res = context$2$0.sent;\n\n queue.resume();\n\n this.emit(successEvent, res);\n\n return context$2$0.abrupt('return', res);\n\n case 17:\n context$2$0.prev = 17;\n context$2$0.t0 = context$2$0['catch'](0);\n\n this.emit(errorEvent, context$2$0.t0);\n\n throw context$2$0.t0;\n\n case 21:\n case 'end':\n return context$2$0.stop();\n }\n }, null, this, [[0, 17]]);\n };\n\n /**\n * @returns {Promise}\n */\n\n CachedSubscription.prototype.renew = function renew() {\n\n return this._queue(_Subscription.prototype.renew, this._renewQueue, this.events.queuedRenewSuccess, this.events.queuedRenewError, 'Subscription is not alive after renew timeout');\n };\n\n /**\n * @returns {Promise}\n */\n\n CachedSubscription.prototype.resubscribe = function resubscribe() {\n\n return this._queue(_Subscription.prototype.resubscribe, this._resubscribeQueue, this.events.queuedResubscribeSuccess, this.events.queuedResubscribeError, 'Subscription is not alive after resubscribe timeout');\n };\n\n /**\n * @param {string[]} events\n * @return {CachedSubscription}\n */\n\n CachedSubscription.prototype.restore = function restore(events) {\n\n var cachedSubscriptionData = this._cache.getItem(this._cacheKey);\n\n if (cachedSubscriptionData) {\n try {\n this.setSubscription(cachedSubscriptionData);\n } catch (e) {}\n } else {\n this.setEventFilters(events);\n }\n\n return this;\n };\n\n return CachedSubscription;\n})(_Subscription3['default']);\n\nexports['default'] = CachedSubscription;\nmodule.exports = exports['default'];\n\n/***/ },\n/* 22 */\n/***/ function(module, exports) {\n\n/* WEBPACK VAR INJECTION */(function(global) {/**\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 // This invoke function is written in a style that assumes some\n // calling function (or Promise) will handle exceptions.\n function invoke(method, arg) {\n var result = generator[method](arg);\n var value = result.value;\n return value instanceof AwaitArgument\n ? Promise.resolve(value.arg).then(invokeNext, invokeThrow)\n : 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 return result;\n });\n }\n\n if (typeof process === \"object\" && process.domain) {\n invoke = process.domain.bind(invoke);\n }\n\n var invokeNext = invoke.bind(generator, \"next\");\n var invokeThrow = invoke.bind(generator, \"throw\");\n var invokeReturn = invoke.bind(generator, \"return\");\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return invoke(method, arg);\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 ) : new Promise(function (resolve) {\n resolve(callInvokeWithMethodAndArg());\n });\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/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ }\n/******/ ])\n});\n;\n//# sourceMappingURL=ringcentral.js.map"," \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 = \"/build/\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 5d800152b5167bf356e8\n **/","import * as Utils from './core/Utils';\nimport Cache from './core/Cache';\nimport * as Externals from './core/Externals';\nimport Observable from './core/Observable';\nimport Queue from './core/Queue';\n\nimport Client from './http/Client';\nimport ApiResponse from './http/ApiResponse';\nimport * as HttpUtils from './http/Utils';\n\nimport {default as ClientMock} from './mocks/ClientMock';\nimport Mock from './mocks/Mock';\nimport Registry from './mocks/Registry';\n\nimport Platform from './platform/Platform';\nimport Auth from './platform/Auth';\n\nimport PubnubMockFactory from './pubnub/PubnubFactory';\n\nimport Subscription from './subscription/Subscription';\nimport CachedSubscription from './subscription/CachedSubscription';\n\nrequire(\"regenerator/runtime\");\n\nexport default class SDK {\n\n static version = '2.0.0';\n\n static server = {\n sandbox: 'https://platform.devtest.ringcentral.com',\n production: 'https://platform.ringcentral.com'\n };\n\n /**\n * @constructor\n * @param {object} [options]\n * @param {string} [options.server]\n * @param {string} [options.cachePrefix]\n * @param {string} [options.appSecret]\n * @param {string} [options.appKey]\n * @param {string} [options.appName]\n * @param {string} [options.appVersion]\n * @param {string} [options.pubnubFactory]\n * @param {string} [options.client]\n */\n constructor(options) {\n\n options = options || {};\n\n this._cache = new Cache(Externals.localStorage, options.cachePrefix);\n\n this._client = options.client || new Client();\n\n this._platform = new Platform(this._client, this._cache, options.server, options.appKey, options.appSecret);\n\n this._pubnubFactory = options.pubnubFactory || Externals.PUBNUB;\n\n }\n\n /**\n * @return {Platform}\n */\n platform() {\n return this._platform;\n }\n\n /**\n * @return {Subscription}\n */\n createSubscription() {\n return new Subscription(this._pubnubFactory, this._platform);\n }\n\n /**\n * @return {CachedSubscription}\n */\n createCachedSubscription(cacheKey) {\n return new CachedSubscription(this._pubnubFactory, this._platform, this._cache, cacheKey);\n }\n\n /**\n * @return {Cache}\n */\n cache() {\n return this._cache;\n }\n\n static core = {\n Cache: Cache,\n Observable: Observable,\n Utils: Utils,\n Externals: Externals,\n Queue: Queue\n };\n\n static http = {\n Client: Client,\n ApiResponse: ApiResponse,\n Utils: HttpUtils\n };\n\n static platform = {\n Auth: Auth,\n Platform: Platform\n };\n\n static subscription = {\n Subscription: Subscription\n };\n\n static mocks = {\n Client: ClientMock,\n Registry: Registry,\n Mock: Mock\n };\n\n static pubnub = {\n PubnubMockFactory: PubnubMockFactory\n };\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/SDK.js\n **/","import {Promise} from './Externals.js';\n\n/**\n * TODO Replace with something better\n * @see https://github.com/joyent/node/blob/master/lib/querystring.js\n * @param {object} parameters\n * @returns {string}\n */\nexport function queryStringify(parameters) {\n\n var array = [];\n\n parameters = parameters || {};\n\n Object.keys(parameters).forEach((k) => {\n\n var v = parameters[k];\n\n if (isArray(v)) {\n v.forEach((vv) => {\n array.push(encodeURIComponent(k) + '=' + encodeURIComponent(vv));\n });\n } else {\n array.push(encodeURIComponent(k) + '=' + encodeURIComponent(v));\n }\n\n });\n\n return array.join('&');\n\n}\n\n/**\n * TODO Replace with something better\n * @see https://github.com/joyent/node/blob/master/lib/querystring.js\n * @param {string} queryString\n * @returns {object}\n */\nexport function parseQueryString(queryString) {\n\n var argsParsed = {};\n\n queryString.split('&').forEach((arg) => {\n\n arg = decodeURIComponent(arg);\n\n if (arg.indexOf('=') == -1) {\n\n argsParsed[arg.trim()] = true;\n\n } else {\n\n var pair = arg.split('='),\n key = pair[0].trim(),\n value = pair[1].trim();\n\n if (key in argsParsed) {\n if (key in argsParsed && !isArray(argsParsed[key])) argsParsed[key] = [argsParsed[key]];\n argsParsed[key].push(value);\n } else {\n argsParsed[key] = value;\n }\n\n }\n\n });\n\n return argsParsed;\n\n}\n\n/**\n * @param obj\n * @return {boolean}\n */\nexport function isFunction(obj) {\n return typeof obj === \"function\";\n}\n\n/**\n * @param obj\n * @return {boolean}\n */\nexport function isArray(obj) {\n return Array.isArray ? Array.isArray(obj) : typeof obj === \"array\";\n}\n\n/**\n * @param fn\n * @param interval\n * @param timeout\n */\nexport function poll(fn, interval, timeout) { //NodeJS.Timer|number\n\n module.exports.stopPolling(timeout);\n\n interval = interval || 1000;\n\n var next = (delay) => {\n\n delay = delay || interval;\n\n interval = delay;\n\n return setTimeout(() => {\n\n fn(next, delay);\n\n }, delay);\n\n };\n\n return next();\n\n}\n\nexport function stopPolling(timeout) {\n if (timeout) clearTimeout(timeout);\n}\n\nexport function isNodeJS() {\n return (typeof process !== 'undefined');\n}\n\nexport function isBrowser() {\n return (typeof window !== 'undefined');\n}\n\nexport function delay(timeout) {\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n resolve(null);\n }, timeout);\n });\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Utils.js\n **/","import ES6Promise from 'es6-promise';\nimport nodeFetch from 'node-fetch';\nimport pubnub from 'pubnub';\n\nvar root = (new Function('return this'))();\n\nexport var Promise = (ES6Promise && ES6Promise.Promise) || root.Promise;\n\nexport var fetch = root.fetch || nodeFetch;\nexport var Request = root.Request || fetch.Request;\nexport var Response = root.Response || fetch.Response;\nexport var Headers = root.Headers || fetch.Headers;\n\nexport var PUBNUB = root.PUBNUB || pubnub;\n\nexport var localStorage = (typeof root.localStorage !== 'undefined') ? root.localStorage : {};\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Externals.js\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_4__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external {\"commonjs\":\"es6-promise\",\"commonjs2\":\"es6-promise\"}\n ** module id = 4\n ** module chunks = 0\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_5__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external {\"commonjs\":\"node-fetch\",\"commonjs2\":\"node-fetch\"}\n ** module id = 5\n ** module chunks = 0\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_6__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external {\"commonjs\":\"pubnub\",\"commonjs2\":\"pubnub\",\"amd\":\"pubnub\"}\n ** module id = 6\n ** module chunks = 0\n **/","export default class Cache {\n\n static defaultPrefix = 'rc-';\n\n constructor(storage, prefix) {\n this.setPrefix(prefix);\n this._storage = storage;\n }\n\n setPrefix(prefix) {\n this._prefix = prefix || Cache.defaultPrefix;\n return this;\n }\n\n setItem(key, data) {\n this._storage[this._prefixKey(key)] = JSON.stringify(data);\n return this;\n }\n\n removeItem(key) {\n delete this._storage[this._prefixKey(key)];\n return this;\n }\n\n getItem(key) {\n var item = this._storage[this._prefixKey(key)];\n if (!item) return null;\n return JSON.parse(item);\n }\n\n clean() {\n\n for (var key in this._storage) {\n\n if (!this._storage.hasOwnProperty(key)) continue;\n\n if (key.indexOf(this._prefix) === 0) {\n delete this._storage[key];\n }\n\n }\n\n return this;\n\n }\n\n _prefixKey(key) {\n return this._prefix + key;\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Cache.js\n **/","export default class Observable {\n\n constructor() {\n this.off();\n }\n\n hasListeners(event) {\n return (event in this._listeners);\n }\n\n on(events, callback) {\n\n if (typeof events == 'string') events = [events];\n if (!events) throw new Error('No events to subscribe to');\n if (typeof callback !== 'function') throw new Error('Callback must be a function');\n\n events.forEach((event) => {\n\n if (!this.hasListeners(event)) this._listeners[event] = [];\n\n this._listeners[event].push(callback);\n\n });\n\n return this;\n\n }\n\n emit(event, ...args) {\n\n var result = null;\n\n if (!this.hasListeners(event)) return null;\n\n this._listeners[event].some((callback) => {\n\n result = callback.apply(this, args);\n return (result === false);\n\n });\n\n return result;\n\n }\n\n off(event, callback) {\n\n if (!event) {\n\n this._listeners = {};\n\n } else {\n\n if (!callback) {\n\n delete this._listeners[event];\n\n } else {\n\n if (!this.hasListeners(event)) return this;\n\n this._listeners[event].forEach((cb, i) => {\n\n if (cb === callback) delete this._listeners[event][i];\n\n });\n\n }\n\n }\n\n return this;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Observable.js\n **/","import {Promise} from '../core/Externals';\nimport {poll, stopPolling} from './Utils';\n\nexport default class Queue {\n\n static _pollInterval = 250;\n static _releaseTimeout = 5000;\n\n constructor(cache, cacheId) {\n\n this._cache = cache;\n this._cacheId = cacheId;\n this._promise = null;\n\n }\n\n isPaused() {\n\n var time = this._cache.getItem(this._cacheId);\n\n return !!time && Date.now() - parseInt(time) < Queue._releaseTimeout;\n }\n\n pause() {\n this._cache.setItem(this._cacheId, Date.now());\n return this;\n }\n\n resume() {\n this._cache.removeItem(this._cacheId);\n return this;\n }\n\n poll() {\n\n if (this._promise) return this._promise;\n\n this._promise = new Promise((resolve, reject) => {\n\n poll((next) => {\n\n if (this.isPaused()) return next();\n\n this._promise = null;\n\n this.resume(); // this is actually not needed but why not\n\n resolve(null);\n\n }, Queue._pollInterval);\n\n });\n\n return this._promise;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/core/Queue.js\n **/","import {fetch, Request, Response, Headers, Promise} from '../core/Externals';\nimport {queryStringify} from '../core/Utils';\nimport {findHeaderName} from './Utils';\nimport Observable from '../core/Observable';\nimport ApiResponse from './ApiResponse';\n\nexport default class Client extends Observable {\n\n static _allowedMethods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'];\n\n events = {\n beforeRequest: 'beforeRequest',\n requestSuccess: 'requestSuccess',\n requestError: 'requestError'\n };\n\n /**\n * @param {Request} request\n * @return {Promise}\n */\n async sendRequest(request) {\n\n var apiResponse = new ApiResponse(request);\n\n try {\n\n //TODO Stop request if listeners return false\n this.emit(this.events.beforeRequest, apiResponse);\n\n apiResponse._response = await this._loadResponse(request);\n\n if (apiResponse._isMultipart() || apiResponse._isJson()) {\n apiResponse._text = await apiResponse.response().text();\n }\n\n if (!apiResponse.ok()) throw new Error('Response has unsuccessful status');\n\n this.emit(this.events.requestSuccess, apiResponse);\n\n return apiResponse;\n\n } catch (e) {\n\n if (!e.apiResponse) e = this.makeError(e, apiResponse);\n\n this.emit(this.events.requestError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @param {Request} request\n * @return {Promise}\n * @private\n */\n async _loadResponse(request) {\n return await fetch.call(null, request);\n }\n\n /**\n * Wraps the JS Error object with transaction information\n * @param {Error|IApiError} e\n * @param {ApiResponse} apiResponse\n * @return {IApiError}\n */\n makeError(e, apiResponse) {\n\n // Wrap only if regular error\n if (!e.hasOwnProperty('apiResponse') && !e.hasOwnProperty('originalMessage')) {\n\n e.apiResponse = apiResponse;\n e.originalMessage = e.message;\n e.message = (apiResponse && apiResponse.error(true)) || e.originalMessage;\n\n }\n\n return e;\n\n }\n\n /**\n *\n * @param {object} init\n * @param {object} [init.url]\n * @param {object} [init.body]\n * @param {string} [init.method]\n * @param {object} [init.query]\n * @param {object} [init.headers]\n * @return {Request}\n */\n createRequest(init) {\n\n init = init || {};\n init.headers = init.headers || {};\n\n // Sanity checks\n if (!init.url) throw new Error('Url is not defined');\n if (!init.method) init.method = 'GET';\n if (init.method && Client._allowedMethods.indexOf(init.method) < 0) throw new Error('Method has wrong value: ' + init.method);\n\n // Defaults\n init.credentials = init.credentials || 'include';\n init.mode = init.mode || 'cors';\n\n // Append Query String\n if (init.query) {\n init.url = init.url + (init.url.indexOf('?') > -1 ? '&' : '?') + queryStringify(init.query);\n }\n\n if (!(findHeaderName('Accept', init.headers))) {\n init.headers['Accept'] = ApiResponse._jsonContentType;\n }\n\n // Serialize body\n //TODO Check that body is a plain object\n if (typeof init.body !== 'string' || !init.body) {\n\n var contentTypeHeaderName = findHeaderName(ApiResponse._contentType, init.headers);\n\n if (!contentTypeHeaderName) {\n contentTypeHeaderName = ApiResponse._contentType;\n init.headers[contentTypeHeaderName] = ApiResponse._jsonContentType;\n }\n\n var contentType = init.headers[contentTypeHeaderName];\n\n // Assign a new encoded body\n if (contentType.indexOf(ApiResponse._jsonContentType) > -1) {\n init.body = JSON.stringify(init.body);\n } else if (contentType.indexOf(ApiResponse._urlencodedContentType) > -1) {\n init.body = queryStringify(init.body);\n }\n\n }\n\n // Create a request with encoded body\n var req = new Request(init.url, init);\n\n // Keep the original body accessible directly (for mocks)\n req.originalBody = init.body;\n\n return req;\n\n }\n\n}\n\n/**\n * @name IApiError\n * @property {string} stack\n * @property {string} originalMessage\n * @property {ApiResponse} apiResponse\n */\n\n\n/** WEBPACK FOOTER **\n ** ./src/http/Client.js\n **/","import {fetch, Request, Response, Headers, Promise} from '../core/Externals';\nimport * as utils from '../core/Utils';\n\n/**\n * Creates a response\n * @param stringBody\n * @param init\n * @return {Response}\n */\nexport function createResponse(stringBody, init) {\n\n init = init || {};\n\n var response = new Response(stringBody, init);\n\n //TODO Wait for https://github.com/bitinn/node-fetch/issues/38\n if (utils.isNodeJS()) {\n\n response._text = stringBody;\n response._decode = function() {\n return this._text;\n };\n\n }\n\n return response;\n\n}\n\nexport function findHeaderName(name, headers) {\n name = name.toLowerCase();\n return Object.keys(headers).reduce(function(res, key) {\n if (res) return res;\n if (name == key.toLowerCase()) return key;\n return res;\n }, null);\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/http/Utils.js\n **/","import {fetch, Request, Response, Headers, Promise} from '../core/Externals';\nimport * as utils from './Utils';\n\nexport default class ApiResponse {\n\n static _contentType = 'Content-Type';\n static _jsonContentType = 'application/json';\n static _multipartContentType = 'multipart/mixed';\n static _urlencodedContentType = 'application/x-www-form-urlencoded';\n static _headerSeparator = ':';\n static _bodySeparator = '\\n\\n';\n static _boundarySeparator = '--';\n\n /**\n * @param {Request} request\n * @param {Response} response\n * @param {string} responseText\n */\n constructor(request, response, responseText) {\n\n /** @type {Request} */\n this._request = request;\n\n /** @type {Response} */\n this._response = response;\n\n this._text = responseText;\n this._json = null;\n this._multipart = [];\n\n }\n\n /**\n * @return {Response}\n */\n response() {\n return this._response;\n }\n\n /**\n * @return {Request}\n */\n request() {\n return this._request;\n }\n\n /**\n * @return {boolean}\n */\n ok() {\n return this._response && this._response.ok;\n }\n\n /**\n * @return {string}\n */\n text() {\n if (!this._isJson() && !this._isMultipart()) throw new Error('Response is not text');\n return this._text;\n }\n\n /**\n * @return {object}\n */\n json() {\n if (!this._isJson()) throw new Error('Response is not JSON');\n if (!this._json) {\n this._json = this._text ? JSON.parse(this._text) : null;\n }\n return this._json;\n }\n\n /**\n * @param [skipOKCheck]\n * @return {string}\n */\n error(skipOKCheck) {\n\n if (this.ok() && !skipOKCheck) return null;\n\n var message = (this._response && this._response.status ? this._response.status + ' ' : '') +\n (this._response && this._response.statusText ? this._response.statusText : '');\n\n try {\n\n if (this.json().message) message = this.json().message;\n if (this.json().error_description) message = this.json().error_description;\n if (this.json().description) message = this.json().description;\n\n } catch (e) {}\n\n return message;\n\n }\n\n /**\n * @return {ApiResponse[]}\n */\n multipart() {\n\n if (!this._isMultipart()) throw new Error('Response is not multipart');\n\n if (!this._multipart.length) {\n\n // Step 1. Split multipart response\n\n var text = this.text();\n\n if (!text) throw new Error('No response body');\n\n var boundary = this._getContentType().match(/boundary=([^;]+)/i)[1];\n\n if (!boundary) throw new Error('Cannot find boundary');\n\n var parts = text.toString().split(ApiResponse._boundarySeparator + boundary);\n\n if (parts[0].trim() === '') parts.shift();\n if (parts[parts.length - 1].trim() == ApiResponse._boundarySeparator) parts.pop();\n\n if (parts.length < 1) throw new Error('No parts in body');\n\n // Step 2. Parse status info\n\n var statusInfo = ApiResponse.create(parts.shift(), this._response.status, this._response.statusText).json();\n\n // Step 3. Parse all other parts\n\n this._multipart = parts.map((part:string, i) => {\n\n var status = statusInfo.response[i].status;\n\n return ApiResponse.create(part, status);\n\n });\n\n }\n\n return this._multipart;\n\n }\n\n _isContentType(contentType) {\n return this._getContentType().indexOf(contentType) > -1;\n }\n\n _getContentType() {\n return this._response.headers.get(ApiResponse._contentType) || '';\n }\n\n _isMultipart() {\n return this._isContentType(ApiResponse._multipartContentType);\n }\n\n _isUrlEncoded() {\n return this._isContentType(ApiResponse._urlencodedContentType);\n }\n\n _isJson() {\n return this._isContentType(ApiResponse._jsonContentType);\n }\n\n /**\n * Method is used to create ApiResponse object from string parts of multipart/mixed response\n * @param {string} [text]\n * @param {number} [status]\n * @param {string} [statusText]\n * @return {ApiResponse}\n */\n static create(text, status, statusText) {\n\n text = text || '';\n status = status || 200;\n statusText = statusText || 'OK';\n\n text = text.replace(/\\r/g, '');\n\n var headers = new Headers(),\n headersAndBody = text.split(ApiResponse._bodySeparator),\n headersText = (headersAndBody.length > 1) ? headersAndBody.shift() : '';\n\n text = headersAndBody.join(ApiResponse._bodySeparator);\n\n (headersText || '')\n .split('\\n')\n .forEach((header:string) => {\n\n var split = header.trim().split(ApiResponse._headerSeparator),\n key = split.shift().trim(),\n value = split.join(ApiResponse._headerSeparator).trim();\n\n if (key) headers.append(key, value);\n\n });\n\n return new ApiResponse(null, utils.createResponse(text, {\n headers: headers,\n status: status,\n statusText: statusText\n }), text);\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/http/ApiResponse.js\n **/","import Registry from './Registry';\nimport {default as HttpClient} from '../http/Client';\n\nexport default class Client extends HttpClient {\n\n constructor() {\n super();\n this._registry = new Registry();\n }\n\n registry() {\n return this._registry;\n }\n\n async _loadResponse(request) {\n\n var mock = this._registry.find(request);\n\n return await mock.getResponse(request);\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/mocks/ClientMock.js\n **/","import Mock from './Mock';\n\nexport default class Registry {\n\n constructor() {\n this._mocks = [];\n }\n\n add(mock) {\n this._mocks.push(mock);\n return this;\n }\n\n clear() {\n this._mocks = [];\n return this;\n }\n\n find(request) {\n\n //console.log('Registry is looking for', request);\n\n var mock = this._mocks.shift();\n\n if (!mock) throw new Error('No mock in registry for request ' + request.method + ' ' + request.url);\n\n if (!mock.test(request)) throw new Error('Wrong request ' + request.method + ' ' + request.url +\n ' for expected mock ' + mock.method() + ' ' + mock.path());\n\n return mock;\n\n }\n\n apiCall(method:string, path:string, response:any, status, statusText) {\n\n this.add(new Mock(method, path, response, status, statusText));\n\n return this;\n\n }\n\n authentication() {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'access_token': 'ACCESS_TOKEN',\n 'token_type': 'bearer',\n 'expires_in': 3600,\n 'refresh_token': 'REFRESH_TOKEN',\n 'refresh_token_expires_in': 60480,\n 'scope': 'SMS RCM Foo Boo',\n 'expireTime': new Date().getTime() + 3600000\n });\n\n return this;\n\n }\n\n logout() {\n\n this.apiCall('POST', '/restapi/oauth/revoke', {});\n\n return this;\n\n }\n\n presenceLoad(id) {\n\n this.apiCall('GET', '/restapi/v1.0/account/~/extension/' + id + '/presence', {\n \"uri\": \"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/\" + id + \"/presence\",\n \"extension\": {\n \"uri\": \"https://platform.ringcentral.com/restapi/v1.0/account/123/extension/\" + id,\n \"id\": id,\n \"extensionNumber\": \"101\"\n },\n \"activeCalls\": [],\n \"presenceStatus\": \"Available\",\n \"telephonyStatus\": \"Ringing\",\n \"userStatus\": \"Available\",\n \"dndStatus\": \"TakeAllCalls\",\n \"extensionId\": id\n });\n\n return this;\n\n }\n\n subscribeGeneric(expiresIn) {\n\n expiresIn = expiresIn || 15 * 60 * 60;\n\n var date = new Date();\n\n this.apiCall('POST', '/restapi/v1.0/subscription', {\n 'eventFilters': [\n '/restapi/v1.0/account/~/extension/~/presence'\n ],\n 'expirationTime': new Date(date.getTime() + (expiresIn * 1000)).toISOString(),\n 'expiresIn': expiresIn,\n 'deliveryMode': {\n 'transportType': 'PubNub',\n 'encryption': false,\n 'address': '123_foo',\n 'subscriberKey': 'sub-c-foo',\n 'secretKey': 'sec-c-bar'\n },\n 'id': 'foo-bar-baz',\n 'creationTime': date.toISOString(),\n 'status': 'Active',\n 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz'\n });\n\n return this;\n\n }\n\n subscribeOnPresence(id, detailed) {\n\n id = id || '1';\n\n var date = new Date();\n\n this.apiCall('POST', '/restapi/v1.0/subscription', {\n 'eventFilters': ['/restapi/v1.0/account/~/extension/' + id + '/presence' + (detailed ? '?detailedTelephonyState=true' : '')],\n 'expirationTime': new Date(date.getTime() + (15 * 60 * 60 * 1000)).toISOString(),\n 'deliveryMode': {\n 'transportType': 'PubNub',\n 'encryption': true,\n 'address': '123_foo',\n 'subscriberKey': 'sub-c-foo',\n 'secretKey': 'sec-c-bar',\n 'encryptionAlgorithm': 'AES',\n 'encryptionKey': 'VQwb6EVNcQPBhE/JgFZ2zw=='\n },\n 'creationTime': date.toISOString(),\n 'id': 'foo-bar-baz',\n 'status': 'Active',\n 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz'\n });\n\n return this;\n\n }\n\n tokenRefresh(failure) {\n\n if (!failure) {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'access_token': 'ACCESS_TOKEN_FROM_REFRESH',\n 'token_type': 'bearer',\n 'expires_in': 3600,\n 'refresh_token': 'REFRESH_TOKEN_FROM_REFRESH',\n 'refresh_token_expires_in': 60480,\n 'scope': 'SMS RCM Foo Boo'\n });\n\n } else {\n\n this.apiCall('POST', '/restapi/oauth/token', {\n 'message': 'Wrong token',\n 'error_description': 'Wrong token',\n 'description': 'Wrong token'\n }, 400);\n\n }\n\n return this;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/mocks/Registry.js\n **/","import ApiResponse from '../http/ApiResponse';\nimport {delay} from '../core/Utils';\nimport {createResponse} from '../http/Utils';\n\nexport default class Mock {\n\n constructor(method, path, json, status, statusText, delay) {\n this._method = method.toUpperCase();\n this._path = path;\n this._json = json || {};\n this._delay = delay || 10;\n this._status = status || 200;\n this._statusText = statusText || 'OK';\n }\n\n path() {\n return this._path;\n }\n\n method() {\n return this._method;\n }\n\n test(request:Request) {\n\n return request.url.indexOf(this._path) > -1 &&\n request.method.toUpperCase() == this._method;\n\n }\n\n async getResponse(request) {\n\n await delay(this._delay);\n\n return this.createResponse(this._json);\n\n }\n\n createResponse(json, init) {\n\n init = init || {};\n\n init.status = init.status || this._status;\n init.statusText = init.statusText || this._statusText;\n\n var str = JSON.stringify(json),\n res = createResponse(str, init);\n\n res.headers.set(ApiResponse._contentType, ApiResponse._jsonContentType);\n\n return res;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/mocks/Mock.js\n **/","import Observable from '../core/Observable';\nimport Queue from '../core/Queue';\nimport Auth from './Auth';\nimport {Promise} from '../core/Externals';\nimport {queryStringify, parseQueryString, delay} from '../core/Utils';\n\nexport default class Platform extends Observable {\n\n static _urlPrefix = '/restapi';\n static _apiVersion = 'v1.0';\n static _accessTokenTtl = null; // Platform server by default sets it to 60 * 60 = 1 hour\n static _refreshTokenTtl = 10 * 60 * 60; // 10 hours\n static _refreshTokenTtlRemember = 7 * 24 * 60 * 60; // 1 week\n static _tokenEndpoint = '/restapi/oauth/token';\n static _revokeEndpoint = '/restapi/oauth/revoke';\n static _authorizeEndpoint = '/restapi/oauth/authorize';\n static _refreshDelayMs = 100;\n static _cacheId = 'platform';\n static _clearCacheOnRefreshError = true;\n\n events = {\n beforeLogin: 'beforeLogin',\n loginSuccess: 'loginSuccess',\n loginError: 'loginError',\n beforeRefresh: 'beforeRefresh',\n refreshSuccess: 'refreshSuccess',\n refreshError: 'refreshError',\n beforeLogout: 'beforeLogout',\n logoutSuccess: 'logoutSuccess',\n logoutError: 'logoutError'\n };\n\n constructor(client, cache, server, appKey, appSecret) {\n\n super();\n\n this._server = server;\n this._appKey = appKey;\n this._appSecret = appSecret;\n\n /** @type {Cache} */\n this._cache = cache;\n\n /** @type {Client} */\n this._client = client;\n\n this._queue = new Queue(this._cache, Platform._cacheId + '-refresh');\n\n this._auth = new Auth(this._cache, Platform._cacheId);\n\n }\n\n /**\n * @return {Auth}\n */\n auth() {\n return this._auth;\n }\n\n /**\n * @return {Client}\n */\n client() {\n return this._client;\n }\n\n /**\n * @param {string} path\n * @param {object} [options]\n * @param {boolean} [options.addServer]\n * @param {string} [options.addMethod]\n * @param {boolean} [options.addToken]\n * @return {string}\n */\n createUrl(path, options) {\n\n path = path || '';\n options = options || {};\n\n var builtUrl = '',\n hasHttp = path.indexOf('http://') != -1 || path.indexOf('https://') != -1;\n\n if (options.addServer && !hasHttp) builtUrl += this._server;\n\n if (path.indexOf(Platform._urlPrefix) == -1 && !hasHttp) builtUrl += Platform._urlPrefix + '/' + Platform._apiVersion;\n\n builtUrl += path;\n\n if (options.addMethod || options.addToken) builtUrl += (path.indexOf('?') > -1 ? '&' : '?');\n\n if (options.addMethod) builtUrl += '_method=' + options.addMethod;\n if (options.addToken) builtUrl += (options.addMethod ? '&' : '') + 'access_token=' + this._auth.accessToken();\n\n return builtUrl;\n\n }\n\n /**\n * @param {string} options.redirectUri\n * @param {string} options.state\n * @param {string} options.brandId\n * @param {string} options.display\n * @param {string} options.prompt\n * @return {string}\n */\n authUrl(options) {\n\n options = options || {};\n\n return this.createUrl(Platform._authorizeEndpoint + '?' + queryStringify({\n 'response_type': 'code',\n 'redirect_uri': options.redirectUri || '',\n 'client_id': this._appKey,\n 'state': options.state || '',\n 'brand_id': options.brandId || '',\n 'display': options.display || '',\n 'prompt': options.prompt || ''\n }), {addServer: true})\n\n }\n\n /**\n * @param {string} url\n * @return {Object}\n */\n parseAuthRedirectUrl(url:string) {\n\n var qs = parseQueryString(url.split('?').reverse()[0]),\n error = qs.error_description || qs.error;\n\n if (error) {\n var e = new Error(error);\n e.error = qs.error;\n throw e;\n }\n\n return qs;\n\n }\n\n /**\n * @return {Promise}\n */\n async loggedIn() {\n\n try {\n await this._ensureAuthentication();\n return true;\n } catch (e) {\n return false;\n }\n\n }\n\n /**\n * @param {string} options.username\n * @param {string} options.password\n * @param {string} options.extension\n * @param {string} options.code\n * @param {string} options.redirectUri\n * @param {string} options.endpointId\n * @returns {Promise}\n */\n async login(options) {\n\n try {\n\n options = options || {};\n\n options.remember = options.remember || false;\n\n this.emit(this.events.beforeLogin);\n\n var body = {\n \"access_token_ttl\": Platform._accessTokenTtl,\n \"refresh_token_ttl\": options.remember ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl\n };\n\n if (!options.code) {\n\n body.grant_type = 'password';\n body.username = options.username;\n body.password = options.password;\n body.extension = options.extension || '';\n\n } else if (options.code) {\n\n body.grant_type = 'authorization_code';\n body.code = options.code;\n body.redirect_uri = options.redirectUri;\n //body.client_id = this.getCredentials().key; // not needed\n\n }\n\n if (options.endpointId) body.endpoint_id = options.endpointId;\n\n var apiResponse = await this._tokenRequest(Platform._tokenEndpoint, body),\n json = apiResponse.json();\n\n this._auth\n .setData(json)\n .setRemember(options.remember);\n\n this.emit(this.events.loginSuccess, apiResponse);\n\n return apiResponse;\n\n } catch (e) {\n\n this._cache.clean();\n\n this.emit(this.events.loginError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n async refresh() {\n\n try {\n\n this.emit(this.events.beforeRefresh);\n\n if (this._queue.isPaused()) {\n\n await this._queue.poll();\n\n if (!this._isAccessTokenValid()) {\n throw new Error('Automatic authentification timeout');\n }\n\n this.emit(this.events.refreshSuccess, null);\n\n return null;\n\n }\n\n this._queue.pause();\n\n // Make sure all existing AJAX calls had a chance to reach the server\n await delay(Platform._refreshDelayMs);\n\n // Perform sanity checks\n if (!this._auth.refreshToken()) throw new Error('Refresh token is missing');\n if (!this._auth.refreshTokenValid()) throw new Error('Refresh token has expired');\n if (!this._queue.isPaused()) throw new Error('Queue was resumed before refresh call');\n\n /** @type {ApiResponse} */\n var res = await this._tokenRequest(Platform._tokenEndpoint, {\n \"grant_type\": \"refresh_token\",\n \"refresh_token\": this._auth.refreshToken(),\n \"access_token_ttl\": Platform._accessTokenTtl,\n \"refresh_token_ttl\": this._auth.remember() ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl\n }),\n json = res.json();\n\n if (!json.access_token) {\n throw this._client.makeError(new Error('Malformed OAuth response'), res);\n }\n\n this._auth.setData(json);\n this._queue.resume();\n\n this.emit(this.events.refreshSuccess, res);\n\n return res;\n\n } catch (e) {\n\n e = this._client.makeError(e);\n\n if (Platform._clearCacheOnRefreshError) {\n this._cache.clean();\n }\n\n this.emit(this.events.refreshError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n async logout() {\n\n try {\n\n this.emit(this.events.beforeLogout);\n\n this._queue.pause();\n\n var res = await this._tokenRequest(Platform._revokeEndpoint, {\n token: this._auth.accessToken()\n });\n\n this._queue.resume();\n this._cache.clean();\n\n this.emit(this.events.logoutSuccess, res);\n\n return res;\n\n } catch (e) {\n\n this._queue.resume();\n\n this.emit(this.events.logoutError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @param {Request} request\n * @param {object} [options]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async inflateRequest(request, options) {\n\n options = options || {};\n\n if (options.skipAuthCheck) return request;\n\n await this._ensureAuthentication();\n\n request.headers.set('Authorization', this._authHeader());\n //request.url = this.createUrl(request.url, {addServer: true}); //FIXME Spec prevents this...\n\n //TODO Add User-Agent here\n\n return request;\n\n }\n\n /**\n * @param {Request} request\n * @param {object} [options]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async sendRequest(request, options) {\n\n try {\n\n request = await this.inflateRequest(request, options);\n\n return (await this._client.sendRequest(request));\n\n } catch (e) {\n\n // Guard is for errors that come from polling\n if (!e.apiResponse || !e.apiResponse.response() || (e.apiResponse.response().status != 401)) throw e;\n\n this._auth.cancelAccessToken();\n\n return (await this.sendRequest(request, options));\n\n }\n\n }\n\n /**\n * General purpose function to send anything to server\n * @param {string} options.url\n * @param {object} [options.body]\n * @param {string} [options.method]\n * @param {object} [options.query]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async send(options = {}) {\n\n //FIXME https://github.com/bitinn/node-fetch/issues/43\n options.url = this.createUrl(options.url, {addServer: true});\n\n return await this.sendRequest(this._client.createRequest(options), options);\n\n }\n\n /**\n * @param {string} url\n * @param {object} [query]\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async get(url, query, options) {\n options = options || {};\n options.method = 'GET';\n options.url = url;\n options.query = query;\n return await this.send(options);\n }\n\n /**\n * @param {string} url\n * @param {object} body\n * @param {object} [query]\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async post(url, body, query, options) {\n options = options || {};\n options.method = 'POST';\n options.url = url;\n options.query = query;\n options.body = body;\n return await this.send(options);\n }\n\n /**\n * @param {string} url\n * @param {object} [body]\n * @param {object} [query]\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async put(url, body, query, options) {\n options = options || {};\n options.method = 'PUT';\n options.url = url;\n options.query = query;\n options.body = body;\n return await this.send(options);\n }\n\n /**\n * @param {string} url\n * @param {string} [query]\n * @param {object} [options]\n * @param {object} [options.headers]\n * @param {boolean} [options.skipAuthCheck]\n * @return {Promise}\n */\n async 'delete'(url, query, options) {\n options = options || {};\n options.method = 'DELETE';\n options.url = url;\n options.query = query;\n return await this.send(options);\n }\n\n async _tokenRequest(path, body) {\n\n return await this.send({\n url: path,\n skipAuthCheck: true,\n body: body,\n method: 'POST',\n headers: {\n 'Authorization': 'Basic ' + this._apiKey(),\n 'Content-Type': 'application/x-www-form-urlencoded'\n }\n });\n\n }\n\n async _ensureAuthentication() {\n\n if (this._isAccessTokenValid()) return null;\n return await this.refresh();\n\n }\n\n _isAccessTokenValid() {\n\n return (this._auth.accessTokenValid() && !this._queue.isPaused());\n\n }\n\n _apiKey() {\n var apiKey = this._appKey + ':' + this._appSecret;\n return (typeof btoa == 'function') ? btoa(apiKey) : new Buffer(apiKey).toString('base64');\n }\n\n _authHeader() {\n var token = this._auth.accessToken();\n return this._auth.tokenType() + (token ? ' ' + token : '');\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/platform/Platform.js\n **/","export default class Auth {\n\n static refreshHandicapMs:number = 60 * 1000; // 1 minute\n static forcedTokenType = 'forced';\n\n constructor(cache, cacheId:string) {\n\n /** @type {Cache} */\n this._cache = cache;\n this._cacheId = cacheId;\n\n }\n\n accessToken() {\n return this.data().access_token;\n }\n\n refreshToken() {\n return this.data().refresh_token;\n }\n\n tokenType() {\n return this.data().token_type;\n }\n\n /**\n * @return {{token_type: string, access_token: string, expires_in: number, refresh_token: string, refresh_token_expires_in: number}}\n */\n data() {\n\n return this._cache.getItem(this._cacheId) || {\n token_type: '',\n access_token: '',\n expires_in: 0,\n refresh_token: '',\n refresh_token_expires_in: 0\n };\n\n }\n\n /**\n * @param {object} newData\n * @return {Auth}\n */\n setData(newData) {\n\n newData = newData || {};\n\n var data = this.data();\n\n Object.keys(newData).forEach((key) => {\n data[key] = newData[key];\n });\n\n data.expire_time = Date.now() + (data.expires_in * 1000);\n data.refresh_token_expire_time = Date.now() + (data.refresh_token_expires_in * 1000);\n\n this._cache.setItem(this._cacheId, data);\n\n return this;\n\n }\n\n /**\n * Check if there is a valid (not expired) access token\n * @return {boolean}\n */\n accessTokenValid() {\n\n var authData = this.data();\n return (authData.token_type === Auth.forcedTokenType || (authData.expire_time - Auth.refreshHandicapMs > Date.now()));\n\n }\n\n /**\n * Check if there is a valid (not expired) access token\n * @return {boolean}\n */\n refreshTokenValid() {\n\n return (this.data().refresh_token_expire_time > Date.now());\n\n }\n\n /**\n * @return {Auth}\n */\n cancelAccessToken() {\n\n return this.setData({\n access_token: '',\n expires_in: 0\n });\n\n }\n\n /**\n * This method sets a special authentication mode used in Service Web\n * @return {Auth}\n */\n forceAuthentication() {\n\n this.setData({\n token_type: Auth.forcedTokenType,\n access_token: '',\n expires_in: 0,\n refresh_token: '',\n refresh_token_expires_in: 0\n });\n\n return this;\n\n }\n\n /**\n * @param remember\n * @return {Auth}\n */\n setRemember(remember) {\n\n return this.setData({remember: remember});\n\n }\n\n /**\n * @return {boolean}\n */\n remember() {\n\n return !!this.data().remember;\n\n }\n\n}\n\n//export interface IAuthData {\n// remember?:boolean;\n// token_type?:string;\n// access_token?:string;\n// expires_in?:number; // actually it's string\n// expire_time?:number;\n// refresh_token?:string;\n// refresh_token_expires_in?:number; // actually it's string\n// refresh_token_expire_time?:number;\n// scope?:string;\n//}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/platform/Auth.js\n **/","import PubnubMock from './PubnubMock.js';\nimport {PUBNUB} from '../core/Externals';\n\nexport default class PubnubMockFactory {\n\n constructor() {\n this.crypto_obj = PUBNUB.crypto_obj;\n }\n\n init(options:PUBNUBInitOptions) {\n return new PubnubMock(options);\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/pubnub/PubnubFactory.js\n **/","import Observable from '../core/Observable';\nimport {PUBNUB} from '../core/Externals';\n\nexport default class PubnubMock extends Observable {\n\n constructor(options) {\n super();\n this.options = options;\n this.crypto_obj = PUBNUB.crypto_obj;\n }\n\n ready() {}\n\n subscribe(options:PUBNUBSubscribeOptions) {\n this.on('message-' + options.channel, options.message);\n }\n\n unsubscribe(options:PUBNUBUnsubscribeOptions) {\n this.off('message-' + options.channel);\n }\n\n receiveMessage(msg, channel) {\n this.emit('message-' + channel, msg, 'env', channel);\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/pubnub/PubnubMock.js\n **/","import Observable from '../core/Observable';\nimport Client from '../http/Client';\nimport {poll, stopPolling, delay} from '../core/Utils';\n\nexport default class Subscription extends Observable {\n\n static _renewHandicapMs = 2 * 60 * 1000;\n static _pollInterval = 10 * 1000;\n\n events = {\n notification: 'notification',\n removeSuccess: 'removeSuccess',\n removeError: 'removeError',\n renewSuccess: 'renewSuccess',\n renewError: 'renewError',\n subscribeSuccess: 'subscribeSuccess',\n subscribeError: 'subscribeError'\n };\n\n constructor(pubnubFactory, platform) {\n\n super();\n\n this._pubnubFactory = pubnubFactory;\n this._platform = platform;\n this._pubnub = null;\n this._timeout = null;\n this._subscription = {};\n\n }\n\n subscribed(){\n\n return !!(this._subscription.id &&\n this._subscription.deliveryMode &&\n this._subscription.deliveryMode.subscriberKey &&\n this._subscription.deliveryMode.address);\n\n }\n\n /**\n * @return {boolean}\n */\n alive() {\n\n return this.subscribed() && Date.now() < this.expirationTime();\n\n }\n\n expirationTime() {\n return new Date(this._subscription.expirationTime || 0).getTime() - Subscription._renewHandicapMs;\n }\n\n setSubscription(subscription) {\n\n subscription = subscription || {};\n\n this._clearTimeout();\n\n this._subscription = subscription;\n\n if (!this._pubnub) this._subscribeAtPubnub();\n\n this._setTimeout();\n\n return this;\n\n }\n\n subscription() {\n return this._subscription;\n }\n\n /**\n * Creates or updates subscription if there is an active one\n * @returns {Promise}\n */\n async register() {\n\n if (this.alive()) {\n return await this.renew();\n } else {\n return await this.subscribe();\n }\n\n }\n\n eventFilters() {\n return this._subscription.eventFilters || [];\n }\n\n /**\n * @param {string[]} events\n * @return {Subscription}\n */\n addEventFilters(events) {\n this.setEventFilters(this.eventFilters().concat(events));\n return this;\n }\n\n /**\n * @param {string[]} events\n * @return {Subscription}\n */\n setEventFilters(events) {\n this._subscription.eventFilters = events;\n return this;\n }\n\n /**\n * @returns {Promise}\n */\n async subscribe() {\n\n try {\n\n this._clearTimeout();\n\n if (!this.eventFilters().length) throw new Error('Events are undefined');\n\n var response = await this._platform.post('/restapi/v1.0/subscription', {\n eventFilters: this._getFullEventFilters(),\n deliveryMode: {\n transportType: 'PubNub'\n }\n }),\n json = response.json();\n\n this.setSubscription(json)\n .emit(this.events.subscribeSuccess, response);\n\n return response;\n\n\n } catch (e) {\n\n e = this._platform.client().makeError(e);\n\n this.reset()\n .emit(this.events.subscribeError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n async renew() {\n\n try {\n\n this._clearTimeout();\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n if (!this.eventFilters().length) throw new Error('Events are undefined');\n\n var response = await this._platform.put('/restapi/v1.0/subscription/' + this._subscription.id, {\n eventFilters: this._getFullEventFilters()\n });\n\n var json = response.json();\n\n this.setSubscription(json)\n .emit(this.events.renewSuccess, response);\n\n return response;\n\n } catch (e) {\n\n e = this._platform.client().makeError(e);\n\n this.reset()\n .emit(this.events.renewError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n async remove() {\n\n try {\n\n if (!this.subscribed()) throw new Error('No subscription');\n\n var response = await this._platform.delete('/restapi/v1.0/subscription/' + this._subscription.id);\n\n this.reset()\n .emit(this.events.removeSuccess, response);\n\n return response;\n\n } catch (e) {\n\n e = this._platform.client().makeError(e);\n\n this.emit(this.events.removeError, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n resubscribe() {\n\n return this.reset().setEventFilters(this.eventFilters()).subscribe();\n\n }\n\n /**\n * Remove subscription and disconnect from PUBNUB\n * This method resets subscription at client side but backend is not notified\n */\n reset() {\n this._clearTimeout();\n if (this.subscribed() && this._pubnub) this._pubnub.unsubscribe({channel: this._subscription.deliveryMode.address});\n this._subscription = {};\n return this;\n }\n\n _getFullEventFilters() {\n\n return this.eventFilters().map((event) => {\n return this._platform.createUrl(event);\n });\n\n }\n\n _setTimeout() {\n\n this._clearTimeout();\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n poll((next)=> {\n\n if (this.alive()) return next();\n\n this.renew();\n\n }, Subscription._pollInterval, this._timeout);\n\n return this;\n\n }\n\n _clearTimeout() {\n\n stopPolling(this._timeout);\n\n return this;\n\n }\n\n _decrypt(message:any) {\n\n if (!this.subscribed()) throw new Error('No subscription');\n\n if (this._subscription.deliveryMode.encryptionKey) {\n\n var PUBNUB = this._pubnubFactory;\n\n message = PUBNUB.crypto_obj.decrypt(message, this._subscription.deliveryMode.encryptionKey, {\n encryptKey: false,\n keyEncoding: 'base64',\n keyLength: 128,\n mode: 'ecb'\n });\n\n }\n\n return message;\n\n }\n\n _notify(message:any) {\n\n this.emit(this.events.notification, this._decrypt(message));\n\n return this;\n\n }\n\n _subscribeAtPubnub():Subscription {\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n var PUBNUB = this._pubnubFactory;\n\n this._pubnub = PUBNUB.init({\n ssl: true,\n subscribe_key: this._subscription.deliveryMode.subscriberKey\n });\n\n this._pubnub.ready();\n\n this._pubnub.subscribe({\n channel: this._subscription.deliveryMode.address,\n message: this._notify.bind(this),\n connect: () => {}\n });\n\n return this;\n\n }\n\n}\n\n//export interface ISubscription {\n// id?:string;\n// uri?: string;\n// eventFilters?:string[];\n// expirationTime?:string; // 2014-03-12T19:54:35.613Z\n// expiresIn?:number;\n// deliveryMode?: {\n// transportType?:string;\n// encryption?:boolean;\n// address?:string;\n// subscriberKey?:string;\n// encryptionKey?:string;\n// secretKey?:string;\n// };\n// creationTime?:string; // 2014-03-12T19:54:35.613Z\n// status?:string; // Active\n//}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/subscription/Subscription.js\n **/","import Subscription from './Subscription';\nimport Queue from '../core/Queue';\n\nexport default class CachedSubscription extends Subscription {\n\n constructor(pubnubFactory, platform, cache, cacheKey) {\n\n super(pubnubFactory, platform);\n\n this._cache = cache;\n this._cacheKey = cacheKey;\n this._renewQueue = new Queue(this._cache, cacheKey + '-renew');\n this._resubscribeQueue = new Queue(this._cache, cacheKey + '-resubscribe');\n\n this.events = {\n ...this.events,\n queuedRenewSuccess: 'queuedRenewSuccess',\n queuedRenewError: 'queuedRenewError',\n queuedResubscribeSuccess: 'queuedResubscribeSuccess',\n queuedResubscribeError: 'queuedResubscribeError'\n };\n\n this.on(this.events.renewError, () => {\n this.resubscribe();\n });\n\n this.on([this.events.subscribeSuccess, this.events.renewSuccess], () => {\n this._cache.setItem(this._cacheKey, this.subscription());\n });\n\n this.on(this.events.removeSuccess, () => {\n this._cache.removeItem(this._cacheKey);\n });\n\n }\n\n /**\n * TODO Combine with Platform.refresh and move elsewhere\n * @param actionCb\n * @param queue\n * @param successEvent\n * @param errorEvent\n * @param errorMessage\n * @return {*}\n * @private\n */\n async _queue(actionCb, queue, successEvent, errorEvent, errorMessage) {\n\n try {\n\n if (queue.isPaused()) {\n\n await queue.poll();\n\n if (!this.alive()) {\n throw new Error(errorMessage);\n }\n\n this.emit(successEvent, null);\n\n return null;\n\n }\n\n queue.pause();\n\n var res = await actionCb.call(this);\n\n queue.resume();\n\n this.emit(successEvent, res);\n\n return res;\n\n } catch (e) {\n\n this.emit(errorEvent, e);\n\n throw e;\n\n }\n\n }\n\n /**\n * @returns {Promise}\n */\n renew() {\n\n return this._queue(\n super.renew,\n this._renewQueue,\n this.events.queuedRenewSuccess,\n this.events.queuedRenewError,\n 'Subscription is not alive after renew timeout'\n );\n\n }\n\n /**\n * @returns {Promise}\n */\n resubscribe() {\n\n return this._queue(\n super.resubscribe,\n this._resubscribeQueue,\n this.events.queuedResubscribeSuccess,\n this.events.queuedResubscribeError,\n 'Subscription is not alive after resubscribe timeout'\n );\n\n }\n\n /**\n * @param {string[]} events\n * @return {CachedSubscription}\n */\n restore(events) {\n\n var cachedSubscriptionData = this._cache.getItem(this._cacheKey);\n\n if (cachedSubscriptionData) {\n try {\n this.setSubscription(cachedSubscriptionData);\n } catch (e) {}\n } else {\n this.setEventFilters(events);\n }\n\n return this;\n\n }\n\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/subscription/CachedSubscription.js\n **/","/**\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 // This invoke function is written in a style that assumes some\n // calling function (or Promise) will handle exceptions.\n function invoke(method, arg) {\n var result = generator[method](arg);\n var value = result.value;\n return value instanceof AwaitArgument\n ? Promise.resolve(value.arg).then(invokeNext, invokeThrow)\n : 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 return result;\n });\n }\n\n if (typeof process === \"object\" && process.domain) {\n invoke = process.domain.bind(invoke);\n }\n\n var invokeNext = invoke.bind(generator, \"next\");\n var invokeThrow = invoke.bind(generator, \"throw\");\n var invokeReturn = invoke.bind(generator, \"return\");\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return invoke(method, arg);\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 ) : new Promise(function (resolve) {\n resolve(callInvokeWithMethodAndArg());\n });\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\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/regenerator/runtime.js\n ** module id = 22\n ** module chunks = 0\n **/"],"sourceRoot":"/source/"} \ No newline at end of file diff --git a/demo/doubleSubscription.html b/demo/doubleSubscription.html index 77485c75..f5ef810f 100644 --- a/demo/doubleSubscription.html +++ b/demo/doubleSubscription.html @@ -31,8 +31,8 @@ document.getElementById('extension').style.display = 'block'; var subscription1 = rcsdk - .createSubscription() - .restoreFromCache('subscription', ['/account/~/extension/~/presence']); + .createCachedSubscription('subscription') + .restore(['/account/~/extension/~/presence']); console.log('Cached subscription data', subscription1.subscription(), 'alive', subscription1.alive()); diff --git a/docs/migration-1.x-2.0.md b/docs/migration-1.x-2.0.md index f463a2e9..6d9d3f8e 100644 --- a/docs/migration-1.x-2.0.md +++ b/docs/migration-1.x-2.0.md @@ -4,8 +4,10 @@ Key differences: - Helpers were moved to separate repository: [RingCentral JS Helpers](https://github.com/ringcentral/ringcentral-js-helpers). - Root JS name has changed from `RCSDK` to `RingCentral.SDK` +- New naming convention: `getSomething()` methods are now simply `something()` +- `Auth` class inside `Platform` - `AjaxObserver` functionality been moved to `Client` -- New network request/response objects `ApiResponse` interface: +- New `ApiResponse` interface that wraps network Requests/Responses: - `apiResponse.json()` instead of `ajax.json` - `apiResponse.multipart()` instead of `ajax.responses` - `apiResponse.request()` and `ajax.response()` to access to DOM Request and DOM Response accordingly diff --git a/src/SDK.js b/src/SDK.js index b71434a7..ff0b71d6 100644 --- a/src/SDK.js +++ b/src/SDK.js @@ -2,6 +2,7 @@ import * as Utils from './core/Utils'; import Cache from './core/Cache'; import * as Externals from './core/Externals'; import Observable from './core/Observable'; +import Queue from './core/Queue'; import Client from './http/Client'; import ApiResponse from './http/ApiResponse'; @@ -13,11 +14,11 @@ import Registry from './mocks/Registry'; import Platform from './platform/Platform'; import Auth from './platform/Auth'; -import Queue from './platform/Queue'; import PubnubMockFactory from './pubnub/PubnubFactory'; import Subscription from './subscription/Subscription'; +import CachedSubscription from './subscription/CachedSubscription'; require("regenerator/runtime"); @@ -67,7 +68,14 @@ export default class SDK { * @return {Subscription} */ createSubscription() { - return new Subscription(this._pubnubFactory, this._platform, this._cache); + return new Subscription(this._pubnubFactory, this._platform); + } + + /** + * @return {CachedSubscription} + */ + createCachedSubscription(cacheKey) { + return new CachedSubscription(this._pubnubFactory, this._platform, this._cache, cacheKey); } /** @@ -81,7 +89,8 @@ export default class SDK { Cache: Cache, Observable: Observable, Utils: Utils, - Externals: Externals + Externals: Externals, + Queue: Queue }; static http = { @@ -92,8 +101,7 @@ export default class SDK { static platform = { Auth: Auth, - Platform: Platform, - Queue: Queue + Platform: Platform }; static subscription = { diff --git a/src/core/Externals.js b/src/core/Externals.js index 271972ce..82a8fc1d 100644 --- a/src/core/Externals.js +++ b/src/core/Externals.js @@ -2,14 +2,15 @@ import ES6Promise from 'es6-promise'; import nodeFetch from 'node-fetch'; import pubnub from 'pubnub'; -export var Promise = (ES6Promise && ES6Promise.Promise) || window.Promise; +var root = (new Function('return this'))(); -export var fetch = nodeFetch || window.fetch; -export var Request = fetch.Request || window.Request; -export var Response = fetch.Response || window.Response; -export var Headers = fetch.Headers || window.Headers; +export var Promise = (ES6Promise && ES6Promise.Promise) || root.Promise; -export var PUBNUB = pubnub || window.PUBNUB; +export var fetch = root.fetch || nodeFetch; +export var Request = root.Request || fetch.Request; +export var Response = root.Response || fetch.Response; +export var Headers = root.Headers || fetch.Headers; -export var localStorage = (typeof window !== 'undefined' && - typeof window.localStorage !== 'undefined') ? window.localStorage : {}; +export var PUBNUB = root.PUBNUB || pubnub; + +export var localStorage = (typeof root.localStorage !== 'undefined') ? root.localStorage : {}; \ No newline at end of file diff --git a/src/platform/Queue-spec.js b/src/core/Queue-spec.js similarity index 78% rename from src/platform/Queue-spec.js rename to src/core/Queue-spec.js index 85dd6bac..4ff45150 100644 --- a/src/platform/Queue-spec.js +++ b/src/core/Queue-spec.js @@ -1,13 +1,13 @@ import {expect, getSdk, getMock, getRegistry} from '../test/test'; import SDK from '../SDK'; -describe('RingCentral.platform.Queue', function() { +describe('RingCentral.core.Queue', function() { - var pollInterval = SDK.platform.Queue._pollInterval, - releaseTimeout = SDK.platform.Queue._releaseTimeout; + var pollInterval = SDK.core.Queue._pollInterval, + releaseTimeout = SDK.core.Queue._releaseTimeout; function getQueue() { - return new SDK.platform.Queue(new SDK.core.Cache({}), 'foo'); + return new SDK.core.Queue(new SDK.core.Cache({}), 'foo'); } describe('poll', function() { diff --git a/src/platform/Queue.js b/src/core/Queue.js similarity index 85% rename from src/platform/Queue.js rename to src/core/Queue.js index cddafa1a..de3af5a8 100644 --- a/src/platform/Queue.js +++ b/src/core/Queue.js @@ -1,5 +1,5 @@ import {Promise} from '../core/Externals'; -import {poll, stopPolling} from '../core/Utils'; +import {poll, stopPolling} from './Utils'; export default class Queue { @@ -16,9 +16,7 @@ export default class Queue { isPaused() { - var storage = this._cache, - cacheId = this._cacheId, - time = storage.getItem(cacheId); + var time = this._cache.getItem(this._cacheId); return !!time && Date.now() - parseInt(time) < Queue._releaseTimeout; } diff --git a/src/platform/Platform.js b/src/platform/Platform.js index 1a536453..15579169 100644 --- a/src/platform/Platform.js +++ b/src/platform/Platform.js @@ -1,5 +1,5 @@ import Observable from '../core/Observable'; -import Queue from './Queue'; +import Queue from '../core/Queue'; import Auth from './Auth'; import {Promise} from '../core/Externals'; import {queryStringify, parseQueryString, delay} from '../core/Utils'; @@ -372,8 +372,8 @@ export default class Platform extends Observable { /** * General purpose function to send anything to server + * @param {string} options.url * @param {object} [options.body] - * @param {string} [options.url] * @param {string} [options.method] * @param {object} [options.query] * @param {object} [options.headers] @@ -391,7 +391,7 @@ export default class Platform extends Observable { /** * @param {string} url - * @param {object} query + * @param {object} [query] * @param {object} [options] * @param {object} [options.headers] * @param {boolean} [options.skipAuthCheck] @@ -408,7 +408,7 @@ export default class Platform extends Observable { /** * @param {string} url * @param {object} body - * @param {object} query + * @param {object} [query] * @param {object} [options] * @param {object} [options.headers] * @param {boolean} [options.skipAuthCheck] @@ -425,8 +425,8 @@ export default class Platform extends Observable { /** * @param {string} url - * @param {object} body - * @param {object} query + * @param {object} [body] + * @param {object} [query] * @param {object} [options] * @param {object} [options.headers] * @param {boolean} [options.skipAuthCheck] @@ -443,7 +443,7 @@ export default class Platform extends Observable { /** * @param {string} url - * @param {string} query + * @param {string} [query] * @param {object} [options] * @param {object} [options.headers] * @param {boolean} [options.skipAuthCheck] diff --git a/src/subscription/CachedSubscription-spec.js b/src/subscription/CachedSubscription-spec.js new file mode 100644 index 00000000..3eadc85f --- /dev/null +++ b/src/subscription/CachedSubscription-spec.js @@ -0,0 +1,21 @@ +import {expect, getSdk, getMock, getRegistry, spy} from '../test/test'; +import SDK from '../SDK'; + +describe('RingCentral.subscription.CachedSubscription', function() { + + describe('restore', function() { + + it.skip('sets appropriate event filters if subscription is not alive', function() {}); + it.skip('sets appropriate event filters if subscription is never existed', function() {}); + it.skip('renews subscription if cache data is OK', function() {}); + it.skip('re-subscribes with default event filters when renew fails', function() {}); + + }); + + describe('renew', function() { + }); + + describe('resubscribe', function() { + }); + +}); diff --git a/src/subscription/CachedSubscription.js b/src/subscription/CachedSubscription.js new file mode 100644 index 00000000..c53720ae --- /dev/null +++ b/src/subscription/CachedSubscription.js @@ -0,0 +1,135 @@ +import Subscription from './Subscription'; +import Queue from '../core/Queue'; + +export default class CachedSubscription extends Subscription { + + constructor(pubnubFactory, platform, cache, cacheKey) { + + super(pubnubFactory, platform); + + this._cache = cache; + this._cacheKey = cacheKey; + this._renewQueue = new Queue(this._cache, cacheKey + '-renew'); + this._resubscribeQueue = new Queue(this._cache, cacheKey + '-resubscribe'); + + this.events = { + ...this.events, + queuedRenewSuccess: 'queuedRenewSuccess', + queuedRenewError: 'queuedRenewError', + queuedResubscribeSuccess: 'queuedResubscribeSuccess', + queuedResubscribeError: 'queuedResubscribeError' + }; + + this.on(this.events.renewError, () => { + this.resubscribe(); + }); + + this.on([this.events.subscribeSuccess, this.events.renewSuccess], () => { + this._cache.setItem(this._cacheKey, this.subscription()); + }); + + this.on(this.events.removeSuccess, () => { + this._cache.removeItem(this._cacheKey); + }); + + } + + /** + * TODO Combine with Platform.refresh and move elsewhere + * @param actionCb + * @param queue + * @param successEvent + * @param errorEvent + * @param errorMessage + * @return {*} + * @private + */ + async _queue(actionCb, queue, successEvent, errorEvent, errorMessage) { + + try { + + if (queue.isPaused()) { + + await queue.poll(); + + if (!this.alive()) { + throw new Error(errorMessage); + } + + this.emit(successEvent, null); + + return null; + + } + + queue.pause(); + + var res = await actionCb.call(this); + + queue.resume(); + + this.emit(successEvent, res); + + return res; + + } catch (e) { + + this.emit(errorEvent, e); + + throw e; + + } + + } + + /** + * @returns {Promise} + */ + renew() { + + return this._queue( + super.renew, + this._renewQueue, + this.events.queuedRenewSuccess, + this.events.queuedRenewError, + 'Subscription is not alive after renew timeout' + ); + + } + + /** + * @returns {Promise} + */ + resubscribe() { + + return this._queue( + super.resubscribe, + this._resubscribeQueue, + this.events.queuedResubscribeSuccess, + this.events.queuedResubscribeError, + 'Subscription is not alive after resubscribe timeout' + ); + + } + + /** + * @param {string[]} events + * @return {CachedSubscription} + */ + restore(events) { + + var cachedSubscriptionData = this._cache.getItem(this._cacheKey); + + if (cachedSubscriptionData) { + try { + this.setSubscription(cachedSubscriptionData); + } catch (e) {} + } else { + this.setEventFilters(events); + } + + return this; + + } + +} \ No newline at end of file diff --git a/src/subscription/Subscription-spec.js b/src/subscription/Subscription-spec.js index 1fd5ee92..3838e7ce 100644 --- a/src/subscription/Subscription-spec.js +++ b/src/subscription/Subscription-spec.js @@ -16,9 +16,8 @@ describe('RingCentral.subscription.Subscription', function() { getRegistry().subscribeGeneric(expiresIn); return subscription - .register({ - events: ['foo', 'bar'] - }) + .setEventFilters(['foo', 'bar']) + .register() .then((res)=> { expect(res.json().expiresIn).to.equal(expiresIn); }); @@ -29,9 +28,7 @@ describe('RingCentral.subscription.Subscription', function() { }); - describe.skip('destroy', function() {}); - - describe('notify method', function() { + describe('notify', function() { it('fires a notification event when the notify method is called and passes the message object', function() { @@ -145,9 +142,8 @@ describe('RingCentral.subscription.Subscription', function() { getRegistry().subscribeGeneric(); return subscription - .subscribe({ - events: [event] - }) + .setEventFilters([event]) + .subscribe() .then(function() { expect(subscription.subscription().eventFilters.length).to.equal(1); }); @@ -166,9 +162,8 @@ describe('RingCentral.subscription.Subscription', function() { .apiCall('POST', '/restapi/v1.0/subscription', {'message': 'Subscription failed'}, 400, 'Bad Request'); return subscription - .subscribe({ - events: ['foo'] - }) + .setEventFilters(['foo']) + .subscribe() .then(function() { throw new Error('This should never be reached'); }) @@ -185,26 +180,24 @@ describe('RingCentral.subscription.Subscription', function() { }); - describe('decrypt method', function() { + describe('decrypt', function() { it('decrypts AES-encrypted messages when the subscription has an encryption key', function() { - var subscription = getSdk().createSubscription(), + var subscription = getSdk().createSubscription().setSubscription({ + id: 'foo', + expirationTime: new Date(Date.now() + expiresIn).toISOString(), + deliveryMode: { + encryptionKey: 'e0bMTqmumPfFUbwzppkSbA==', + subscriberKey: 'foo', + address: 'foo' + } + }), aesMessage = 'gkw8EU4G1SDVa2/hrlv6+0ViIxB7N1i1z5MU/Hu2xkIKzH6yQzhr3vIc27IAN558kTOkacqE5DkLpRdnN1orwtI' + 'BsUHmPMkMWTOLDzVr6eRk+2Gcj2Wft7ZKrCD+FCXlKYIoa98tUD2xvoYnRwxiE2QaNywl8UtjaqpTk1+WDImBrt' + '6uabB1WICY/qE0It3DqQ6vdUWISoTfjb+vT5h9kfZxWYUP4ykN2UtUW1biqCjj1Rb6GWGnTx6jPqF77ud0XgV1r' + 'k/Q6heSFZWV/GP23/iytDPK1HGJoJqXPx7ErQU='; - subscription['_subscription'] = { - id: 'foo', - expirationTime: new Date(Date.now() + expiresIn).toISOString(), - deliveryMode: { - encryptionKey: 'e0bMTqmumPfFUbwzppkSbA==', - subscriberKey: 'foo', - address: 'foo' - } - }; - expect(subscription['_decrypt'](aesMessage)).to.deep.equal({ "timestamp": "2014-03-12T20:47:54.712+0000", "body": { @@ -219,4 +212,13 @@ describe('RingCentral.subscription.Subscription', function() { }); + describe('restoreFromCache', function() { + + it.skip('sets appropriate event filters if subscription is not alive', function() {}); + it.skip('sets appropriate event filters if subscription is never existed', function() {}); + it.skip('renews subscription if cache data is OK', function() {}); + it.skip('re-subscribes with default event filters when renew fails', function() {}); + + }); + }); diff --git a/src/subscription/Subscription.js b/src/subscription/Subscription.js index 9004f3f8..5fad8850 100644 --- a/src/subscription/Subscription.js +++ b/src/subscription/Subscription.js @@ -1,6 +1,6 @@ import Observable from '../core/Observable'; import Client from '../http/Client'; -import {poll, stopPolling} from '../core/Utils'; +import {poll, stopPolling, delay} from '../core/Utils'; export default class Subscription extends Observable { @@ -17,29 +17,33 @@ export default class Subscription extends Observable { subscribeError: 'subscribeError' }; - constructor(pubnubFactory, platform, cache) { + constructor(pubnubFactory, platform) { super(); this._pubnubFactory = pubnubFactory; this._platform = platform; - this._cache = cache; this._pubnub = null; this._timeout = null; this._subscription = {}; } + subscribed(){ + + return !!(this._subscription.id && + this._subscription.deliveryMode && + this._subscription.deliveryMode.subscriberKey && + this._subscription.deliveryMode.address); + + } + /** * @return {boolean} */ alive() { - return !!(this._subscription.id && - this._subscription.deliveryMode && - this._subscription.deliveryMode.subscriberKey && - this._subscription.deliveryMode.address && - Date.now() < this.expirationTime()); + return this.subscribed() && Date.now() < this.expirationTime(); } @@ -69,15 +73,14 @@ export default class Subscription extends Observable { /** * Creates or updates subscription if there is an active one - * @param {{events?:string[]}} [options] New array of events * @returns {Promise} */ - async register(options) { + async register() { if (this.alive()) { - return await this.renew(options); + return await this.renew(); } else { - return await this.subscribe(options); + return await this.subscribe(); } } @@ -105,17 +108,12 @@ export default class Subscription extends Observable { } /** - * @param {{events?:string[]}} [options] New array of events * @returns {Promise} */ - async subscribe(options) { + async subscribe() { try { - options = options || {}; - - if (options.events) this.setEventFilters(options.events); - this._clearTimeout(); if (!this.eventFilters().length) throw new Error('Events are undefined'); @@ -148,17 +146,12 @@ export default class Subscription extends Observable { } /** - * @param {{events?:string[]}} [options] New array of events * @returns {Promise} */ - async renew(options) { + async renew() { try { - options = options || {}; - - if (options.events) this.setEventFilters(options.events); - this._clearTimeout(); if (!this.alive()) throw new Error('Subscription is not alive'); @@ -196,7 +189,7 @@ export default class Subscription extends Observable { try { - if (!this.alive()) throw new Error('Subscription is not alive'); + if (!this.subscribed()) throw new Error('No subscription'); var response = await this._platform.delete('/restapi/v1.0/subscription/' + this._subscription.id); @@ -217,53 +210,26 @@ export default class Subscription extends Observable { } + /** + * @returns {Promise} + */ + resubscribe() { + + return this.reset().setEventFilters(this.eventFilters()).subscribe(); + + } + /** * Remove subscription and disconnect from PUBNUB * This method resets subscription at client side but backend is not notified */ reset() { this._clearTimeout(); - if (this.alive() && this._pubnub) this._pubnub.unsubscribe({channel: this._subscription.deliveryMode.address}); + if (this.subscribed() && this._pubnub) this._pubnub.unsubscribe({channel: this._subscription.deliveryMode.address}); this._subscription = {}; return this; } - /** - * - * @param {string} cacheKey - * @param {string[]} events - * @return {Subscription} - */ - restoreFromCache(cacheKey, events) { - - this.on([this.events.subscribeSuccess, this.events.renewSuccess], () => { - - this._cache.setItem(cacheKey, this.subscription()); - - }); - - this.on(this.events.renewError, () => { - - this.reset() - .setEventFilters(events) - .register(); - - }); - - var cachedSubscriptionData = this._cache.getItem(cacheKey); - - if (cachedSubscriptionData) { - try { - this.setSubscription(cachedSubscriptionData); - } catch (e) {} - } else { - this.setEventFilters(events); - } - - return this; - - } - _getFullEventFilters() { return this.eventFilters().map((event) => { @@ -300,7 +266,7 @@ export default class Subscription extends Observable { _decrypt(message:any) { - if (!this.alive()) throw new Error('Subscription is not alive'); + if (!this.subscribed()) throw new Error('No subscription'); if (this._subscription.deliveryMode.encryptionKey) { diff --git a/src/test/test.js b/src/test/test.js index 11e1b8f6..bfc262b8 100644 --- a/src/test/test.js +++ b/src/test/test.js @@ -1,13 +1,11 @@ -import * as _mocha from 'mocha'; -import * as _chai from 'chai'; -import * as _sinon from 'sinon'; -import * as _sinonChai from 'sinon-chai'; +import _mocha from 'mocha'; +import _chai from 'chai'; +import _sinon from 'sinon'; +import _sinonChai from 'sinon-chai'; import SDK from '../SDK'; -export var mocha = _mocha; export var chai = _chai || window.chai; export var sinon = _sinon || window.sinon; -export var sinonChai = _sinonChai; export var expect = chai.expect; export var spy = sinon.spy; @@ -16,8 +14,8 @@ var pubnub = new SDK.pubnub.PubnubMockFactory(); // Alter default settings SDK.platform.Platform._refreshDelayMs = 1; -SDK.platform.Queue._pollInterval = 1; -SDK.platform.Queue._releaseTimeout = 50; +SDK.core.Queue._pollInterval = 1; +SDK.core.Queue._releaseTimeout = 50; SDK.subscription.Subscription._pollInterval = 1; export function getRegistry() {