From 6fb932581eda2d0296a9dee966a298fda28655ff Mon Sep 17 00:00:00 2001 From: Kirill Konshin Date: Thu, 10 Sep 2015 16:34:37 -0700 Subject: [PATCH] ES7 Tests Simplified refresh ES Imports JSDoc Loose ES6 Docs Included mocks into package Subscriptions upgrade --- .babelrc | 4 + .travis.yml | 13 + CONTRIBUTING.md | 34 +- README.md | 398 +- bower.json | 4 +- build/ringcentral-bundle.js | 13032 +++++++++------- build/ringcentral-bundle.js.map | 2 +- build/ringcentral-bundle.min.js | 9 +- build/ringcentral-bundle.min.js.map | 2 +- build/ringcentral.d.ts | 518 - build/ringcentral.js | 5589 ++++--- build/ringcentral.js.map | 2 +- build/ringcentral.min.js | 7 +- build/ringcentral.min.js.map | 2 +- demo/apiKey.html | 14 +- demo/core.html | 22 +- demo/doubleSubscription.html | 198 + demo/requirejs.html | 44 +- docs/migration-1.x-2.0.md | 13 +- gulpfile.js | 104 +- package.json | 49 +- src/SDK-spec.js | 34 + src/SDK-spec.ts | 39 - src/SDK.js | 113 + src/SDK.ts | 119 - src/core/{Cache-spec.ts => Cache-spec.js} | 11 +- src/core/Cache.js | 51 + src/core/Cache.ts | 57 - src/core/Externals.js | 15 + src/core/Log-spec.ts | 53 - src/core/Log.ts | 84 - ...{Observable-spec.ts => Observable-spec.js} | 13 +- src/core/Observable.js | 76 + src/core/Observable.ts | 97 - src/core/PageVisibility.ts | 63 - src/core/Utils-spec.js | 106 + src/core/Utils-spec.ts | 363 - src/core/Utils.js | 135 + src/core/Utils.ts | 297 - src/externals.d.ts | 13 - src/externals/Externals.ts | 28 - ...piResponse-spec.ts => ApiResponse-spec.js} | 31 +- src/http/ApiResponse.js | 203 + src/http/ApiResponse.ts | 199 - src/http/Client-spec.js | 45 + src/http/Client-spec.ts | 86 - src/http/Client.js | 156 + src/http/Client.ts | 197 - src/http/ClientMock.ts | 35 - src/http/Utils.js | 37 + src/mocks/ClientMock.js | 23 + src/mocks/Mock.js | 55 + src/mocks/Mock.ts | 71 - src/mocks/Registry.js | 171 + src/mocks/Registry.ts | 177 - src/platform/Auth.js | 146 + src/platform/Auth.ts | 142 - .../{Platform-spec.ts => Platform-spec.js} | 134 +- src/platform/Platform.js | 498 + src/platform/Platform.ts | 451 - src/platform/{Queue-spec.ts => Queue-spec.js} | 14 +- src/platform/Queue.js | 60 + src/platform/Queue.ts | 90 - src/pubnub/PubnubFactory.js | 14 + src/pubnub/PubnubFactory.ts | 22 - src/pubnub/PubnubMock.js | 26 + src/pubnub/PubnubMock.ts | 48 - ...scription-spec.ts => Subscription-spec.js} | 52 +- src/subscription/Subscription.js | 371 + src/subscription/Subscription.ts | 344 - src/test.ts | 45 - src/test/glob.js | 3 + src/test/test.js | 81 + tsconfig.json | 13 - .../pubnub/pubnub.d.ts | 0 .../requirejs/require.d.ts | 0 .../whatwg-fetch/whatwg-fetch.d.ts | 0 {src/typings => typings}/chai/chai.d.ts | 0 .../cryptojs/cryptojs.d.ts | 0 .../es6-promise/es6-promise.d.ts | 0 .../form-data/form-data.d.ts | 0 {src/typings => typings}/gulp/gulp.d.ts | 0 {src/typings => typings}/mocha/mocha.d.ts | 0 {src/typings => typings}/node/node.d.ts | 0 .../sinon-chai/sinon-chai.d.ts | 0 {src/typings => typings}/sinon/sinon.d.ts | 0 {src/typings => typings}/tsd.d.ts | 0 utils/karma.conf.js | 12 +- utils/karma.conf.webpack.js | 58 + utils/test-native.html | 2 +- utils/test-polyfills.html | 2 +- utils/test-requirejs.html | 2 +- utils/wrap-tests.js | 21 - webpack.config.js | 87 + 94 files changed, 14454 insertions(+), 11597 deletions(-) create mode 100644 .babelrc delete mode 100644 build/ringcentral.d.ts create mode 100644 demo/doubleSubscription.html create mode 100644 src/SDK-spec.js delete mode 100644 src/SDK-spec.ts create mode 100644 src/SDK.js delete mode 100644 src/SDK.ts rename src/core/{Cache-spec.ts => Cache-spec.js} (68%) create mode 100644 src/core/Cache.js delete mode 100644 src/core/Cache.ts create mode 100644 src/core/Externals.js delete mode 100644 src/core/Log-spec.ts delete mode 100644 src/core/Log.ts rename src/core/{Observable-spec.ts => Observable-spec.js} (77%) create mode 100644 src/core/Observable.js delete mode 100644 src/core/Observable.ts delete mode 100644 src/core/PageVisibility.ts create mode 100644 src/core/Utils-spec.js delete mode 100644 src/core/Utils-spec.ts create mode 100644 src/core/Utils.js delete mode 100644 src/core/Utils.ts delete mode 100644 src/externals.d.ts delete mode 100644 src/externals/Externals.ts rename src/http/{ApiResponse-spec.ts => ApiResponse-spec.js} (86%) create mode 100644 src/http/ApiResponse.js delete mode 100644 src/http/ApiResponse.ts create mode 100644 src/http/Client-spec.js delete mode 100644 src/http/Client-spec.ts create mode 100644 src/http/Client.js delete mode 100644 src/http/Client.ts delete mode 100644 src/http/ClientMock.ts create mode 100644 src/http/Utils.js create mode 100644 src/mocks/ClientMock.js create mode 100644 src/mocks/Mock.js delete mode 100644 src/mocks/Mock.ts create mode 100644 src/mocks/Registry.js delete mode 100644 src/mocks/Registry.ts create mode 100644 src/platform/Auth.js delete mode 100644 src/platform/Auth.ts rename src/platform/{Platform-spec.ts => Platform-spec.js} (79%) create mode 100644 src/platform/Platform.js delete mode 100644 src/platform/Platform.ts rename src/platform/{Queue-spec.ts => Queue-spec.js} (71%) create mode 100644 src/platform/Queue.js delete mode 100644 src/platform/Queue.ts create mode 100644 src/pubnub/PubnubFactory.js delete mode 100644 src/pubnub/PubnubFactory.ts create mode 100644 src/pubnub/PubnubMock.js delete mode 100644 src/pubnub/PubnubMock.ts rename src/subscription/{Subscription-spec.ts => Subscription-spec.js} (84%) create mode 100644 src/subscription/Subscription.js delete mode 100644 src/subscription/Subscription.ts delete mode 100644 src/test.ts create mode 100644 src/test/glob.js create mode 100644 src/test/test.js delete mode 100644 tsconfig.json rename {src/typings-custom => typings-custom}/pubnub/pubnub.d.ts (100%) rename {src/typings-custom => typings-custom}/requirejs/require.d.ts (100%) rename {src/typings-custom => typings-custom}/whatwg-fetch/whatwg-fetch.d.ts (100%) rename {src/typings => typings}/chai/chai.d.ts (100%) rename {src/typings => typings}/cryptojs/cryptojs.d.ts (100%) rename {src/typings => typings}/es6-promise/es6-promise.d.ts (100%) rename {src/typings => typings}/form-data/form-data.d.ts (100%) rename {src/typings => typings}/gulp/gulp.d.ts (100%) rename {src/typings => typings}/mocha/mocha.d.ts (100%) rename {src/typings => typings}/node/node.d.ts (100%) rename {src/typings => typings}/sinon-chai/sinon-chai.d.ts (100%) rename {src/typings => typings}/sinon/sinon.d.ts (100%) rename {src/typings => typings}/tsd.d.ts (100%) create mode 100644 utils/karma.conf.webpack.js delete mode 100644 utils/wrap-tests.js create mode 100644 webpack.config.js diff --git a/.babelrc b/.babelrc new file mode 100644 index 00000000..53f2ae95 --- /dev/null +++ b/.babelrc @@ -0,0 +1,4 @@ +{ + "stage": 0, + "loose": "all" +} \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index e69de29b..ecebc8bb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -0,0 +1,13 @@ +language: node_js +node_js: +- '0.12' +- '0.11' +- iojs +deploy: + provider: npm + email: kirill.konshin@gmail.com + api_key: + secure: wEPdEMw5ZYN1GvFJ50ySov+K8rDHC9w2QCqMKu202ipTU60G44/ktEP/PU5ZLN3BUCpvXeHMx+DbMhwb7S4RxdMP4CkMnju2vaIt94K7WRNHa7kcNgJFm3jUpkg1rkqqfVvcKykHeMKMMUaJNzQUm9nPSTtJex8s7tk3+SQ6bDmsQPmNt4c5r5ihIjxvkjuxgQLk48CRXT98EU9KsZf57Ri93whKbrGAJ9lo4Oq+2oFhXil8fDl3XdRyAZbLaDz5wHq4diDUkKvVnsDzDlW0rkCcYJMDrJUuUnuvD59MYlUv2QWXPzeuEe7m4eLk48AuoK+t9PqjlwLAlJdjU2ZtqaeGIY6KAWkfzpi3QlBPk0XXpUs5Jr6vlCQU8ed4xr+wAZIWQfuPx+v205JlScY3td7I2eZ5nOD8//NJ1RxVnitTm4x7vZnKku+56jCf9kHq/EB+ndMD0rSU5/pyhUYFxCmShdLNp1IV7qcwDud+SejQ3eWQ23eyf9n8e5d+QOvOCoCjENMfQVCt+oOPFGztBnd839VbYXvP1OSk2JpgQ2O1muxRCKVv+hid6d38lnMAXRJWcFIpdNy7bxpySebPIt8w3kxYNGrJm09CrCvBd0pjwNg+HagjT9olz9balAPSGpzZexg2F4C1UgoxSec0/aoKir+91MsqnkLc0E0Q8fE= + on: + tags: true + repo: ringcentral/ringcentral-js diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 14a2b226..a0165374 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,18 +12,12 @@ In the directory where a local copy of the SDK is placed: $ npm install ``` -## 3. Install Bower +## 3. Install Bower Dependencies Bower is needed to run Karma tests. ``` -$ npm install -g bower -``` - -## 4. Install Bower dependencies - -``` -$ bower install +$ npm run bower ``` # Building with GulpJS @@ -31,11 +25,11 @@ $ bower install Build schema: ``` - ┏━━━━━ webpack ━━━━┳━ sourcemap ━━┓ - ┃ ┃ ┃ - clean ━╋━ webpack-bundle ━┛ ┣━ default - ┃ ┃ - ┗━ tsc ━ wrap ━ jshint ━ version ━┛ + ┏━━━━━ webpack ━━━━┳━ version ━ uglify ━━┓ + ┃ ┃ ┃ + clean ━╋━ webpack-bundle ━┛ ┣━ default + ┃ ┃ + ┗━ version ━┛ ``` ## Regular build @@ -44,28 +38,24 @@ Build schema: $ npm run build ``` -## Watch +# Tests ``` -$ npm run watch +$ npm test ``` -or `watch-all` will include Webpack watchers. - -*** - -# Tests - ## Mocha (console) ``` -$ npm test +$ npm run mocha +$ npm run mocha-compilers ``` ## Karma (browser) ``` $ npm run karma [-- --no-single-run --auto-watch --log-level warn --browsers Chrome] +$ npm run karma-webpack [-- --no-single-run --auto-watch --log-level warn --browsers Chrome] ``` or use short-hands: `$ npm run karma-chrome` and `$ npm run karma-watch`. diff --git a/README.md b/README.md index f046f3bf..c55ea35c 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ Pick the option that works best for you: ```sh bower install ringcentral --save - ```Bower + ``` - Donwload everything manually *(not recommended)*: - [ZIP file with source code](https://github.com/ringcentral/ringcentral-js/archive/master.zip) @@ -139,7 +139,7 @@ Make sure that polyfills are loaded before or together with SDK. 3. Add the following to your `webpack.config.js`, path should be relative to Webpack configuration file: - ```json + ```js { resolve: { alias: { @@ -173,11 +173,11 @@ window.Response = whatever; Also you can manually define SDK internal variables: ```js -RingCentral.sdk.externals._Promise = {Promise: $q.Promise, resolve: q.resolve, reject: q.reject, all: q.all}; -RingCentral.sdk.externals._fetch = whatever; -RingCentral.sdk.externals._Headers = whatever; -RingCentral.sdk.externals._Request = whatever; -RingCentral.sdk.externals._Response = whatever; +RingCentral.SDK.core.Externals.Promise = {Promise: $q.Promise, resolve: q.resolve, reject: q.reject, all: q.all}; +RingCentral.SDK.core.Externals.fetch = whatever; +RingCentral.SDK.core.Externals.Headers = whatever; +RingCentral.SDK.core.Externals.Request = whatever; +RingCentral.SDK.core.Externals.Response = whatever; ``` But taking into account the nature of polyfills, it's better to keep them global as described before. @@ -212,7 +212,7 @@ then configure it. Before you can do anything using the Platform singleton, you relations team). ```js -var rcsdk = new RingCentral.sdk.SDK({ +var rcsdk = new RingCentral.SDK({ server: 'https://platform.devtest.ringcentral.com', // SANDBOX //server: 'https://platform.ringcentral.com', // PRODUCTION appKey: 'yourAppKey', @@ -225,7 +225,7 @@ This instance will be used later on to perform calls to API. ## Get the Platform Singleton ```js -var platform = rcsdk.getPlatform(); +var platform = rcsdk.platform(); ``` Now that you have your platform singleton and SDK has been configured with the correct server URL and API key, your @@ -237,8 +237,8 @@ Login is accomplished by calling the `platform.authorize()` method of the Platfo (optional), and password as parameters. A `Promise` instance is returned, resolved with an AJAX `Response` object. ```js -rcsdk.getPlatform() - .authorize({ +rcsdk.platform() + .login({ username: '18001234567', // phone number in full format extension: '', // leave blank if direct number is used password: 'yourpassword' @@ -270,11 +270,11 @@ a good UX in your login form UI. ### Checking Authentication State -To check in your Application if the user is authenticated, you can call the `isAuthorized` method of the platform +To check in your Application if the user is authenticated, you can call the `loggedIn` method of the platform singleton: ```js -rcsdk.getPlatform().isAuthorized().then(function(){ ... }).catch(function(e){ ... }); +rcsdk.platform().loggedIn().then(function(status){ ... }); ``` The SDK takes care of the token lifecycle. It will refresh tokens for you automatically. It will also automatically @@ -282,27 +282,27 @@ pause and queue all new API requests while the token is being refreshed in order between SDK instances in different tabs. Paused / queued API requests will then be automatically processed once the token has been refreshed. All apropriate events will be emitted during this process. -If you just need to check whether the user has a valid token, you can call the `isTokenValid` method: +If you just need to check whether the user has a valid token, you can call the `accessTokenValid` method: ```js -rcsdk.getPlatform().isTokenValid(); // returns boolean +rcsdk.platform().auth().accessTokenValid(); // returns boolean ``` ## Performing API calls -To perform an authenticated API call, you should use the `apiCall` method of the platform singleton: +To perform an authenticated API call, you should use the one of the methods of the platform singleton: ```js -rcsdk.getPlatform() - .apiCall('/account/~/extension/~', { - method: 'GET', // GET | POST | PUT | DELETE - headers: {}, - query: {}, - body: 'POSTDATA', +rcsdk.platform() + .send('/account/~/extension/~', { + method: 'PUT', + query: {...}, + headers: {...}, + body: {...} }) - .then(function(response){ + .then(function(apiResponse){ - alert(response.getJson().name); + alert(apiResponse.json().name); }) .catch(function(e){ @@ -310,36 +310,24 @@ rcsdk.getPlatform() alert(e.message); // please note that ajax property may not be accessible if error occurred before AJAX send - if ('response' in e && 'request' in e) { + if (e.apiResponse && e.apiResponse()) { - var response = e.response, // or e.ajax for backward compatibility - request = e.request; + var request = e.apiResponse().request(); - alert('Ajax error ' + e.message + ' for URL' + request.url + ' ' + response.getError()); + alert('Ajax error ' + e.message + ' for URL' + request.url + ' ' + e.apiResponse().error()); } }); -``` -You can also use short-hand methods: +// Shorthand methods -```js -rcsdk.getPlatform().get('/account/~/extension/~', {...options...}).then(function(response){ ... }); -rcsdk.getPlatform().post('/account/~/extension/~', {...options...}).then(function(response){ ... }); -rcsdk.getPlatform().put('/account/~/extension/~', {...options...}).then(function(response){ ... }); -rcsdk.getPlatform().delete('/account/~/extension/~', {...options...}).then(function(response){ ... }); +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(...); ``` -Take a look on [sms example](#sms) to see how POST request can be sent. - -### Important note for users of versions prior to **1.2.0**: - -AjaxOptions now has `body` and `query` properties instead of `post` and `get` respectively. You can continue to use old -`post` and `get` properties, backwards compatibility is maintained, but they both were deprecated since **1.2.0**. - -If application send both `body` and `post` or `query` and `get` at the same time then `post` and `get` will be ignored. - ### Sending things other than JSON You can set `headers['Content-Type']` property of AJAX options to `false` in order to let XHR library to figure out @@ -356,28 +344,26 @@ Important notes: Logging the user out is trivial - just call the `logout` method on the platform singleton: ```js -platform.logout().then(...).catch(...); +rcsdk.platform().logout().then(...).catch(...); ``` ## Events The platform provides the following events: -- `accessViolation` - emitted when the application attempts to make an API call when there is no valid access token or -the refresh process has failed, which may occur when the user switches tabs in the browser. +- `loginSuccess` +- `loginError` - `logoutSuccess` - `logoutError` -- `authorizeSuccess` -- `authorizeError` - `refreshSuccess` -- `refreshError` +- `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.getPlatform(); +var platform = rcsdk.platform(); -platform.on(platform.events.accessViolation, function(e){ +platform.on(platform.events.refreshError, function(e){ // do something }); ``` @@ -391,7 +377,7 @@ Subscriptions are a convenient way to receive updates on server-side events, suc Subscriptions are created by calling the `getSubscription` method of the RingCentral instance created earlier on. ```js -var subscription = rcsdk.getSubscription(); +var subscription = rcsdk.createSubscription(); subscription.on(subscription.events.notification, function(msg) { console.log(msg, msg.body); @@ -403,59 +389,97 @@ subscription.register({ ``` 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 `destroy` method: +call the subscription instance's `reset` and `off` methods: ```js -subscription.destroy(); +subscription.reset().off(); ``` -You can add more events to the same subscription at any time, by calling the subscription's `addEvents` method: +You can add more events to the same subscription at any time, by calling the subscription methods: ```js -subscription.addEvents(['/account/~/extension/222/presence']).register(); -subscription.setEvents(['/account/~/extension/222/presence']).register(); +subscription.setEventFilters(['/account/~/extension/111/presence']).register(); +subscription.addEventFilters(['/account/~/extension/222/presence']).register(); ``` -## Subscriptions Lifecycle +### Subscriptions Lifecycle -The number of active subscriptions is limited per account (about 20). This means that the application should dispose of +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 -**Keep track of the amount of used subscriptions. It might be a good idea to have a central storage for them.** +One of very useful techniques is to always store subscription data in cache: -Following is an Angular-specific example, showing controller code that listens to subscriptions: +```js +var cacheKey = 'some-custom-key'; +var subscription = rcsdk.createSubscription(); +var cachedSubscriptionData = rcsdk.cache().getItem(cacheKey); + +if (cachedSubscriptionData) { + try { // if subscription is already expired an error will be thrown so we need to capture it + subscription.setSubscription(cachedSubscriptionData); // use the cache + } catch (e) { + console.error('Cannot set subscription data', e); + } +} else { + subscription.setEventFilters(['/account/~/extension/~/presence']); // explicitly set required events +} + +subscription.on([subscription.events.subscribeSuccess, subscription.events.renewSuccess], function() { + rcsdk.cache().setItem(cacheKey, subscription.subscription()); +}); + +subscription.register(); +``` + +With this technique subscription remove request on window/tab closing is no longer needed. + +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 + +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). + +Recommendation is to listen to `subscription.events.renewError` event and when it occurs reset and re-subscribe: ```js -var platform = rcsdk.getPlatform(); +subscription.on(subscription.events.renewError, function() { + subscription + .reset() + .setEventFilters('...') + .register(); +}); +``` -function destroy() { +This has to be done in all tabs, application must handle potential race conditions. - // In order to release a subscription, you need to remove it at the server - // A simple token check will not lead to a refresh process, as opposed to platform.isAuthorized() - if (platform.isTokenValid()) subscription.remove(); +### Shorthand - // Detach event listeners - subscription.destroy(); +The above mentioned things are put together into `restoreFromCache()` method: -} +```js +var subscription = rcsdk.createSubscription() + .restoreFromCache('cache-key', ['/account/~/extension/~/presence']); +``` -// listener has to be SYNCHRONOUS for that, manually send a synchronous request if you need this -window.addEventListener('beforeunload', destroy); +### Subscription Multiplexor -platform.on([platform.events.accessViolation], destroy); +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. -// This occurs when user navigates away from the controller -$scope.$on('$destroy', function() { +In the notification event handler application may have a bunch of if's that will execute appropriate action based on +`event` property of the incoming message: - window.removeEventListener('beforeunload', destroy); - platform.off([platform.events.accessViolation, platform.events.beforeLogout], destroy); - - destroy(); - +```js +subscription.on(subscription.events.notification, function(msg) { + if (msg.event.indexOf('/presence') > -1) { ... } + elseif (msg.event.indexOf('/message-store') > -1) { ... } + else { ... } }); ``` @@ -474,9 +498,7 @@ The sequence of RingOut is as follows: Please refer to the following example: ```js -var platform = rcsdk.getPlatform(), - Utils = rcsdk.getUtils(), - Log = rcsdk.getLog(), +var platform = rcsdk.platform(), timeout = null, // reference to timeout object ringout = {}; // this is the status object (lowercase) @@ -485,7 +507,7 @@ var platform = rcsdk.getPlatform(), */ function handleError(e) { - Log.error(e); + console.error(e); alert(e.message); } @@ -496,10 +518,10 @@ function create(unsavedRingout) { .post('/account/~/extension/~/ringout', {body: unsavedRingout}) .then(function(response) { - Utils.extend(ringout, response.getJson()); - Log.info('First status:', ringout.status.callStatus); - timeout = Utils.poll(update, 500, timeout); - + ringout = response.json(); + console.info('First status:', ringout.status.callStatus); + update(); + }) .catch(handleError); @@ -509,20 +531,26 @@ function create(unsavedRingout) { * @param {function(number?)} next - callback that will be used to continue polling * @param {number} delay - last used delay */ -function update(next, delay) { +function update() { - if (ringout.status && ringout.status.callStatus !== 'InProgress') return; + clearTimeout(timeout); - platform - .get(ringout.uri) - .then(function(response) { + setTimeout(function() { - Utils.extend(ringout, response.getJson()); - Log.info('Current status:', ringout.status.callStatus); - timeout = next(delay); + if (ringout.status && ringout.status.callStatus !== 'InProgress') return; - }) - .catch(handleError); + platform + .get(ringout.uri) + .then(function(response) { + + ringout = response.json(); + console.info('Current status:', ringout.status.callStatus); + update(); + + }) + .catch(handleError); + + }, 500); } @@ -531,7 +559,7 @@ function update(next, delay) { */ function hangUp() { - Utils.stopPolling(timeout); + clearTimeout(timeout); if (ringout.status && ringout.status.callStatus !== 'InProgress') { @@ -562,28 +590,6 @@ create({ }); ``` -## A deeper look at the `Utils.poll()` and `Utils.stopPolling()` methods - -```js -// first, define polling function: -function pollFn(next, delay) { - if (condition) next(); // uses previous delay, condition can be anything required to keep polling - // or next(100); -- simply sets a new delay - // or next(delay * 2); -- this will make delay bigger after every cycle - // if next() is not called, then next cycle will not happen -} - -// then start polling -// pollFn -- (required) is function that will be called to track status -// 500 -- (optional) is a number of milliseconds is to delay the next poll -// previousTimeout -- (optional) can be supplied to automatically cancel any previous timeouts -// newTimeout will be returned -var newTimeout = Utils.poll(pollFn, 500, previousTimeout); - -// call this at any time to stop polling -Utils.stopPolling(newTimeout); -``` - *** # Call Management Using JavaScript @@ -599,27 +605,27 @@ A call management integration usually consists of the following tasks: ## Track the telephony status -First, you need to load the initial Presence status: +First, you need to load the initial Presence status (you can use Underscore or Lodash to simplify things): ```js var accountPresence = {}; -rcsdk.getPlatform() +rcsdk.platform() .get('/account/~/extension/~/presence?detailedTelephonyState=true').then(function(response) { - rcsdk.getUtils().extend(accountPresence, response.getJson()); + _.extend(accountPresence, response.json()); }) .catch(function(e) { alert('Load Presence Error: ' + e.message); }); ``` -In the meantime, you can also set up Subscriptions: +In the meantime, you can also set up Subscriptions (you can use Underscore or Lodash to simplify things): ```js -var subscription = rcsdk.getSubscription().addEvents(['/account/~/extension/~/presence?detailedTelephonyState=true']); +var subscription = rcsdk.createSubscription().addEvents(['/account/~/extension/~/presence?detailedTelephonyState=true']); subscription.on(subscription.events.notification, function(msg) { - rcsdk.getUtils().extend(accountPresence, msg); + _.extend(accountPresence, msg); }); subscription.register().then(function(response) { @@ -634,10 +640,10 @@ return subscription; ## View the list of active calls ```js -rcsdk.getPlatform() +rcsdk.platform() .get('/account/~/extension/~/active-calls', {query: {page: 1, perPage: 10}}) .then(function(response) { - activeCalls = response.getJson().records; + activeCalls = response.json().records; }) .catch(function(e) { alert('Active Calls Error: ' + e.message); @@ -647,10 +653,10 @@ rcsdk.getPlatform() ## View the list of recent calls ```js -rcsdk.getPlatform() +rcsdk.platform() .get('/account/~/extension/~/call-log', {query: {page: 1, perPage: 10}}) .then(function(response) { - calls = response.getJson().records; + calls = response.json().records; }) .catch(function(e) { alert('Recent Calls Error: ' + e.message); @@ -665,7 +671,7 @@ By default, the load request returns calls that were made during the last week. In order to send an SMS using the API, simply make a POST request to `/account/~/extension/~/sms`: ```js -rcsdk.getPlatform() +rcsdk.platform() .post('/account/~/extension/~/sms', { body: { from: {phoneNumber:'+12223334444'}, // Your sms-enabled phone number @@ -676,64 +682,13 @@ rcsdk.getPlatform() } }) .then(function(response) { - alert('Success: ' + response.getJson().id); - }) - .catch(function(e) { - alert('Error: ' + e.message); - }); -``` - -# SMS - -In order to send a Fax using the API, simply make a POST request to `/account/~/extension/~/fax`. SDK provides a -convenience functionality to simplify the building of FaxOut requests. Due to difference in available technologies -between Browser and NodeJS your code should be aware of that. - -```js -var request = rcsdk.getMultipartRequest(); - -request - .setBody({ - to: [{phoneNumber: '12223334455'}], - faxResolution": 'Low' - }); - -// Browser - -request - .addAttachment(document.querySelector('#file-upload')) - .addAttachment({contentType: 'text/plain', content: 'Hello, World'}) - .addAttachment({contentType: 'text/plain', content: 'Hello, World', fileName: 'foo.txt'}); - -// NodeJS - -request - .addAttachment({ - contentType: 'application/octet-stream', - content: fs.readFileSync('path-to-file').toString('base64'), - fileName: 'foo.txt' - }) - .addAttachment({contentType: 'text/plain', content: 'Hello, World'}) - .addAttachment({contentType: 'text/plain', content: new Buffer('whatever')}) - .addAttachment({contentType: 'text/plain', content: 'Hello, World', fileName: 'foo.txt'}); - -// Cross-environment - -rcsdk.getPlatform() - .post('/account/~/extension/~/fax', request.getOptions()) - .then(function(ajax) { - alert('Success!'); + alert('Success: ' + response.json().id); }) .catch(function(e) { alert('Error: ' + e.message); }); ``` -Optional configuration parameters for attachments `contentType` and `fileName` may be omitted. Defaults are `text/plain` -and `file.txt` respectively. - -*** - # Fax Fax endpoint understands `multipart/form-data` requests. First part must always be JSON-encoded information about the @@ -744,9 +699,11 @@ fax. Other parts should have `filename` defined in order to be correctly present Modern browsers have `FormData` class which could be used for sending faxes. ```js -var body = {to: {phoneNumber: '123'}, faxResolution: 'High'}; // see all available options on Developer Portal - -var formData = new FormData(); +var body = { + to: {phoneNumber: '123'}, // see all available options on Developer Portal + faxResolution: 'High' + }, + formData = new FormData(); // This is the mandatory part, the name and type should always be as follows formData.append('json', new File([JSON.stringify(body)]), 'request.json', {type: 'application/json'}); @@ -763,7 +720,7 @@ for (var i = 0, file; file = fileField.files[i]; ++i) { formData.append('attachment', new File(['some plain text']), 'text.txt', {type: 'application/octet-stream'}); // Send the fax -rcsdk.getPlatform().post('/account/~/extension/~/fax', {body: formData}); +rcsdk.platform().post('/account/~/extension/~/fax', {body: formData}); ``` Further reading: @@ -784,16 +741,16 @@ npm install form-data Then you can build your fax, but keep in mind that FormData API in NodeJS is slightly different from the browser: ```js -var body = {to: {phoneNumber: '123'}, faxResolution: 'High'}; // see all available options on Developer Portal - -var FormData = require('form-data'); - -var formData = new FormData(); +var FormData = require('form-data'), + body = { + to: {phoneNumber: '123'}, // see all available options on Developer Portal + faxResolution: 'High' + }, + formData = new FormData(); // This is the mandatory part, the name and type should always be as follows formData.append('json', new Buffer(JSON.stringify(body)), {filename: 'request.json', contentType: 'application/json'}); - // To send a plain text formData.append('attachment', new Buffer('some plain text'), 'text.txt', {type: 'application/octet-stream'}); @@ -801,7 +758,7 @@ formData.append('attachment', new Buffer('some plain text'), 'text.txt', {type: formData.append('attachment', require('fs').createReadStream('/foo/bar.jpg')); // Send the fax -rcsdk.getPlatform().post('/account/~/extension/~/fax', {body: formData}); +rcsdk.platform().post('/account/~/extension/~/fax', {body: formData}); ``` Further reading: @@ -812,9 +769,9 @@ Further reading: # Page Visibility -This class is a wrapper for the [Page Visibility API](http://www.w3.org/TR/page-visibility/), which hides vendor -prefixes and provides a short and simple way to observe visibility changes. - +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). + This allows tracking the visibility of the page/tab/window/frame so that the application can react accordingly. Following are some actions that the application may wish to take whenever it becomes visible: @@ -825,49 +782,16 @@ Following are some actions that the application may wish to take whenever it bec Another usage is to reduce the number of Call Log or Messages reloads when the application is not visible. The SDK does not require that any such optimizations be implemented in the application, but it is considered good practice. -Using the page visibility wrapper is very straightforward - just register an observer function for the -`visibility.events.change` event: - -```js -var visibility = rcsdk.getPageVisibility(); - -visibility.on(visibility.events.change, function (visible) { - if (visible) ... -}); -``` - -See also [Core Module: Checking Authentication State](#checking-authentication-state). - -## Alternatives - -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). - *** -# Tracking Ajax Requests +# Tracking Network Requests & Responses -You can set up tracking for all Ajax requests (for instance, to log them somewhere) by obtaining an Ajax observer object +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: ```js -var client = rcsdk.getClient(); -client.on(observer.events.beforeRequest, function(ajax) {}); -client.on(observer.events.requestSuccess, function(ajax) {}); -client.on(observer.events.requestError, function(e) {}); +var client = rcsdk.platform().client(); +client.on(client.events.beforeRequest, function(apiResponse) {}); // apiResponse does not have response at this point +client.on(client.events.requestSuccess, function(apiResponse) {}); +client.on(client.events.requestError, function(apiError) {}); ``` - -Observer functions are passed a reference of the `Ajax` for which the event has occurred. Every `Ajax` object offers a -number of accessor methods and properties: - -- `getRequest()` — request that was given to transport *(if any)* - - `url` - - `headers` -- `getResponse()` — raw text response from server *(if any)* - - `status` - - `statusText` - - `headers` -- `getJson()` — JSON-parsed response -- `getText()` — Textual representation of response -- `getResponses()` — An array of underlying `Ajax` objects for `Content-Type: multipart/mixed` responses -- `getResponsesAjax()` — An array of underlying parsed JSONs of `Ajax` objects for `Content-Type: multipart/mixed` responses diff --git a/bower.json b/bower.json index ee87afd8..57b22953 100644 --- a/bower.json +++ b/bower.json @@ -1,4 +1,5 @@ { + "version": "2.0.0", "name": "ringcentral", "main": "./build/ringcentral.min.js", "ignore": [ @@ -38,6 +39,5 @@ "repository": { "type": "git", "url": "git://gitgub.com/ringcentral/ringcentral-js.git" - }, - "version": "2.0.0" + } } \ No newline at end of file diff --git a/build/ringcentral-bundle.js b/build/ringcentral-bundle.js index 32294c60..c2c34d84 100644 --- a/build/ringcentral-bundle.js +++ b/build/ringcentral-bundle.js @@ -1,6168 +1,8258 @@ -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var core; - (function (core) { - var Cache = (function () { - function Cache(storage, prefix) { - this.setPrefix(prefix); - this._storage = storage; +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["SDK"] = factory(); + else + root["RingCentral"] = root["RingCentral"] || {}, root["RingCentral"]["SDK"] = factory(); +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; +/******/ +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.loaded = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = "/build/"; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(1); + + +/***/ }, +/* 1 */ +/***/ 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 _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; } } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + +var _coreUtils = __webpack_require__(2); + +var Utils = _interopRequireWildcard(_coreUtils); + +var _coreCache = __webpack_require__(11); + +var _coreCache2 = _interopRequireDefault(_coreCache); + +var _coreExternals = __webpack_require__(3); + +var Externals = _interopRequireWildcard(_coreExternals); + +var _coreObservable = __webpack_require__(12); + +var _coreObservable2 = _interopRequireDefault(_coreObservable); + +var _httpClient = __webpack_require__(13); + +var _httpClient2 = _interopRequireDefault(_httpClient); + +var _httpApiResponse = __webpack_require__(15); + +var _httpApiResponse2 = _interopRequireDefault(_httpApiResponse); + +var _httpUtils = __webpack_require__(14); + +var HttpUtils = _interopRequireWildcard(_httpUtils); + +var _mocksClientMock = __webpack_require__(16); + +var _mocksClientMock2 = _interopRequireDefault(_mocksClientMock); + +var _mocksMock = __webpack_require__(18); + +var _mocksMock2 = _interopRequireDefault(_mocksMock); + +var _mocksRegistry = __webpack_require__(17); + +var _mocksRegistry2 = _interopRequireDefault(_mocksRegistry); + +var _platformPlatform = __webpack_require__(19); + +var _platformPlatform2 = _interopRequireDefault(_platformPlatform); + +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); + +var _subscriptionSubscription = __webpack_require__(24); + +var _subscriptionSubscription2 = _interopRequireDefault(_subscriptionSubscription); + +__webpack_require__(25); + +var SDK = (function () { + _createClass(SDK, null, [{ + key: 'version', + value: '2.0.0', + enumerable: true + }, { + key: 'server', + value: { + sandbox: 'https://platform.devtest.ringcentral.com', + production: 'https://platform.ringcentral.com' + }, + + /** + * @constructor + * @param {object} [options] + * @param {string} [options.server] + * @param {string} [options.cachePrefix] + * @param {string} [options.appSecret] + * @param {string} [options.appKey] + * @param {string} [options.appName] + * @param {string} [options.appVersion] + * @param {string} [options.pubnubFactory] + * @param {string} [options.client] + */ + enumerable: true + }]); + + function SDK(options) { + _classCallCheck(this, SDK); + + options = options || {}; + + this._cache = new _coreCache2['default'](Externals.localStorage, options.cachePrefix); + + this._client = options.client || new _httpClient2['default'](); + + this._platform = new _platformPlatform2['default'](this._client, this._cache, options.server, options.appKey, options.appSecret); + + this._pubnubFactory = options.pubnubFactory || Externals.PUBNUB; + } + + /** + * @return {Platform} + */ + + SDK.prototype.platform = function platform() { + return this._platform; + }; + + /** + * @return {Subscription} + */ + + SDK.prototype.createSubscription = function createSubscription() { + return new _subscriptionSubscription2['default'](this._pubnubFactory, this._platform, this._cache); + }; + + /** + * @return {Cache} + */ + + SDK.prototype.cache = function cache() { + return this._cache; + }; + + _createClass(SDK, null, [{ + key: 'core', + value: { + Cache: _coreCache2['default'], + Observable: _coreObservable2['default'], + Utils: Utils, + Externals: Externals + }, + enumerable: true + }, { + key: 'http', + value: { + Client: _httpClient2['default'], + ApiResponse: _httpApiResponse2['default'], + Utils: HttpUtils + }, + enumerable: true + }, { + key: 'platform', + value: { + Auth: _platformAuth2['default'], + Platform: _platformPlatform2['default'], + Queue: _platformQueue2['default'] + }, + enumerable: true + }, { + key: 'subscription', + value: { + Subscription: _subscriptionSubscription2['default'] + }, + enumerable: true + }, { + key: 'mocks', + value: { + Client: _mocksClientMock2['default'], + Registry: _mocksRegistry2['default'], + Mock: _mocksMock2['default'] + }, + enumerable: true + }, { + key: 'pubnub', + value: { + PubnubMockFactory: _pubnubPubnubFactory2['default'] + }, + enumerable: true + }]); + + return SDK; +})(); + +exports['default'] = SDK; +module.exports = exports['default']; + +/***/ }, +/* 2 */ +/***/ function(module, exports, __webpack_require__) { + +'use strict'; + +exports.__esModule = true; +exports.queryStringify = queryStringify; +exports.parseQueryString = parseQueryString; +exports.isFunction = isFunction; +exports.isArray = isArray; +exports.poll = poll; +exports.stopPolling = stopPolling; +exports.isNodeJS = isNodeJS; +exports.isBrowser = isBrowser; +exports.delay = delay; + +var _ExternalsJs = __webpack_require__(3); + +/** + * TODO Replace with something better + * @see https://github.com/joyent/node/blob/master/lib/querystring.js + * @param {object} parameters + * @returns {string} + */ + +function queryStringify(parameters) { + + var array = []; + + parameters = parameters || {}; + + Object.keys(parameters).forEach(function (k) { + + var v = parameters[k]; + + if (isArray(v)) { + v.forEach(function (vv) { + array.push(encodeURIComponent(k) + '=' + encodeURIComponent(vv)); + }); + } else { + array.push(encodeURIComponent(k) + '=' + encodeURIComponent(v)); + } + }); + + return array.join('&'); +} + +/** + * TODO Replace with something better + * @see https://github.com/joyent/node/blob/master/lib/querystring.js + * @param {string} queryString + * @returns {object} + */ + +function parseQueryString(queryString) { + + var argsParsed = {}; + + queryString.split('&').forEach(function (arg) { + + arg = decodeURIComponent(arg); + + if (arg.indexOf('=') == -1) { + + argsParsed[arg.trim()] = true; + } else { + + var pair = arg.split('='), + key = pair[0].trim(), + value = pair[1].trim(); + + if (key in argsParsed) { + if (key in argsParsed && !isArray(argsParsed[key])) argsParsed[key] = [argsParsed[key]]; + argsParsed[key].push(value); + } else { + argsParsed[key] = value; + } + } + }); + + return argsParsed; +} + +/** + * @param obj + * @return {boolean} + */ + +function isFunction(obj) { + return typeof obj === "function"; +} + +/** + * @param obj + * @return {boolean} + */ + +function isArray(obj) { + return Array.isArray ? Array.isArray(obj) : typeof obj === "array"; +} + +/** + * @param fn + * @param interval + * @param timeout + */ + +function poll(fn, interval, timeout) { + //NodeJS.Timer|number + + module.exports.stopPolling(timeout); + + interval = interval || 1000; + + var next = function next(delay) { + + delay = delay || interval; + + interval = delay; + + return setTimeout(function () { + + fn(next, delay); + }, delay); + }; + + return next(); +} + +function stopPolling(timeout) { + if (timeout) clearTimeout(timeout); +} + +function isNodeJS() { + return typeof process !== 'undefined'; +} + +function isBrowser() { + return typeof window !== 'undefined'; +} + +function delay(timeout) { + return new _ExternalsJs.Promise(function (resolve, reject) { + setTimeout(function () { + resolve(null); + }, timeout); + }); +} + +/***/ }, +/* 3 */ +/***/ function(module, exports, __webpack_require__) { + +'use strict'; + +exports.__esModule = true; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _es6Promise = __webpack_require__(4); + +var _es6Promise2 = _interopRequireDefault(_es6Promise); + +var _nodeFetch = __webpack_require__(9); + +var _nodeFetch2 = _interopRequireDefault(_nodeFetch); + +var _pubnub = __webpack_require__(10); + +var _pubnub2 = _interopRequireDefault(_pubnub); + +var Promise = _es6Promise2['default'] && _es6Promise2['default'].Promise || window.Promise; + +exports.Promise = Promise; +var fetch = _nodeFetch2['default'] || window.fetch; +exports.fetch = fetch; +var Request = fetch.Request || window.Request; +exports.Request = Request; +var Response = fetch.Response || window.Response; +exports.Response = Response; +var Headers = fetch.Headers || window.Headers; + +exports.Headers = Headers; +var PUBNUB = _pubnub2['default'] || window.PUBNUB; + +exports.PUBNUB = PUBNUB; +var localStorage = typeof window !== 'undefined' && typeof window.localStorage !== 'undefined' ? window.localStorage : {}; +exports.localStorage = localStorage; + +/***/ }, +/* 4 */ +/***/ function(module, exports, __webpack_require__) { + +var require;var __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(setImmediate, global, module) {/*! + * @overview es6-promise - a tiny implementation of Promises/A+. + * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) + * @license Licensed under MIT license + * See https://raw.githubusercontent.com/jakearchibald/es6-promise/master/LICENSE + * @version 2.2.0 + */ + +(function() { + "use strict"; + function lib$es6$promise$utils$$objectOrFunction(x) { + return typeof x === 'function' || (typeof x === 'object' && x !== null); + } + + function lib$es6$promise$utils$$isFunction(x) { + return typeof x === 'function'; + } + + function lib$es6$promise$utils$$isMaybeThenable(x) { + return typeof x === 'object' && x !== null; + } + + var lib$es6$promise$utils$$_isArray; + if (!Array.isArray) { + lib$es6$promise$utils$$_isArray = function (x) { + return Object.prototype.toString.call(x) === '[object Array]'; + }; + } else { + lib$es6$promise$utils$$_isArray = Array.isArray; + } + + var lib$es6$promise$utils$$isArray = lib$es6$promise$utils$$_isArray; + var lib$es6$promise$asap$$len = 0; + var lib$es6$promise$asap$$toString = {}.toString; + var lib$es6$promise$asap$$vertxNext; + var lib$es6$promise$asap$$customSchedulerFn; + + function lib$es6$promise$asap$$asap(callback, arg) { + lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len] = callback; + lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len + 1] = arg; + lib$es6$promise$asap$$len += 2; + if (lib$es6$promise$asap$$len === 2) { + // If len is 2, that means that we need to schedule an async flush. + // If additional callbacks are queued before the queue is flushed, they + // will be processed by this flush that we are scheduling. + if (lib$es6$promise$asap$$customSchedulerFn) { + lib$es6$promise$asap$$customSchedulerFn(lib$es6$promise$asap$$flush); + } else { + lib$es6$promise$asap$$scheduleFlush(); + } + } + } + + var lib$es6$promise$asap$$default = lib$es6$promise$asap$$asap; + function lib$es6$promise$asap$$setScheduler(scheduleFn) { + lib$es6$promise$asap$$customSchedulerFn = scheduleFn; + } + + var lib$es6$promise$asap$$browserWindow = (typeof window !== 'undefined') ? window : undefined; + var lib$es6$promise$asap$$browserGlobal = lib$es6$promise$asap$$browserWindow || {}; + var lib$es6$promise$asap$$BrowserMutationObserver = lib$es6$promise$asap$$browserGlobal.MutationObserver || lib$es6$promise$asap$$browserGlobal.WebKitMutationObserver; + var lib$es6$promise$asap$$isNode = typeof process !== 'undefined' && {}.toString.call(process) === '[object process]'; + + // test for web worker but not in IE10 + var lib$es6$promise$asap$$isWorker = typeof Uint8ClampedArray !== 'undefined' && + typeof importScripts !== 'undefined' && + typeof MessageChannel !== 'undefined'; + + // node + function lib$es6$promise$asap$$useNextTick() { + var nextTick = process.nextTick; + // node version 0.10.x displays a deprecation warning when nextTick is used recursively + // setImmediate should be used instead instead + var version = process.versions.node.match(/^(?:(\d+)\.)?(?:(\d+)\.)?(\*|\d+)$/); + if (Array.isArray(version) && version[1] === '0' && version[2] === '10') { + nextTick = setImmediate; + } + return function() { + nextTick(lib$es6$promise$asap$$flush); + }; + } + + // vertx + function lib$es6$promise$asap$$useVertxTimer() { + return function() { + lib$es6$promise$asap$$vertxNext(lib$es6$promise$asap$$flush); + }; + } + + function lib$es6$promise$asap$$useMutationObserver() { + var iterations = 0; + var observer = new lib$es6$promise$asap$$BrowserMutationObserver(lib$es6$promise$asap$$flush); + var node = document.createTextNode(''); + observer.observe(node, { characterData: true }); + + return function() { + node.data = (iterations = ++iterations % 2); + }; + } + + // web worker + function lib$es6$promise$asap$$useMessageChannel() { + var channel = new MessageChannel(); + channel.port1.onmessage = lib$es6$promise$asap$$flush; + return function () { + channel.port2.postMessage(0); + }; + } + + function lib$es6$promise$asap$$useSetTimeout() { + return function() { + setTimeout(lib$es6$promise$asap$$flush, 1); + }; + } + + var lib$es6$promise$asap$$queue = new Array(1000); + function lib$es6$promise$asap$$flush() { + for (var i = 0; i < lib$es6$promise$asap$$len; i+=2) { + var callback = lib$es6$promise$asap$$queue[i]; + var arg = lib$es6$promise$asap$$queue[i+1]; + + callback(arg); + + lib$es6$promise$asap$$queue[i] = undefined; + lib$es6$promise$asap$$queue[i+1] = undefined; + } + + lib$es6$promise$asap$$len = 0; + } + + function lib$es6$promise$asap$$attemptVertex() { + try { + var r = require; + var vertx = __webpack_require__(!(function webpackMissingModule() { var e = new Error("Cannot find module \"vertx\""); e.code = 'MODULE_NOT_FOUND'; throw e; }())); + lib$es6$promise$asap$$vertxNext = vertx.runOnLoop || vertx.runOnContext; + return lib$es6$promise$asap$$useVertxTimer(); + } catch(e) { + return lib$es6$promise$asap$$useSetTimeout(); + } + } + + var lib$es6$promise$asap$$scheduleFlush; + // Decide what async method to use to triggering processing of queued callbacks: + if (lib$es6$promise$asap$$isNode) { + lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useNextTick(); + } else if (lib$es6$promise$asap$$BrowserMutationObserver) { + lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMutationObserver(); + } else if (lib$es6$promise$asap$$isWorker) { + lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMessageChannel(); + } else if (lib$es6$promise$asap$$browserWindow === undefined && "function" === 'function') { + lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$attemptVertex(); + } else { + lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useSetTimeout(); + } + + function lib$es6$promise$$internal$$noop() {} + + var lib$es6$promise$$internal$$PENDING = void 0; + var lib$es6$promise$$internal$$FULFILLED = 1; + var lib$es6$promise$$internal$$REJECTED = 2; + + var lib$es6$promise$$internal$$GET_THEN_ERROR = new lib$es6$promise$$internal$$ErrorObject(); + + function lib$es6$promise$$internal$$selfFullfillment() { + return new TypeError("You cannot resolve a promise with itself"); + } + + function lib$es6$promise$$internal$$cannotReturnOwn() { + return new TypeError('A promises callback cannot return that same promise.'); + } + + function lib$es6$promise$$internal$$getThen(promise) { + try { + return promise.then; + } catch(error) { + lib$es6$promise$$internal$$GET_THEN_ERROR.error = error; + return lib$es6$promise$$internal$$GET_THEN_ERROR; + } + } + + function lib$es6$promise$$internal$$tryThen(then, value, fulfillmentHandler, rejectionHandler) { + try { + then.call(value, fulfillmentHandler, rejectionHandler); + } catch(e) { + return e; + } + } + + function lib$es6$promise$$internal$$handleForeignThenable(promise, thenable, then) { + lib$es6$promise$asap$$default(function(promise) { + var sealed = false; + var error = lib$es6$promise$$internal$$tryThen(then, thenable, function(value) { + if (sealed) { return; } + sealed = true; + if (thenable !== value) { + lib$es6$promise$$internal$$resolve(promise, value); + } else { + lib$es6$promise$$internal$$fulfill(promise, value); + } + }, function(reason) { + if (sealed) { return; } + sealed = true; + + lib$es6$promise$$internal$$reject(promise, reason); + }, 'Settle: ' + (promise._label || ' unknown promise')); + + if (!sealed && error) { + sealed = true; + lib$es6$promise$$internal$$reject(promise, error); + } + }, promise); + } + + function lib$es6$promise$$internal$$handleOwnThenable(promise, thenable) { + if (thenable._state === lib$es6$promise$$internal$$FULFILLED) { + lib$es6$promise$$internal$$fulfill(promise, thenable._result); + } else if (thenable._state === lib$es6$promise$$internal$$REJECTED) { + lib$es6$promise$$internal$$reject(promise, thenable._result); + } else { + lib$es6$promise$$internal$$subscribe(thenable, undefined, function(value) { + lib$es6$promise$$internal$$resolve(promise, value); + }, function(reason) { + lib$es6$promise$$internal$$reject(promise, reason); + }); + } + } + + function lib$es6$promise$$internal$$handleMaybeThenable(promise, maybeThenable) { + if (maybeThenable.constructor === promise.constructor) { + lib$es6$promise$$internal$$handleOwnThenable(promise, maybeThenable); + } else { + var then = lib$es6$promise$$internal$$getThen(maybeThenable); + + if (then === lib$es6$promise$$internal$$GET_THEN_ERROR) { + lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$GET_THEN_ERROR.error); + } else if (then === undefined) { + lib$es6$promise$$internal$$fulfill(promise, maybeThenable); + } else if (lib$es6$promise$utils$$isFunction(then)) { + lib$es6$promise$$internal$$handleForeignThenable(promise, maybeThenable, then); + } else { + lib$es6$promise$$internal$$fulfill(promise, maybeThenable); + } + } + } + + function lib$es6$promise$$internal$$resolve(promise, value) { + if (promise === value) { + lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$selfFullfillment()); + } else if (lib$es6$promise$utils$$objectOrFunction(value)) { + lib$es6$promise$$internal$$handleMaybeThenable(promise, value); + } else { + lib$es6$promise$$internal$$fulfill(promise, value); + } + } + + function lib$es6$promise$$internal$$publishRejection(promise) { + if (promise._onerror) { + promise._onerror(promise._result); + } + + lib$es6$promise$$internal$$publish(promise); + } + + function lib$es6$promise$$internal$$fulfill(promise, value) { + if (promise._state !== lib$es6$promise$$internal$$PENDING) { return; } + + promise._result = value; + promise._state = lib$es6$promise$$internal$$FULFILLED; + + if (promise._subscribers.length !== 0) { + lib$es6$promise$asap$$default(lib$es6$promise$$internal$$publish, promise); + } + } + + function lib$es6$promise$$internal$$reject(promise, reason) { + if (promise._state !== lib$es6$promise$$internal$$PENDING) { return; } + promise._state = lib$es6$promise$$internal$$REJECTED; + promise._result = reason; + + lib$es6$promise$asap$$default(lib$es6$promise$$internal$$publishRejection, promise); + } + + function lib$es6$promise$$internal$$subscribe(parent, child, onFulfillment, onRejection) { + var subscribers = parent._subscribers; + var length = subscribers.length; + + parent._onerror = null; + + subscribers[length] = child; + subscribers[length + lib$es6$promise$$internal$$FULFILLED] = onFulfillment; + subscribers[length + lib$es6$promise$$internal$$REJECTED] = onRejection; + + if (length === 0 && parent._state) { + lib$es6$promise$asap$$default(lib$es6$promise$$internal$$publish, parent); + } + } + + function lib$es6$promise$$internal$$publish(promise) { + var subscribers = promise._subscribers; + var settled = promise._state; + + if (subscribers.length === 0) { return; } + + var child, callback, detail = promise._result; + + for (var i = 0; i < subscribers.length; i += 3) { + child = subscribers[i]; + callback = subscribers[i + settled]; + + if (child) { + lib$es6$promise$$internal$$invokeCallback(settled, child, callback, detail); + } else { + callback(detail); + } + } + + promise._subscribers.length = 0; + } + + function lib$es6$promise$$internal$$ErrorObject() { + this.error = null; + } + + var lib$es6$promise$$internal$$TRY_CATCH_ERROR = new lib$es6$promise$$internal$$ErrorObject(); + + function lib$es6$promise$$internal$$tryCatch(callback, detail) { + try { + return callback(detail); + } catch(e) { + lib$es6$promise$$internal$$TRY_CATCH_ERROR.error = e; + return lib$es6$promise$$internal$$TRY_CATCH_ERROR; + } + } + + function lib$es6$promise$$internal$$invokeCallback(settled, promise, callback, detail) { + var hasCallback = lib$es6$promise$utils$$isFunction(callback), + value, error, succeeded, failed; + + if (hasCallback) { + value = lib$es6$promise$$internal$$tryCatch(callback, detail); + + if (value === lib$es6$promise$$internal$$TRY_CATCH_ERROR) { + failed = true; + error = value.error; + value = null; + } else { + succeeded = true; + } + + if (promise === value) { + lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$cannotReturnOwn()); + return; + } + + } else { + value = detail; + succeeded = true; + } + + if (promise._state !== lib$es6$promise$$internal$$PENDING) { + // noop + } else if (hasCallback && succeeded) { + lib$es6$promise$$internal$$resolve(promise, value); + } else if (failed) { + lib$es6$promise$$internal$$reject(promise, error); + } else if (settled === lib$es6$promise$$internal$$FULFILLED) { + lib$es6$promise$$internal$$fulfill(promise, value); + } else if (settled === lib$es6$promise$$internal$$REJECTED) { + lib$es6$promise$$internal$$reject(promise, value); + } + } + + function lib$es6$promise$$internal$$initializePromise(promise, resolver) { + try { + resolver(function resolvePromise(value){ + lib$es6$promise$$internal$$resolve(promise, value); + }, function rejectPromise(reason) { + lib$es6$promise$$internal$$reject(promise, reason); + }); + } catch(e) { + lib$es6$promise$$internal$$reject(promise, e); + } + } + + function lib$es6$promise$enumerator$$Enumerator(Constructor, input) { + var enumerator = this; + + enumerator._instanceConstructor = Constructor; + enumerator.promise = new Constructor(lib$es6$promise$$internal$$noop); + + if (enumerator._validateInput(input)) { + enumerator._input = input; + enumerator.length = input.length; + enumerator._remaining = input.length; + + enumerator._init(); + + if (enumerator.length === 0) { + lib$es6$promise$$internal$$fulfill(enumerator.promise, enumerator._result); + } else { + enumerator.length = enumerator.length || 0; + enumerator._enumerate(); + if (enumerator._remaining === 0) { + lib$es6$promise$$internal$$fulfill(enumerator.promise, enumerator._result); + } + } + } else { + lib$es6$promise$$internal$$reject(enumerator.promise, enumerator._validationError()); + } + } + + lib$es6$promise$enumerator$$Enumerator.prototype._validateInput = function(input) { + return lib$es6$promise$utils$$isArray(input); + }; + + lib$es6$promise$enumerator$$Enumerator.prototype._validationError = function() { + return new Error('Array Methods must be provided an Array'); + }; + + lib$es6$promise$enumerator$$Enumerator.prototype._init = function() { + this._result = new Array(this.length); + }; + + var lib$es6$promise$enumerator$$default = lib$es6$promise$enumerator$$Enumerator; + + lib$es6$promise$enumerator$$Enumerator.prototype._enumerate = function() { + var enumerator = this; + + var length = enumerator.length; + var promise = enumerator.promise; + var input = enumerator._input; + + for (var i = 0; promise._state === lib$es6$promise$$internal$$PENDING && i < length; i++) { + enumerator._eachEntry(input[i], i); + } + }; + + lib$es6$promise$enumerator$$Enumerator.prototype._eachEntry = function(entry, i) { + var enumerator = this; + var c = enumerator._instanceConstructor; + + if (lib$es6$promise$utils$$isMaybeThenable(entry)) { + if (entry.constructor === c && entry._state !== lib$es6$promise$$internal$$PENDING) { + entry._onerror = null; + enumerator._settledAt(entry._state, i, entry._result); + } else { + enumerator._willSettleAt(c.resolve(entry), i); + } + } else { + enumerator._remaining--; + enumerator._result[i] = entry; + } + }; + + lib$es6$promise$enumerator$$Enumerator.prototype._settledAt = function(state, i, value) { + var enumerator = this; + var promise = enumerator.promise; + + if (promise._state === lib$es6$promise$$internal$$PENDING) { + enumerator._remaining--; + + if (state === lib$es6$promise$$internal$$REJECTED) { + lib$es6$promise$$internal$$reject(promise, value); + } else { + enumerator._result[i] = value; + } + } + + if (enumerator._remaining === 0) { + lib$es6$promise$$internal$$fulfill(promise, enumerator._result); + } + }; + + lib$es6$promise$enumerator$$Enumerator.prototype._willSettleAt = function(promise, i) { + var enumerator = this; + + lib$es6$promise$$internal$$subscribe(promise, undefined, function(value) { + enumerator._settledAt(lib$es6$promise$$internal$$FULFILLED, i, value); + }, function(reason) { + enumerator._settledAt(lib$es6$promise$$internal$$REJECTED, i, reason); + }); + }; + function lib$es6$promise$promise$all$$all(entries) { + return new lib$es6$promise$enumerator$$default(this, entries).promise; + } + var lib$es6$promise$promise$all$$default = lib$es6$promise$promise$all$$all; + function lib$es6$promise$promise$race$$race(entries) { + /*jshint validthis:true */ + var Constructor = this; + + var promise = new Constructor(lib$es6$promise$$internal$$noop); + + if (!lib$es6$promise$utils$$isArray(entries)) { + lib$es6$promise$$internal$$reject(promise, new TypeError('You must pass an array to race.')); + return promise; + } + + var length = entries.length; + + function onFulfillment(value) { + lib$es6$promise$$internal$$resolve(promise, value); + } + + function onRejection(reason) { + lib$es6$promise$$internal$$reject(promise, reason); + } + + for (var i = 0; promise._state === lib$es6$promise$$internal$$PENDING && i < length; i++) { + lib$es6$promise$$internal$$subscribe(Constructor.resolve(entries[i]), undefined, onFulfillment, onRejection); + } + + return promise; + } + var lib$es6$promise$promise$race$$default = lib$es6$promise$promise$race$$race; + function lib$es6$promise$promise$resolve$$resolve(object) { + /*jshint validthis:true */ + var Constructor = this; + + if (object && typeof object === 'object' && object.constructor === Constructor) { + return object; + } + + var promise = new Constructor(lib$es6$promise$$internal$$noop); + lib$es6$promise$$internal$$resolve(promise, object); + return promise; + } + var lib$es6$promise$promise$resolve$$default = lib$es6$promise$promise$resolve$$resolve; + function lib$es6$promise$promise$reject$$reject(reason) { + /*jshint validthis:true */ + var Constructor = this; + var promise = new Constructor(lib$es6$promise$$internal$$noop); + lib$es6$promise$$internal$$reject(promise, reason); + return promise; + } + var lib$es6$promise$promise$reject$$default = lib$es6$promise$promise$reject$$reject; + + var lib$es6$promise$promise$$counter = 0; + + function lib$es6$promise$promise$$needsResolver() { + throw new TypeError('You must pass a resolver function as the first argument to the promise constructor'); + } + + function lib$es6$promise$promise$$needsNew() { + throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function."); + } + + var lib$es6$promise$promise$$default = lib$es6$promise$promise$$Promise; + /** + Promise objects represent the eventual result of an asynchronous operation. The + primary way of interacting with a promise is through its `then` method, which + registers callbacks to receive either a promise’s eventual value or the reason + why the promise cannot be fulfilled. + + Terminology + ----------- + + - `promise` is an object or function with a `then` method whose behavior conforms to this specification. + - `thenable` is an object or function that defines a `then` method. + - `value` is any legal JavaScript value (including undefined, a thenable, or a promise). + - `exception` is a value that is thrown using the throw statement. + - `reason` is a value that indicates why a promise was rejected. + - `settled` the final resting state of a promise, fulfilled or rejected. + + A promise can be in one of three states: pending, fulfilled, or rejected. + + Promises that are fulfilled have a fulfillment value and are in the fulfilled + state. Promises that are rejected have a rejection reason and are in the + rejected state. A fulfillment value is never a thenable. + + Promises can also be said to *resolve* a value. If this value is also a + promise, then the original promise's settled state will match the value's + settled state. So a promise that *resolves* a promise that rejects will + itself reject, and a promise that *resolves* a promise that fulfills will + itself fulfill. + + + Basic Usage: + ------------ + + ```js + var promise = new Promise(function(resolve, reject) { + // on success + resolve(value); + + // on failure + reject(reason); + }); + + promise.then(function(value) { + // on fulfillment + }, function(reason) { + // on rejection + }); + ``` + + Advanced Usage: + --------------- + + Promises shine when abstracting away asynchronous interactions such as + `XMLHttpRequest`s. + + ```js + function getJSON(url) { + return new Promise(function(resolve, reject){ + var xhr = new XMLHttpRequest(); + + xhr.open('GET', url); + xhr.onreadystatechange = handler; + xhr.responseType = 'json'; + xhr.setRequestHeader('Accept', 'application/json'); + xhr.send(); + + function handler() { + if (this.readyState === this.DONE) { + if (this.status === 200) { + resolve(this.response); + } else { + reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']')); + } + } + }; + }); + } + + getJSON('/posts.json').then(function(json) { + // on fulfillment + }, function(reason) { + // on rejection + }); + ``` + + Unlike callbacks, promises are great composable primitives. + + ```js + Promise.all([ + getJSON('/posts'), + getJSON('/comments') + ]).then(function(values){ + values[0] // => postsJSON + values[1] // => commentsJSON + + return values; + }); + ``` + + @class Promise + @param {function} resolver + Useful for tooling. + @constructor + */ + function lib$es6$promise$promise$$Promise(resolver) { + this._id = lib$es6$promise$promise$$counter++; + this._state = undefined; + this._result = undefined; + this._subscribers = []; + + if (lib$es6$promise$$internal$$noop !== resolver) { + if (!lib$es6$promise$utils$$isFunction(resolver)) { + lib$es6$promise$promise$$needsResolver(); + } + + if (!(this instanceof lib$es6$promise$promise$$Promise)) { + lib$es6$promise$promise$$needsNew(); + } + + lib$es6$promise$$internal$$initializePromise(this, resolver); + } + } + + lib$es6$promise$promise$$Promise.all = lib$es6$promise$promise$all$$default; + lib$es6$promise$promise$$Promise.race = lib$es6$promise$promise$race$$default; + lib$es6$promise$promise$$Promise.resolve = lib$es6$promise$promise$resolve$$default; + lib$es6$promise$promise$$Promise.reject = lib$es6$promise$promise$reject$$default; + lib$es6$promise$promise$$Promise._setScheduler = lib$es6$promise$asap$$setScheduler; + lib$es6$promise$promise$$Promise._asap = lib$es6$promise$asap$$default; + + lib$es6$promise$promise$$Promise.prototype = { + constructor: lib$es6$promise$promise$$Promise, + + /** + The primary way of interacting with a promise is through its `then` method, + which registers callbacks to receive either a promise's eventual value or the + reason why the promise cannot be fulfilled. + + ```js + findUser().then(function(user){ + // user is available + }, function(reason){ + // user is unavailable, and you are given the reason why + }); + ``` + + Chaining + -------- + + The return value of `then` is itself a promise. This second, 'downstream' + promise is resolved with the return value of the first promise's fulfillment + or rejection handler, or rejected if the handler throws an exception. + + ```js + findUser().then(function (user) { + return user.name; + }, function (reason) { + return 'default name'; + }).then(function (userName) { + // If `findUser` fulfilled, `userName` will be the user's name, otherwise it + // will be `'default name'` + }); + + findUser().then(function (user) { + throw new Error('Found user, but still unhappy'); + }, function (reason) { + throw new Error('`findUser` rejected and we're unhappy'); + }).then(function (value) { + // never reached + }, function (reason) { + // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'. + // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'. + }); + ``` + If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream. + + ```js + findUser().then(function (user) { + throw new PedagogicalException('Upstream error'); + }).then(function (value) { + // never reached + }).then(function (value) { + // never reached + }, function (reason) { + // The `PedgagocialException` is propagated all the way down to here + }); + ``` + + Assimilation + ------------ + + Sometimes the value you want to propagate to a downstream promise can only be + retrieved asynchronously. This can be achieved by returning a promise in the + fulfillment or rejection handler. The downstream promise will then be pending + until the returned promise is settled. This is called *assimilation*. + + ```js + findUser().then(function (user) { + return findCommentsByAuthor(user); + }).then(function (comments) { + // The user's comments are now available + }); + ``` + + If the assimliated promise rejects, then the downstream promise will also reject. + + ```js + findUser().then(function (user) { + return findCommentsByAuthor(user); + }).then(function (comments) { + // If `findCommentsByAuthor` fulfills, we'll have the value here + }, function (reason) { + // If `findCommentsByAuthor` rejects, we'll have the reason here + }); + ``` + + Simple Example + -------------- + + Synchronous Example + + ```javascript + var result; + + try { + result = findResult(); + // success + } catch(reason) { + // failure + } + ``` + + Errback Example + + ```js + findResult(function(result, err){ + if (err) { + // failure + } else { + // success + } + }); + ``` + + Promise Example; + + ```javascript + findResult().then(function(result){ + // success + }, function(reason){ + // failure + }); + ``` + + Advanced Example + -------------- + + Synchronous Example + + ```javascript + var author, books; + + try { + author = findAuthor(); + books = findBooksByAuthor(author); + // success + } catch(reason) { + // failure + } + ``` + + Errback Example + + ```js + + function foundBooks(books) { + + } + + function failure(reason) { + + } + + findAuthor(function(author, err){ + if (err) { + failure(err); + // failure + } else { + try { + findBoooksByAuthor(author, function(books, err) { + if (err) { + failure(err); + } else { + try { + foundBooks(books); + } catch(reason) { + failure(reason); + } + } + }); + } catch(error) { + failure(err); + } + // success + } + }); + ``` + + Promise Example; + + ```javascript + findAuthor(). + then(findBooksByAuthor). + then(function(books){ + // found books + }).catch(function(reason){ + // something went wrong + }); + ``` + + @method then + @param {Function} onFulfilled + @param {Function} onRejected + Useful for tooling. + @return {Promise} + */ + then: function(onFulfillment, onRejection) { + var parent = this; + var state = parent._state; + + if (state === lib$es6$promise$$internal$$FULFILLED && !onFulfillment || state === lib$es6$promise$$internal$$REJECTED && !onRejection) { + return this; + } + + var child = new this.constructor(lib$es6$promise$$internal$$noop); + var result = parent._result; + + if (state) { + var callback = arguments[state - 1]; + lib$es6$promise$asap$$default(function(){ + lib$es6$promise$$internal$$invokeCallback(state, child, callback, result); + }); + } else { + lib$es6$promise$$internal$$subscribe(parent, child, onFulfillment, onRejection); + } + + return child; + }, + + /** + `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same + as the catch block of a try/catch statement. + + ```js + function findAuthor(){ + throw new Error('couldn't find that author'); + } + + // synchronous + try { + findAuthor(); + } catch(reason) { + // something went wrong + } + + // async with promises + findAuthor().catch(function(reason){ + // something went wrong + }); + ``` + + @method catch + @param {Function} onRejection + Useful for tooling. + @return {Promise} + */ + 'catch': function(onRejection) { + return this.then(null, onRejection); + } + }; + function lib$es6$promise$polyfill$$polyfill() { + var local; + + if (typeof global !== 'undefined') { + local = global; + } else if (typeof self !== 'undefined') { + local = self; + } else { + try { + local = Function('return this')(); + } catch (e) { + throw new Error('polyfill failed because global object is unavailable in this environment'); + } + } + + var P = local.Promise; + + if (P && Object.prototype.toString.call(P.resolve()) === '[object Promise]' && !P.cast) { + return; + } + + local.Promise = lib$es6$promise$promise$$default; + } + var lib$es6$promise$polyfill$$default = lib$es6$promise$polyfill$$polyfill; + + var lib$es6$promise$umd$$ES6Promise = { + 'Promise': lib$es6$promise$promise$$default, + 'polyfill': lib$es6$promise$polyfill$$default + }; + + /* global define:true module:true window: true */ + if ("function" === 'function' && __webpack_require__(8)['amd']) { + !(__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__)); + } else if (typeof module !== 'undefined' && module['exports']) { + module['exports'] = lib$es6$promise$umd$$ES6Promise; + } else if (typeof this !== 'undefined') { + this['ES6Promise'] = lib$es6$promise$umd$$ES6Promise; + } + + lib$es6$promise$polyfill$$default(); +}).call(this); + + +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(5).setImmediate, (function() { return this; }()), __webpack_require__(7)(module))) + +/***/ }, +/* 5 */ +/***/ function(module, exports, __webpack_require__) { + +/* WEBPACK VAR INJECTION */(function(setImmediate, clearImmediate) {var nextTick = __webpack_require__(6).nextTick; +var apply = Function.prototype.apply; +var slice = Array.prototype.slice; +var immediateIds = {}; +var nextImmediateId = 0; + +// DOM APIs, for completeness + +exports.setTimeout = function() { + return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout); +}; +exports.setInterval = function() { + return new Timeout(apply.call(setInterval, window, arguments), clearInterval); +}; +exports.clearTimeout = +exports.clearInterval = function(timeout) { timeout.close(); }; + +function Timeout(id, clearFn) { + this._id = id; + this._clearFn = clearFn; +} +Timeout.prototype.unref = Timeout.prototype.ref = function() {}; +Timeout.prototype.close = function() { + this._clearFn.call(window, this._id); +}; + +// Does not start the time, just sets up the members needed. +exports.enroll = function(item, msecs) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = msecs; +}; + +exports.unenroll = function(item) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = -1; +}; + +exports._unrefActive = exports.active = function(item) { + clearTimeout(item._idleTimeoutId); + + var msecs = item._idleTimeout; + if (msecs >= 0) { + item._idleTimeoutId = setTimeout(function onTimeout() { + if (item._onTimeout) + item._onTimeout(); + }, msecs); + } +}; + +// That's not how node.js implements it but the exposed api is the same. +exports.setImmediate = typeof setImmediate === "function" ? setImmediate : function(fn) { + var id = nextImmediateId++; + var args = arguments.length < 2 ? false : slice.call(arguments, 1); + + immediateIds[id] = true; + + nextTick(function onNextTick() { + if (immediateIds[id]) { + // fn.call() is faster so we optimize for the common use-case + // @see http://jsperf.com/call-apply-segu + if (args) { + fn.apply(null, args); + } else { + fn.call(null); + } + // Prevent ids from leaking + exports.clearImmediate(id); + } + }); + + return id; +}; + +exports.clearImmediate = typeof clearImmediate === "function" ? clearImmediate : function(id) { + delete immediateIds[id]; +}; +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(5).setImmediate, __webpack_require__(5).clearImmediate)) + +/***/ }, +/* 6 */ +/***/ function(module, exports) { + +// shim for using process in browser + +var process = module.exports = {}; +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = setTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + clearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + setTimeout(drainQueue, 0); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + + +/***/ }, +/* 7 */ +/***/ function(module, exports) { + +module.exports = function(module) { + if(!module.webpackPolyfill) { + module.deprecate = function() {}; + module.paths = []; + // module.parent = undefined by default + module.children = []; + module.webpackPolyfill = 1; + } + return module; +} + + +/***/ }, +/* 8 */ +/***/ function(module, exports) { + +module.exports = function() { throw new Error("define cannot be used indirect"); }; + + +/***/ }, +/* 9 */ +/***/ function(module, exports) { + +(function() { + 'use strict'; + + if (self.fetch) { + return + } + + function normalizeName(name) { + if (typeof name !== 'string') { + name = String(name) + } + if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) { + throw new TypeError('Invalid character in header field name') + } + return name.toLowerCase() + } + + function normalizeValue(value) { + if (typeof value !== 'string') { + value = String(value) + } + return value + } + + function Headers(headers) { + this.map = {} + + if (headers instanceof Headers) { + headers.forEach(function(value, name) { + this.append(name, value) + }, this) + + } else if (headers) { + Object.getOwnPropertyNames(headers).forEach(function(name) { + this.append(name, headers[name]) + }, this) + } + } + + Headers.prototype.append = function(name, value) { + name = normalizeName(name) + value = normalizeValue(value) + var list = this.map[name] + if (!list) { + list = [] + this.map[name] = list + } + list.push(value) + } + + Headers.prototype['delete'] = function(name) { + delete this.map[normalizeName(name)] + } + + Headers.prototype.get = function(name) { + var values = this.map[normalizeName(name)] + return values ? values[0] : null + } + + Headers.prototype.getAll = function(name) { + return this.map[normalizeName(name)] || [] + } + + Headers.prototype.has = function(name) { + return this.map.hasOwnProperty(normalizeName(name)) + } + + Headers.prototype.set = function(name, value) { + this.map[normalizeName(name)] = [normalizeValue(value)] + } + + Headers.prototype.forEach = function(callback, thisArg) { + Object.getOwnPropertyNames(this.map).forEach(function(name) { + this.map[name].forEach(function(value) { + callback.call(thisArg, value, name, this) + }, this) + }, this) + } + + function consumed(body) { + if (body.bodyUsed) { + return Promise.reject(new TypeError('Already read')) + } + body.bodyUsed = true + } + + function fileReaderReady(reader) { + return new Promise(function(resolve, reject) { + reader.onload = function() { + resolve(reader.result) + } + reader.onerror = function() { + reject(reader.error) + } + }) + } + + function readBlobAsArrayBuffer(blob) { + var reader = new FileReader() + reader.readAsArrayBuffer(blob) + return fileReaderReady(reader) + } + + function readBlobAsText(blob) { + var reader = new FileReader() + reader.readAsText(blob) + return fileReaderReady(reader) + } + + var support = { + blob: 'FileReader' in self && 'Blob' in self && (function() { + try { + new Blob(); + return true + } catch(e) { + return false + } + })(), + formData: 'FormData' in self + } + + function Body() { + this.bodyUsed = false + + + this._initBody = function(body) { + this._bodyInit = body + if (typeof body === 'string') { + this._bodyText = body + } else if (support.blob && Blob.prototype.isPrototypeOf(body)) { + this._bodyBlob = body + } else if (support.formData && FormData.prototype.isPrototypeOf(body)) { + this._bodyFormData = body + } else if (!body) { + this._bodyText = '' + } else { + throw new Error('unsupported BodyInit type') + } + } + + if (support.blob) { + this.blob = function() { + var rejected = consumed(this) + if (rejected) { + return rejected + } + + if (this._bodyBlob) { + return Promise.resolve(this._bodyBlob) + } else if (this._bodyFormData) { + throw new Error('could not read FormData body as blob') + } else { + return Promise.resolve(new Blob([this._bodyText])) + } + } + + this.arrayBuffer = function() { + return this.blob().then(readBlobAsArrayBuffer) + } + + this.text = function() { + var rejected = consumed(this) + if (rejected) { + return rejected + } + + if (this._bodyBlob) { + return readBlobAsText(this._bodyBlob) + } else if (this._bodyFormData) { + throw new Error('could not read FormData body as text') + } else { + return Promise.resolve(this._bodyText) + } + } + } else { + this.text = function() { + var rejected = consumed(this) + return rejected ? rejected : Promise.resolve(this._bodyText) + } + } + + if (support.formData) { + this.formData = function() { + return this.text().then(decode) + } + } + + this.json = function() { + return this.text().then(JSON.parse) + } + + return this + } + + // HTTP methods whose capitalization should be normalized + var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'] + + function normalizeMethod(method) { + var upcased = method.toUpperCase() + return (methods.indexOf(upcased) > -1) ? upcased : method + } + + function Request(input, options) { + options = options || {} + var body = options.body + if (Request.prototype.isPrototypeOf(input)) { + if (input.bodyUsed) { + throw new TypeError('Already read') + } + this.url = input.url + this.credentials = input.credentials + if (!options.headers) { + this.headers = new Headers(input.headers) + } + this.method = input.method + this.mode = input.mode + if (!body) { + body = input._bodyInit + input.bodyUsed = true + } + } else { + this.url = input + } + + this.credentials = options.credentials || this.credentials || 'omit' + if (options.headers || !this.headers) { + this.headers = new Headers(options.headers) + } + this.method = normalizeMethod(options.method || this.method || 'GET') + this.mode = options.mode || this.mode || null + this.referrer = null + + if ((this.method === 'GET' || this.method === 'HEAD') && body) { + throw new TypeError('Body not allowed for GET or HEAD requests') + } + this._initBody(body) + } + + function decode(body) { + var form = new FormData() + body.trim().split('&').forEach(function(bytes) { + if (bytes) { + var split = bytes.split('=') + var name = split.shift().replace(/\+/g, ' ') + var value = split.join('=').replace(/\+/g, ' ') + form.append(decodeURIComponent(name), decodeURIComponent(value)) + } + }) + return form + } + + function headers(xhr) { + var head = new Headers() + var pairs = xhr.getAllResponseHeaders().trim().split('\n') + pairs.forEach(function(header) { + var split = header.trim().split(':') + var key = split.shift().trim() + var value = split.join(':').trim() + head.append(key, value) + }) + return head + } + + Body.call(Request.prototype) + + function Response(bodyInit, options) { + if (!options) { + options = {} + } + + this._initBody(bodyInit) + this.type = 'default' + this.url = null + this.status = options.status + this.ok = this.status >= 200 && this.status < 300 + this.statusText = options.statusText + this.headers = options.headers instanceof Headers ? options.headers : new Headers(options.headers) + this.url = options.url || '' + } + + Body.call(Response.prototype) + + self.Headers = Headers; + self.Request = Request; + self.Response = Response; + + self.fetch = function(input, init) { + var request + if (Request.prototype.isPrototypeOf(input) && !init) { + request = input + } else { + request = new Request(input, init) + } + + return new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest() + + function responseURL() { + if ('responseURL' in xhr) { + return xhr.responseURL + } + + // Avoid security warnings on getResponseHeader when not allowed by CORS + if (/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())) { + return xhr.getResponseHeader('X-Request-URL') + } + + return; + } + + xhr.onload = function() { + var status = (xhr.status === 1223) ? 204 : xhr.status + if (status < 100 || status > 599) { + reject(new TypeError('Network request failed')) + return + } + var options = { + status: status, + statusText: xhr.statusText, + headers: headers(xhr), + url: responseURL() + } + var body = 'response' in xhr ? xhr.response : xhr.responseText; + resolve(new Response(body, options)) + } + + xhr.onerror = function() { + reject(new TypeError('Network request failed')) + } + + xhr.open(request.method, request.url, true) + + if (request.credentials === 'include') { + xhr.withCredentials = true + } + + if ('responseType' in xhr && support.blob) { + xhr.responseType = 'blob' + } + + request.headers.forEach(function(value, name) { + xhr.setRequestHeader(name, value) + }) + + xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit) + }) + } + self.fetch.polyfill = true +})(); + + +/***/ }, +/* 10 */ +/***/ function(module, exports, __webpack_require__) { + +/* WEBPACK VAR INJECTION */(function(module) {// Version: 3.7.14 +/* =-====================================================================-= */ +/* =-====================================================================-= */ +/* =-========================= JSON =============================-= */ +/* =-====================================================================-= */ +/* =-====================================================================-= */ + +(window['JSON'] && window['JSON']['stringify']) || (function () { + window['JSON'] || (window['JSON'] = {}); + + function toJSON(key) { + try { return this.valueOf() } + catch(e) { return null } + } + + 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 = { // table of character substitutions + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }, + rep; + + function quote(string) { + escapable.lastIndex = 0; + return escapable.test(string) ? + '"' + string.replace(escapable, function (a) { + var c = meta[a]; + return typeof c === 'string' ? c : + '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }) + '"' : + '"' + string + '"'; + } + + function str(key, holder) { + var i, // The loop counter. + k, // The member key. + v, // The member value. + length, + partial, + mind = gap, + value = holder[key]; + + if (value && typeof value === 'object') { + value = toJSON.call( value, key ); + } + + if (typeof rep === 'function') { + value = rep.call(holder, key, value); + } + + switch (typeof value) { + case 'string': + return quote(value); + + case 'number': + return isFinite(value) ? String(value) : 'null'; + + case 'boolean': + case 'null': + return String(value); + + case 'object': + + if (!value) { + return 'null'; + } + + gap += indent; + partial = []; + + if (Object.prototype.toString.apply(value) === '[object Array]') { + + length = value.length; + for (i = 0; i < length; i += 1) { + partial[i] = str(i, value) || 'null'; + } + + v = partial.length === 0 ? '[]' : + gap ? '[\n' + gap + + partial.join(',\n' + gap) + '\n' + + mind + ']' : + '[' + partial.join(',') + ']'; + gap = mind; + return v; + } + if (rep && typeof rep === 'object') { + length = rep.length; + for (i = 0; i < length; i += 1) { + k = rep[i]; + if (typeof k === 'string') { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } else { + for (k in value) { + if (Object.hasOwnProperty.call(value, k)) { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } + + v = partial.length === 0 ? '{}' : + gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + + mind + '}' : '{' + partial.join(',') + '}'; + gap = mind; + return v; + } + } + + if (typeof JSON['stringify'] !== 'function') { + JSON['stringify'] = function (value, replacer, space) { + var i; + gap = ''; + indent = ''; + + if (typeof space === 'number') { + for (i = 0; i < space; i += 1) { + indent += ' '; + } + } else if (typeof space === 'string') { + indent = space; + } + rep = replacer; + if (replacer && typeof replacer !== 'function' && + (typeof replacer !== 'object' || + typeof replacer.length !== 'number')) { + throw new Error('JSON.stringify'); + } + return str('', {'': value}); + }; + } + + if (typeof JSON['parse'] !== 'function') { + // JSON is parsed on the server for security. + JSON['parse'] = function (text) {return eval('('+text+')')}; + } +}()); +var NOW = 1 +, READY = false +, READY_BUFFER = [] +, PRESENCE_SUFFIX = '-pnpres' +, DEF_WINDOWING = 10 // MILLISECONDS. +, DEF_TIMEOUT = 10000 // MILLISECONDS. +, DEF_SUB_TIMEOUT = 310 // SECONDS. +, DEF_KEEPALIVE = 60 // SECONDS (FOR TIMESYNC). +, SECOND = 1000 // A THOUSAND MILLISECONDS. +, URLBIT = '/' +, PARAMSBIT = '&' +, PRESENCE_HB_THRESHOLD = 5 +, PRESENCE_HB_DEFAULT = 30 +, SDK_VER = '3.7.14' +, REPL = /{([\w\-]+)}/g; + +/** + * UTILITIES + */ +function unique() { return'x'+ ++NOW+''+(+new Date) } +function rnow() { return+new Date } + +/** + * NEXTORIGIN + * ========== + * var next_origin = nextorigin(); + */ +var nextorigin = (function() { + var max = 20 + , ori = Math.floor(Math.random() * max); + return function( origin, failover ) { + return origin.indexOf('pubsub.') > 0 + && origin.replace( + 'pubsub', 'ps' + ( + failover ? generate_uuid().split('-')[0] : + (++ori < max? ori : ori=1) + ) ) || origin; + } +})(); + + +/** + * Build Url + * ======= + * + */ +function build_url( url_components, url_params ) { + var url = url_components.join(URLBIT) + , params = []; + + if (!url_params) return url; + + each( url_params, function( key, value ) { + var value_str = (typeof value == 'object')?JSON['stringify'](value):value; + (typeof value != 'undefined' && + value != null && encode(value_str).length > 0 + ) && params.push(key + "=" + encode(value_str)); + } ); + + url += "?" + params.join(PARAMSBIT); + return url; +} + +/** + * UPDATER + * ======= + * var timestamp = unique(); + */ +function updater( fun, rate ) { + var timeout + , last = 0 + , runnit = function() { + if (last + rate > rnow()) { + clearTimeout(timeout); + timeout = setTimeout( runnit, rate ); + } + else { + last = rnow(); + fun(); + } + }; + + return runnit; +} + +/** + * GREP + * ==== + * var list = grep( [1,2,3], function(item) { return item % 2 } ) + */ +function grep( list, fun ) { + var fin = []; + each( list || [], function(l) { fun(l) && fin.push(l) } ); + return fin +} + +/** + * SUPPLANT + * ======== + * var text = supplant( 'Hello {name}!', { name : 'John' } ) + */ +function supplant( str, values ) { + return str.replace( REPL, function( _, match ) { + return values[match] || _ + } ); +} + +/** + * timeout + * ======= + * timeout( function(){}, 100 ); + */ +function timeout( fun, wait ) { + return setTimeout( fun, wait ); +} + +/** + * uuid + * ==== + * var my_uuid = generate_uuid(); + */ +function generate_uuid(callback) { + var u = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, + function(c) { + var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); + return v.toString(16); + }); + if (callback) callback(u); + return u; +} + +function isArray(arg) { + return !!arg && typeof arg !== 'string' && (Array.isArray && Array.isArray(arg) || typeof(arg.length) === "number") + //return !!arg && (Array.isArray && Array.isArray(arg) || typeof(arg.length) === "number") +} + +/** + * EACH + * ==== + * each( [1,2,3], function(item) { } ) + */ +function each( o, f) { + if ( !o || !f ) return; + + if ( isArray(o) ) + for ( var i = 0, l = o.length; i < l; ) + f.call( o[i], o[i], i++ ); + else + for ( var i in o ) + o.hasOwnProperty && + o.hasOwnProperty(i) && + f.call( o[i], i, o[i] ); +} + +/** + * MAP + * === + * var list = map( [1,2,3], function(item) { return item + 1 } ) + */ +function map( list, fun ) { + var fin = []; + each( list || [], function( k, v ) { fin.push(fun( k, v )) } ); + return fin; +} + + +function pam_encode(str) { + return encodeURIComponent(str).replace(/[!'()*~]/g, function(c) { + return '%' + c.charCodeAt(0).toString(16).toUpperCase(); + }); +} + +/** + * ENCODE + * ====== + * var encoded_data = encode('path'); + */ +function encode(path) { return encodeURIComponent(path) } + +/** + * Generate Subscription Channel List + * ================================== + * generate_channel_list(channels_object); + */ +function generate_channel_list(channels, nopresence) { + var list = []; + each( channels, function( channel, status ) { + if (nopresence) { + if(channel.search('-pnpres') < 0) { + if (status.subscribed) list.push(channel); + } + } else { + if (status.subscribed) list.push(channel); + } + }); + return list.sort(); +} + +/** + * Generate Subscription Channel Groups List + * ================================== + * generate_channel_group_list(channels_groups object); + */ +function generate_channel_group_list(channel_groups, nopresence) { + var list = []; + each(channel_groups, function( channel_group, status ) { + if (nopresence) { + if(channel_group.search('-pnpres') < 0) { + if (status.subscribed) list.push(channel_group); + } + } else { + if (status.subscribed) list.push(channel_group); + } + }); + return list.sort(); +} + +// PUBNUB READY TO CONNECT +function ready() { timeout( function() { + if (READY) return; + READY = 1; + each( READY_BUFFER, function(connect) { connect() } ); +}, SECOND ); } + +function PNmessage(args) { + msg = args || {'apns' : {}}, + msg['getPubnubMessage'] = function() { + var m = {}; + + if (Object.keys(msg['apns']).length) { + m['pn_apns'] = { + 'aps' : { + 'alert' : msg['apns']['alert'] , + 'badge' : msg['apns']['badge'] + } + } + for (var k in msg['apns']) { + m['pn_apns'][k] = msg['apns'][k]; + } + var exclude1 = ['badge','alert']; + for (var k in exclude1) { + delete m['pn_apns'][exclude1[k]]; + } + } + + + + if (msg['gcm']) { + m['pn_gcm'] = { + 'data' : msg['gcm'] + } + } + + for (var k in msg) { + m[k] = msg[k]; + } + var exclude = ['apns','gcm','publish', 'channel','callback','error']; + for (var k in exclude) { + delete m[exclude[k]]; + } + + return m; + }; + msg['publish'] = function() { + + var m = msg.getPubnubMessage(); + + if (msg['pubnub'] && msg['channel']) { + msg['pubnub'].publish({ + 'message' : m, + 'channel' : msg['channel'], + 'callback' : msg['callback'], + 'error' : msg['error'] + }) + } + }; + return msg; +} + +function PN_API(setup) { + var SUB_WINDOWING = +setup['windowing'] || DEF_WINDOWING + , SUB_TIMEOUT = (+setup['timeout'] || DEF_SUB_TIMEOUT) * SECOND + , KEEPALIVE = (+setup['keepalive'] || DEF_KEEPALIVE) * SECOND + , TIME_CHECK = setup['timecheck'] || 0 + , NOLEAVE = setup['noleave'] || 0 + , PUBLISH_KEY = setup['publish_key'] + , SUBSCRIBE_KEY = setup['subscribe_key'] + , AUTH_KEY = setup['auth_key'] || '' + , SECRET_KEY = setup['secret_key'] || '' + , hmac_SHA256 = setup['hmac_SHA256'] + , SSL = setup['ssl'] ? 's' : '' + , ORIGIN = 'http'+SSL+'://'+(setup['origin']||'pubsub.pubnub.com') + , STD_ORIGIN = nextorigin(ORIGIN) + , SUB_ORIGIN = nextorigin(ORIGIN) + , CONNECT = function(){} + , PUB_QUEUE = [] + , CLOAK = true + , TIME_DRIFT = 0 + , SUB_CALLBACK = 0 + , SUB_CHANNEL = 0 + , SUB_RECEIVER = 0 + , SUB_RESTORE = setup['restore'] || 0 + , SUB_BUFF_WAIT = 0 + , TIMETOKEN = 0 + , RESUMED = false + , CHANNELS = {} + , CHANNEL_GROUPS = {} + , SUB_ERROR = function(){} + , STATE = {} + , PRESENCE_HB_TIMEOUT = null + , PRESENCE_HB = validate_presence_heartbeat( + setup['heartbeat'] || setup['pnexpires'] || 0, setup['error'] + ) + , PRESENCE_HB_INTERVAL = setup['heartbeat_interval'] || (PRESENCE_HB / 2) -1 + , PRESENCE_HB_RUNNING = false + , NO_WAIT_FOR_PENDING = setup['no_wait_for_pending'] + , COMPATIBLE_35 = setup['compatible_3.5'] || false + , xdr = setup['xdr'] + , params = setup['params'] || {} + , error = setup['error'] || function() {} + , _is_online = setup['_is_online'] || function() { return 1 } + , jsonp_cb = setup['jsonp_cb'] || function() { return 0 } + , db = setup['db'] || {'get': function(){}, 'set': function(){}} + , CIPHER_KEY = setup['cipher_key'] + , UUID = setup['uuid'] || ( !setup['unique_uuid'] && db && db['get'](SUBSCRIBE_KEY+'uuid') || '') + , USE_INSTANCEID = setup['instance_id'] || false + , INSTANCEID = '' + , shutdown = setup['shutdown'] + , use_send_beacon = (typeof setup['use_send_beacon'] != 'undefined')?setup['use_send_beacon']:true + , sendBeacon = (use_send_beacon)?setup['sendBeacon']:null + , _poll_timer + , _poll_timer2; + + if (PRESENCE_HB === 2) PRESENCE_HB_INTERVAL = 1; + + var crypto_obj = setup['crypto_obj'] || + { + 'encrypt' : function(a,key){ return a}, + 'decrypt' : function(b,key){return b} + }; + + function _get_url_params(data) { + if (!data) data = {}; + each( params , function( key, value ) { + if (!(key in data)) data[key] = value; + }); + return data; + } + + function _object_to_key_list(o) { + var l = [] + each( o , function( key, value ) { + l.push(key); + }); + return l; + } + function _object_to_key_list_sorted(o) { + return _object_to_key_list(o).sort(); + } + + function _get_pam_sign_input_from_params(params) { + var si = ""; + var l = _object_to_key_list_sorted(params); + + for (var i in l) { + var k = l[i] + si += k + "=" + pam_encode(params[k]) ; + if (i != l.length - 1) si += "&" + } + return si; + } + + function validate_presence_heartbeat(heartbeat, cur_heartbeat, error) { + var err = false; + + if (typeof heartbeat === 'undefined') { + return cur_heartbeat; + } + + if (typeof heartbeat === 'number') { + if (heartbeat > PRESENCE_HB_THRESHOLD || heartbeat == 0) + err = false; + else + err = true; + } else if(typeof heartbeat === 'boolean'){ + if (!heartbeat) { + return 0; + } else { + return PRESENCE_HB_DEFAULT; + } + } else { + err = true; + } + + if (err) { + error && error("Presence Heartbeat value invalid. Valid range ( x > " + PRESENCE_HB_THRESHOLD + " or x = 0). Current Value : " + (cur_heartbeat || PRESENCE_HB_THRESHOLD)); + return cur_heartbeat || PRESENCE_HB_THRESHOLD; + } else return heartbeat; + } + + function encrypt(input, key) { + return crypto_obj['encrypt'](input, key || CIPHER_KEY) || input; + } + function decrypt(input, key) { + return crypto_obj['decrypt'](input, key || CIPHER_KEY) || + crypto_obj['decrypt'](input, CIPHER_KEY) || + input; + } + + function error_common(message, callback) { + callback && callback({ 'error' : message || "error occurred"}); + error && error(message); + } + function _presence_heartbeat() { + + clearTimeout(PRESENCE_HB_TIMEOUT); + + if (!PRESENCE_HB_INTERVAL || PRESENCE_HB_INTERVAL >= 500 || + PRESENCE_HB_INTERVAL < 1 || + (!generate_channel_list(CHANNELS,true).length && !generate_channel_group_list(CHANNEL_GROUPS, true).length ) ) + { + PRESENCE_HB_RUNNING = false; + return; + } + + PRESENCE_HB_RUNNING = true; + SELF['presence_heartbeat']({ + 'callback' : function(r) { + PRESENCE_HB_TIMEOUT = timeout( _presence_heartbeat, (PRESENCE_HB_INTERVAL) * SECOND ); + }, + 'error' : function(e) { + error && error("Presence Heartbeat unable to reach Pubnub servers." + JSON.stringify(e)); + PRESENCE_HB_TIMEOUT = timeout( _presence_heartbeat, (PRESENCE_HB_INTERVAL) * SECOND ); + } + }); + } + + function start_presence_heartbeat() { + !PRESENCE_HB_RUNNING && _presence_heartbeat(); + } + + function publish(next) { + + if (NO_WAIT_FOR_PENDING) { + if (!PUB_QUEUE.length) return; + } else { + if (next) PUB_QUEUE.sending = 0; + if ( PUB_QUEUE.sending || !PUB_QUEUE.length ) return; + PUB_QUEUE.sending = 1; + } + + xdr(PUB_QUEUE.shift()); + } + function each_channel_group(callback) { + var count = 0; + + each( generate_channel_group_list(CHANNEL_GROUPS), function(channel_group) { + var chang = CHANNEL_GROUPS[channel_group]; + + if (!chang) return; + + count++; + (callback||function(){})(chang); + } ); + + return count; + } + + function each_channel(callback) { + var count = 0; + + each( generate_channel_list(CHANNELS), function(channel) { + var chan = CHANNELS[channel]; + + if (!chan) return; + + count++; + (callback||function(){})(chan); + } ); + + return count; + } + function _invoke_callback(response, callback, err) { + if (typeof response == 'object') { + if (response['error']) { + var callback_data = {}; + + if (response['message']) { + callback_data['message'] = response['message']; + } + + if (response['payload']) { + callback_data['payload'] = response['payload']; + } + + err && err(callback_data); + return; + + } + if (response['payload']) { + if (response['next_page']) + callback && callback(response['payload'], response['next_page']); + else + callback && callback(response['payload']); + return; + } + } + callback && callback(response); + } + + function _invoke_error(response,err) { + + if (typeof response == 'object' && response['error']) { + var callback_data = {}; + + if (response['message']) { + callback_data['message'] = response['message']; + } + + if (response['payload']) { + callback_data['payload'] = response['payload']; + } + + err && err(callback_data); + return; + } else { + err && err(response); + } + } + function CR(args, callback, url1, data) { + var callback = args['callback'] || callback + , err = args['error'] || error + , jsonp = jsonp_cb(); + + data = data || {}; + + if (!data['auth']) { + data['auth'] = args['auth_key'] || AUTH_KEY; + } + + var url = [ + STD_ORIGIN, 'v1', 'channel-registration', + 'sub-key', SUBSCRIBE_KEY + ]; + + url.push.apply(url,url1); + + if (jsonp) data['callback'] = jsonp; + + xdr({ + callback : jsonp, + data : _get_url_params(data), + success : function(response) { + _invoke_callback(response, callback, err); + }, + fail : function(response) { + _invoke_error(response, err); + }, + url : url + }); + + } + + // Announce Leave Event + var SELF = { + 'LEAVE' : function( channel, blocking, auth_key, callback, error ) { + + var data = { 'uuid' : UUID, 'auth' : auth_key || AUTH_KEY } + , origin = nextorigin(ORIGIN) + , callback = callback || function(){} + , err = error || function(){} + , url + , jsonp = jsonp_cb(); + + + + // Prevent Leaving a Presence Channel + if (channel.indexOf(PRESENCE_SUFFIX) > 0) return true; + + + + + if (COMPATIBLE_35) { + if (!SSL) return false; + if (jsonp == '0') return false; + } + + if (NOLEAVE) return false; + + if (jsonp != '0') data['callback'] = jsonp; + + if (USE_INSTANCEID) data['instanceid'] = INSTANCEID; + + url = [ + origin, 'v2', 'presence', 'sub_key', + SUBSCRIBE_KEY, 'channel', encode(channel), 'leave' + ]; + + params = _get_url_params(data); + + + if (sendBeacon) { + url_string = build_url(url, params); + if (sendBeacon(url_string)) { + callback && callback({"status": 200, "action": "leave", "message": "OK", "service": "Presence"}); + return true; + } + } + + + xdr({ + blocking : blocking || SSL, + timeout : 2000, + callback : jsonp, + data : params, + success : function(response) { + _invoke_callback(response, callback, err); + }, + fail : function(response) { + _invoke_error(response, err); + }, + url : url + }); + return true; + }, + 'LEAVE_GROUP' : function( channel_group, blocking, auth_key, callback, error ) { + + var data = { 'uuid' : UUID, 'auth' : auth_key || AUTH_KEY } + , origin = nextorigin(ORIGIN) + , callback = callback || function(){} + , err = error || function(){} + , jsonp = jsonp_cb(); + + // Prevent Leaving a Presence Channel Group + if (channel_group.indexOf(PRESENCE_SUFFIX) > 0) return true; + + if (COMPATIBLE_35) { + if (!SSL) return false; + if (jsonp == '0') return false; + } + + if (NOLEAVE) return false; + + if (jsonp != '0') data['callback'] = jsonp; + + if (channel_group && channel_group.length > 0) data['channel-group'] = channel_group; + + if (USE_INSTANCEID) data['instanceid'] = INSTANCEID; + + xdr({ + blocking : blocking || SSL, + timeout : 5000, + callback : jsonp, + data : _get_url_params(data), + success : function(response) { + _invoke_callback(response, callback, err); + }, + fail : function(response) { + _invoke_error(response, err); + }, + url : [ + origin, 'v2', 'presence', 'sub_key', + SUBSCRIBE_KEY, 'channel', encode(','), 'leave' + ] + }); + return true; + }, + 'set_resumed' : function(resumed) { + RESUMED = resumed; + }, + 'get_cipher_key' : function() { + return CIPHER_KEY; + }, + 'set_cipher_key' : function(key) { + CIPHER_KEY = key; + }, + 'raw_encrypt' : function(input, key) { + return encrypt(input, key); + }, + 'raw_decrypt' : function(input, key) { + return decrypt(input, key); + }, + 'get_heartbeat' : function() { + return PRESENCE_HB; + }, + + 'set_heartbeat' : function(heartbeat, heartbeat_interval) { + PRESENCE_HB = validate_presence_heartbeat(heartbeat, PRESENCE_HB, error); + PRESENCE_HB_INTERVAL = heartbeat_interval || (PRESENCE_HB / 2) - 1; + if (PRESENCE_HB == 2) { + PRESENCE_HB_INTERVAL = 1; + } + CONNECT(); + _presence_heartbeat(); + }, + + 'get_heartbeat_interval' : function() { + return PRESENCE_HB_INTERVAL; + }, + + 'set_heartbeat_interval' : function(heartbeat_interval) { + PRESENCE_HB_INTERVAL = heartbeat_interval; + _presence_heartbeat(); + }, + + 'get_version' : function() { + return SDK_VER; + }, + 'getGcmMessageObject' : function(obj) { + return { + 'data' : obj + } + }, + 'getApnsMessageObject' : function(obj) { + var x = { + 'aps' : { 'badge' : 1, 'alert' : ''} + } + for (k in obj) { + k[x] = obj[k]; + } + return x; + }, + 'newPnMessage' : function() { + var x = {}; + if (gcm) x['pn_gcm'] = gcm; + if (apns) x['pn_apns'] = apns; + for ( k in n ) { + x[k] = n[k]; + } + return x; + }, + + '_add_param' : function(key,val) { + params[key] = val; + }, + + 'channel_group' : function(args, callback) { + var ns_ch = args['channel_group'] + , callback = callback || args['callback'] + , channels = args['channels'] || args['channel'] + , cloak = args['cloak'] + , namespace + , channel_group + , url = [] + , data = {} + , mode = args['mode'] || 'add'; + + + if (ns_ch) { + var ns_ch_a = ns_ch.split(':'); + + if (ns_ch_a.length > 1) { + namespace = (ns_ch_a[0] === '*')?null:ns_ch_a[0]; + + channel_group = ns_ch_a[1]; + } else { + channel_group = ns_ch_a[0]; + } + } + + namespace && url.push('namespace') && url.push(encode(namespace)); + + url.push('channel-group'); + + if (channel_group && channel_group !== '*') { + url.push(channel_group); + } + + if (channels ) { + if (isArray(channels)) { + channels = channels.join(','); + } + data[mode] = channels; + data['cloak'] = (CLOAK)?'true':'false'; + } else { + if (mode === 'remove') url.push('remove'); + } + + if (typeof cloak != 'undefined') data['cloak'] = (cloak)?'true':'false'; + + CR(args, callback, url, data); + }, + + 'channel_group_list_groups' : function(args, callback) { + var namespace; + + namespace = args['namespace'] || args['ns'] || args['channel_group'] || null; + if (namespace) { + args["channel_group"] = namespace + ":*"; + } + + SELF['channel_group'](args, callback); + }, + + 'channel_group_list_channels' : function(args, callback) { + if (!args['channel_group']) return error('Missing Channel Group'); + SELF['channel_group'](args, callback); + }, + + 'channel_group_remove_channel' : function(args, callback) { + if (!args['channel_group']) return error('Missing Channel Group'); + if (!args['channel'] && !args['channels'] ) return error('Missing Channel'); + + args['mode'] = 'remove'; + SELF['channel_group'](args,callback); + }, + + 'channel_group_remove_group' : function(args, callback) { + if (!args['channel_group']) return error('Missing Channel Group'); + if (args['channel']) return error('Use channel_group_remove_channel if you want to remove a channel from a group.'); + + args['mode'] = 'remove'; + SELF['channel_group'](args,callback); + }, + + 'channel_group_add_channel' : function(args, callback) { + if (!args['channel_group']) return error('Missing Channel Group'); + if (!args['channel'] && !args['channels'] ) return error('Missing Channel'); + SELF['channel_group'](args,callback); + }, + + 'channel_group_cloak' : function(args, callback) { + if (typeof args['cloak'] == 'undefined') { + callback(CLOAK); + return; + } + CLOAK = args['cloak']; + SELF['channel_group'](args,callback); + }, + + 'channel_group_list_namespaces' : function(args, callback) { + var url = ['namespace']; + CR(args, callback, url); + }, + 'channel_group_remove_namespace' : function(args, callback) { + var url = ['namespace',args['namespace'],'remove']; + CR(args, callback, url); + }, + + /* + PUBNUB.history({ + channel : 'my_chat_channel', + limit : 100, + callback : function(history) { } + }); + */ + 'history' : function( args, callback ) { + var callback = args['callback'] || callback + , count = args['count'] || args['limit'] || 100 + , reverse = args['reverse'] || "false" + , err = args['error'] || function(){} + , auth_key = args['auth_key'] || AUTH_KEY + , cipher_key = args['cipher_key'] + , channel = args['channel'] + , channel_group = args['channel_group'] + , start = args['start'] + , end = args['end'] + , include_token = args['include_token'] + , string_msg_token = args['string_message_token'] || false + , params = {} + , jsonp = jsonp_cb(); + + // Make sure we have a Channel + if (!channel && !channel_group) return error('Missing Channel'); + if (!callback) return error('Missing Callback'); + if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key'); + + params['stringtoken'] = 'true'; + params['count'] = count; + params['reverse'] = reverse; + params['auth'] = auth_key; + + if (channel_group) { + params['channel-group'] = channel_group; + if (!channel) { + channel = ','; + } + } + if (jsonp) params['callback'] = jsonp; + if (start) params['start'] = start; + if (end) params['end'] = end; + if (include_token) params['include_token'] = 'true'; + if (string_msg_token) params['string_message_token'] = 'true'; + + // Send Message + xdr({ + callback : jsonp, + data : _get_url_params(params), + success : function(response) { + if (typeof response == 'object' && response['error']) { + err({'message' : response['message'], 'payload' : response['payload']}); + return; + } + var messages = response[0]; + var decrypted_messages = []; + for (var a = 0; a < messages.length; a++) { + var new_message = decrypt(messages[a],cipher_key); + try { + decrypted_messages['push'](JSON['parse'](new_message)); + } catch (e) { + decrypted_messages['push']((new_message)); + } + } + callback([decrypted_messages, response[1], response[2]]); + }, + fail : function(response) { + _invoke_error(response, err); + }, + url : [ + STD_ORIGIN, 'v2', 'history', 'sub-key', + SUBSCRIBE_KEY, 'channel', encode(channel) + ] + }); + }, + + /* + PUBNUB.replay({ + source : 'my_channel', + destination : 'new_channel' + }); + */ + 'replay' : function(args, callback) { + var callback = callback || args['callback'] || function(){} + , auth_key = args['auth_key'] || AUTH_KEY + , source = args['source'] + , destination = args['destination'] + , stop = args['stop'] + , start = args['start'] + , end = args['end'] + , reverse = args['reverse'] + , limit = args['limit'] + , jsonp = jsonp_cb() + , data = {} + , url; + + // Check User Input + if (!source) return error('Missing Source Channel'); + if (!destination) return error('Missing Destination Channel'); + if (!PUBLISH_KEY) return error('Missing Publish Key'); + if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key'); + + // Setup URL Params + if (jsonp != '0') data['callback'] = jsonp; + if (stop) data['stop'] = 'all'; + if (reverse) data['reverse'] = 'true'; + if (start) data['start'] = start; + if (end) data['end'] = end; + if (limit) data['count'] = limit; + + data['auth'] = auth_key; + + // Compose URL Parts + url = [ + STD_ORIGIN, 'v1', 'replay', + PUBLISH_KEY, SUBSCRIBE_KEY, + source, destination + ]; + + // Start (or Stop) Replay! + xdr({ + callback : jsonp, + success : function(response) { + _invoke_callback(response, callback, err); + }, + fail : function() { callback([ 0, 'Disconnected' ]) }, + url : url, + data : _get_url_params(data) + }); + }, + + /* + PUBNUB.auth('AJFLKAJSDKLA'); + */ + 'auth' : function(auth) { + AUTH_KEY = auth; + CONNECT(); + }, + + /* + PUBNUB.time(function(time){ }); + */ + 'time' : function(callback) { + var jsonp = jsonp_cb(); + + var data = { 'uuid' : UUID, 'auth' : AUTH_KEY } + + if (USE_INSTANCEID) data['instanceid'] = INSTANCEID; + + xdr({ + callback : jsonp, + data : _get_url_params(data), + timeout : SECOND * 5, + url : [STD_ORIGIN, 'time', jsonp], + success : function(response) { callback(response[0]) }, + fail : function() { callback(0) } + }); + }, + + /* + PUBNUB.publish({ + channel : 'my_chat_channel', + message : 'hello!' + }); + */ + 'publish' : function( args, callback ) { + var msg = args['message']; + if (!msg) return error('Missing Message'); + + var callback = callback || args['callback'] || msg['callback'] || function(){} + , channel = args['channel'] || msg['channel'] + , auth_key = args['auth_key'] || AUTH_KEY + , cipher_key = args['cipher_key'] + , err = args['error'] || msg['error'] || function() {} + , post = args['post'] || false + , store = ('store_in_history' in args) ? args['store_in_history']: true + , jsonp = jsonp_cb() + , add_msg = 'push' + , params + , url; + + if (args['prepend']) add_msg = 'unshift' + + if (!channel) return error('Missing Channel'); + if (!PUBLISH_KEY) return error('Missing Publish Key'); + if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key'); + + if (msg['getPubnubMessage']) { + msg = msg['getPubnubMessage'](); + } + + // If trying to send Object + msg = JSON['stringify'](encrypt(msg, cipher_key)); + + // Create URL + url = [ + STD_ORIGIN, 'publish', + PUBLISH_KEY, SUBSCRIBE_KEY, + 0, encode(channel), + jsonp, encode(msg) + ]; + + params = { 'uuid' : UUID, 'auth' : auth_key } + + if (!store) params['store'] ="0" + + if (USE_INSTANCEID) params['instanceid'] = INSTANCEID; + + // Queue Message Send + PUB_QUEUE[add_msg]({ + callback : jsonp, + timeout : SECOND * 5, + url : url, + data : _get_url_params(params), + fail : function(response){ + _invoke_error(response, err); + publish(1); + }, + success : function(response) { + _invoke_callback(response, callback, err); + publish(1); + }, + mode : (post)?'POST':'GET' + }); + + // Send Message + publish(); + }, + + /* + PUBNUB.unsubscribe({ channel : 'my_chat' }); + */ + 'unsubscribe' : function(args, callback) { + var channel = args['channel'] + , channel_group = args['channel_group'] + , auth_key = args['auth_key'] || AUTH_KEY + , callback = callback || args['callback'] || function(){} + , err = args['error'] || function(){}; + + TIMETOKEN = 0; + //SUB_RESTORE = 1; REVISIT !!!! + + if (channel) { + // Prepare Channel(s) + channel = map( ( + channel.join ? channel.join(',') : ''+channel + ).split(','), function(channel) { + if (!CHANNELS[channel]) return; + return channel + ',' + channel + PRESENCE_SUFFIX; + } ).join(','); + + // Iterate over Channels + each( channel.split(','), function(ch) { + var CB_CALLED = true; + if (!ch) return; + CHANNELS[ch] = 0; + if (ch in STATE) delete STATE[ch]; + if (READY) { + CB_CALLED = SELF['LEAVE']( ch, 0 , auth_key, callback, err); + } + if (!CB_CALLED) callback({action : "leave"}); + + + } ); + } + + if (channel_group) { + // Prepare channel group(s) + channel_group = map( ( + channel_group.join ? channel_group.join(',') : ''+channel_group + ).split(','), function(channel_group) { + if (!CHANNEL_GROUPS[channel_group]) return; + return channel_group + ',' + channel_group + PRESENCE_SUFFIX; + } ).join(','); + + // Iterate over channel groups + each( channel_group.split(','), function(chg) { + var CB_CALLED = true; + if (!chg) return; + CHANNEL_GROUPS[chg] = 0; + if (chg in STATE) delete STATE[chg]; + if (READY) { + CB_CALLED = SELF['LEAVE_GROUP']( chg, 0 , auth_key, callback, err); + } + if (!CB_CALLED) callback({action : "leave"}); + + } ); + } + + // Reset Connection if Count Less + CONNECT(); + }, + + /* + PUBNUB.subscribe({ + channel : 'my_chat' + callback : function(message) { } + }); + */ + 'subscribe' : function( args, callback ) { + var channel = args['channel'] + , channel_group = args['channel_group'] + , callback = callback || args['callback'] + , callback = callback || args['message'] + , connect = args['connect'] || function(){} + , reconnect = args['reconnect'] || function(){} + , disconnect = args['disconnect'] || function(){} + , SUB_ERROR = args['error'] || SUB_ERROR || function(){} + , idlecb = args['idle'] || function(){} + , presence = args['presence'] || 0 + , noheresync = args['noheresync'] || 0 + , backfill = args['backfill'] || 0 + , timetoken = args['timetoken'] || 0 + , sub_timeout = args['timeout'] || SUB_TIMEOUT + , windowing = args['windowing'] || SUB_WINDOWING + , state = args['state'] + , heartbeat = args['heartbeat'] || args['pnexpires'] + , heartbeat_interval = args['heartbeat_interval'] + , restore = args['restore'] || SUB_RESTORE; + + AUTH_KEY = args['auth_key'] || AUTH_KEY; + + // Restore Enabled? + SUB_RESTORE = restore; + + // Always Reset the TT + TIMETOKEN = timetoken; + + // Make sure we have a Channel + if (!channel && !channel_group) { + return error('Missing Channel'); + } + + if (!callback) return error('Missing Callback'); + if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key'); + + if (heartbeat || heartbeat === 0 || heartbeat_interval || heartbeat_interval === 0) { + SELF['set_heartbeat'](heartbeat, heartbeat_interval); + } + + // Setup Channel(s) + if (channel) { + each( (channel.join ? channel.join(',') : ''+channel).split(','), + function(channel) { + var settings = CHANNELS[channel] || {}; + + // Store Channel State + CHANNELS[SUB_CHANNEL = channel] = { + name : channel, + connected : settings.connected, + disconnected : settings.disconnected, + subscribed : 1, + callback : SUB_CALLBACK = callback, + 'cipher_key' : args['cipher_key'], + connect : connect, + disconnect : disconnect, + reconnect : reconnect + }; + + if (state) { + if (channel in state) { + STATE[channel] = state[channel]; + } else { + STATE[channel] = state; + } + } + + // Presence Enabled? + if (!presence) return; + + // Subscribe Presence Channel + SELF['subscribe']({ + 'channel' : channel + PRESENCE_SUFFIX, + 'callback' : presence, + 'restore' : restore + }); + + // Presence Subscribed? + if (settings.subscribed) return; + + // See Who's Here Now? + if (noheresync) return; + SELF['here_now']({ + 'channel' : channel, + 'data' : _get_url_params({ 'uuid' : UUID, 'auth' : AUTH_KEY }), + 'callback' : function(here) { + each( 'uuids' in here ? here['uuids'] : [], + function(uid) { presence( { + 'action' : 'join', + 'uuid' : uid, + 'timestamp' : Math.floor(rnow() / 1000), + 'occupancy' : here['occupancy'] || 1 + }, here, channel ); } ); + } + }); + } ); + } + + // Setup Channel Groups + if (channel_group) { + each( (channel_group.join ? channel_group.join(',') : ''+channel_group).split(','), + function(channel_group) { + var settings = CHANNEL_GROUPS[channel_group] || {}; + + CHANNEL_GROUPS[channel_group] = { + name : channel_group, + connected : settings.connected, + disconnected : settings.disconnected, + subscribed : 1, + callback : SUB_CALLBACK = callback, + 'cipher_key' : args['cipher_key'], + connect : connect, + disconnect : disconnect, + reconnect : reconnect + }; + + // Presence Enabled? + if (!presence) return; + + // Subscribe Presence Channel + SELF['subscribe']({ + 'channel_group' : channel_group + PRESENCE_SUFFIX, + 'callback' : presence, + 'restore' : restore, + 'auth_key' : AUTH_KEY + }); + + // Presence Subscribed? + if (settings.subscribed) return; + + // See Who's Here Now? + if (noheresync) return; + SELF['here_now']({ + 'channel_group' : channel_group, + 'data' : _get_url_params({ 'uuid' : UUID, 'auth' : AUTH_KEY }), + 'callback' : function(here) { + each( 'uuids' in here ? here['uuids'] : [], + function(uid) { presence( { + 'action' : 'join', + 'uuid' : uid, + 'timestamp' : Math.floor(rnow() / 1000), + 'occupancy' : here['occupancy'] || 1 + }, here, channel_group ); } ); + } + }); + } ); + } + + + // Test Network Connection + function _test_connection(success) { + if (success) { + // Begin Next Socket Connection + timeout( CONNECT, windowing); + } + else { + // New Origin on Failed Connection + STD_ORIGIN = nextorigin( ORIGIN, 1 ); + SUB_ORIGIN = nextorigin( ORIGIN, 1 ); + + // Re-test Connection + timeout( function() { + SELF['time'](_test_connection); + }, SECOND ); + } + + // Disconnect & Reconnect + each_channel(function(channel){ + // Reconnect + if (success && channel.disconnected) { + channel.disconnected = 0; + return channel.reconnect(channel.name); + } + + // Disconnect + if (!success && !channel.disconnected) { + channel.disconnected = 1; + channel.disconnect(channel.name); + } + }); + + // Disconnect & Reconnect for channel groups + each_channel_group(function(channel_group){ + // Reconnect + if (success && channel_group.disconnected) { + channel_group.disconnected = 0; + return channel_group.reconnect(channel_group.name); + } + + // Disconnect + if (!success && !channel_group.disconnected) { + channel_group.disconnected = 1; + channel_group.disconnect(channel_group.name); + } + }); + } + + // Evented Subscribe + function _connect() { + var jsonp = jsonp_cb() + , channels = generate_channel_list(CHANNELS).join(',') + , channel_groups = generate_channel_group_list(CHANNEL_GROUPS).join(','); + + // Stop Connection + if (!channels && !channel_groups) return; + + if (!channels) channels = ','; + + // Connect to PubNub Subscribe Servers + _reset_offline(); + + var data = _get_url_params({ 'uuid' : UUID, 'auth' : AUTH_KEY }); + + if (channel_groups) { + data['channel-group'] = channel_groups; } - Cache.prototype.setPrefix = function (prefix) { - this._prefix = prefix || 'rc-'; - return this; - }; - Cache.prototype.setItem = function (key, data) { - this._storage[this._prefixKey(key)] = JSON.stringify(data); - return this; - }; - Cache.prototype.removeItem = function (key) { - delete this._storage[this._prefixKey(key)]; - return this; - }; - Cache.prototype.getItem = function (key) { - var item = this._storage[this._prefixKey(key)]; - if (!item) - return null; - return JSON.parse(item); - }; - Cache.prototype.clean = function () { - for (var key in this._storage) { - if (!this._storage.hasOwnProperty(key)) - continue; - if (key.indexOf(this._prefix) === 0) { - delete this._storage[key]; + + + var st = JSON.stringify(STATE); + if (st.length > 2) data['state'] = JSON.stringify(STATE); + + if (PRESENCE_HB) data['heartbeat'] = PRESENCE_HB; + + if (USE_INSTANCEID) data['instanceid'] = INSTANCEID; + + start_presence_heartbeat(); + SUB_RECEIVER = xdr({ + timeout : sub_timeout, + callback : jsonp, + fail : function(response) { + if (response && response['error'] && response['service']) { + _invoke_error(response, SUB_ERROR); + _test_connection(1); + } else { + SELF['time'](function(success){ + !success && ( _invoke_error(response, SUB_ERROR)); + _test_connection(success); + }); + } + }, + data : _get_url_params(data), + url : [ + SUB_ORIGIN, 'subscribe', + SUBSCRIBE_KEY, encode(channels), + jsonp, TIMETOKEN + ], + success : function(messages) { + + // Check for Errors + if (!messages || ( + typeof messages == 'object' && + 'error' in messages && + messages['error'] + )) { + SUB_ERROR(messages['error']); + return timeout( CONNECT, SECOND ); + } + + // User Idle Callback + idlecb(messages[1]); + + // Restore Previous Connection Point if Needed + TIMETOKEN = !TIMETOKEN && + SUB_RESTORE && + db['get'](SUBSCRIBE_KEY) || messages[1]; + + /* + // Connect + each_channel_registry(function(registry){ + if (registry.connected) return; + registry.connected = 1; + registry.connect(channel.name); + }); + */ + + // Connect + each_channel(function(channel){ + if (channel.connected) return; + channel.connected = 1; + channel.connect(channel.name); + }); + + // Connect for channel groups + each_channel_group(function(channel_group){ + if (channel_group.connected) return; + channel_group.connected = 1; + channel_group.connect(channel_group.name); + }); + + if (RESUMED && !SUB_RESTORE) { + TIMETOKEN = 0; + RESUMED = false; + // Update Saved Timetoken + db['set']( SUBSCRIBE_KEY, 0 ); + timeout( _connect, windowing ); + return; } + + // Invoke Memory Catchup and Receive Up to 100 + // Previous Messages from the Queue. + if (backfill) { + TIMETOKEN = 10000; + backfill = 0; + } + + // Update Saved Timetoken + db['set']( SUBSCRIBE_KEY, messages[1] ); + + // Route Channel <---> Callback for Message + var next_callback = (function() { + var channels = ''; + var channels2 = ''; + + if (messages.length > 3) { + channels = messages[3]; + channels2 = messages[2]; + } else if (messages.length > 2) { + channels = messages[2]; + } else { + channels = map( + generate_channel_list(CHANNELS), function(chan) { return map( + Array(messages[0].length) + .join(',').split(','), + function() { return chan; } + ) }).join(',') + } + + var list = channels.split(','); + var list2 = (channels2)?channels2.split(','):[]; + + return function() { + var channel = list.shift()||SUB_CHANNEL; + var channel2 = list2.shift(); + + var chobj = {}; + + if (channel2) { + if (channel && channel.indexOf('-pnpres') >= 0 + && channel2.indexOf('-pnpres') < 0) { + channel2 += '-pnpres'; + } + chobj = CHANNEL_GROUPS[channel2] || CHANNELS[channel2] || {'callback' : function(){}}; + } else { + chobj = CHANNELS[channel]; + } + + var r = [ + chobj + .callback||SUB_CALLBACK, + channel.split(PRESENCE_SUFFIX)[0] + ]; + channel2 && r.push(channel2.split(PRESENCE_SUFFIX)[0]); + return r; + }; + })(); + + var latency = detect_latency(+messages[1]); + each( messages[0], function(msg) { + var next = next_callback(); + var decrypted_msg = decrypt(msg, + (CHANNELS[next[1]])?CHANNELS[next[1]]['cipher_key']:null); + next[0] && next[0]( decrypted_msg, messages, next[2] || next[1], latency, next[1]); + }); + + timeout( _connect, windowing ); } - return this; - }; - Cache.prototype._prefixKey = function (key) { - return this._prefix + key; - }; - return Cache; - })(); - core.Cache = Cache; - })(core = sdk.core || (sdk.core = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var core; - (function (core) { - /** - * TODO Fix public vars - */ - var Log = (function () { - function Log(console) { - if (!console) { - console = { - log: function () { }, - warn: function () { }, - info: function () { }, - error: function () { } - }; - } - this._console = console; - this.logDebug = false; - this.logInfo = false; - this.logWarnings = false; - this.logErrors = false; - this.addTimestamps = false; + }); + } + + CONNECT = function() { + _reset_offline(); + timeout( _connect, windowing ); + }; + + // Reduce Status Flicker + if (!READY) return READY_BUFFER.push(CONNECT); + + // Connect Now + CONNECT(); + }, + + /* + PUBNUB.here_now({ channel : 'my_chat', callback : fun }); + */ + 'here_now' : function( args, callback ) { + var callback = args['callback'] || callback + , err = args['error'] || function(){} + , auth_key = args['auth_key'] || AUTH_KEY + , channel = args['channel'] + , channel_group = args['channel_group'] + , jsonp = jsonp_cb() + , uuids = ('uuids' in args) ? args['uuids'] : true + , state = args['state'] + , data = { 'uuid' : UUID, 'auth' : auth_key }; + + if (!uuids) data['disable_uuids'] = 1; + if (state) data['state'] = 1; + + // Make sure we have a Channel + if (!callback) return error('Missing Callback'); + if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key'); + + var url = [ + STD_ORIGIN, 'v2', 'presence', + 'sub_key', SUBSCRIBE_KEY + ]; + + channel && url.push('channel') && url.push(encode(channel)); + + if (jsonp != '0') { data['callback'] = jsonp; } + + if (channel_group) { + data['channel-group'] = channel_group; + !channel && url.push('channel') && url.push(','); + } + + if (USE_INSTANCEID) data['instanceid'] = INSTANCEID; + + xdr({ + callback : jsonp, + data : _get_url_params(data), + success : function(response) { + _invoke_callback(response, callback, err); + }, + fail : function(response) { + _invoke_error(response, err); + }, + url : url + }); + }, + + /* + PUBNUB.current_channels_by_uuid({ channel : 'my_chat', callback : fun }); + */ + 'where_now' : function( args, callback ) { + var callback = args['callback'] || callback + , err = args['error'] || function(){} + , auth_key = args['auth_key'] || AUTH_KEY + , jsonp = jsonp_cb() + , uuid = args['uuid'] || UUID + , data = { 'auth' : auth_key }; + + // Make sure we have a Channel + if (!callback) return error('Missing Callback'); + if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key'); + + if (jsonp != '0') { data['callback'] = jsonp; } + + if (USE_INSTANCEID) data['instanceid'] = INSTANCEID; + + xdr({ + callback : jsonp, + data : _get_url_params(data), + success : function(response) { + _invoke_callback(response, callback, err); + }, + fail : function(response) { + _invoke_error(response, err); + }, + url : [ + STD_ORIGIN, 'v2', 'presence', + 'sub_key', SUBSCRIBE_KEY, + 'uuid', encode(uuid) + ] + }); + }, + + 'state' : function(args, callback) { + var callback = args['callback'] || callback || function(r) {} + , err = args['error'] || function(){} + , auth_key = args['auth_key'] || AUTH_KEY + , jsonp = jsonp_cb() + , state = args['state'] + , uuid = args['uuid'] || UUID + , channel = args['channel'] + , channel_group = args['channel_group'] + , url + , data = _get_url_params({ 'auth' : auth_key }); + + // Make sure we have a Channel + if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key'); + if (!uuid) return error('Missing UUID'); + if (!channel && !channel_group) return error('Missing Channel'); + + if (jsonp != '0') { data['callback'] = jsonp; } + + if (typeof channel != 'undefined' + && CHANNELS[channel] && CHANNELS[channel].subscribed ) { + if (state) STATE[channel] = state; + } + + if (typeof channel_group != 'undefined' + && CHANNEL_GROUPS[channel_group] + && CHANNEL_GROUPS[channel_group].subscribed + ) { + if (state) STATE[channel_group] = state; + data['channel-group'] = channel_group; + + if (!channel) { + channel = ','; } - Log.prototype.disableAll = function () { - this.logDebug = false; - this.logInfo = false; - this.logWarnings = false; - this.logErrors = false; - }; - Log.prototype.enableAll = function () { - this.logDebug = true; - this.logInfo = true; - this.logWarnings = true; - this.logErrors = true; - }; - Log.prototype.debug = function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i - 0] = arguments[_i]; - } - if (this.logDebug) - this._console.log.apply(this._console, this._parseArguments(arguments)); - }; - Log.prototype.info = function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i - 0] = arguments[_i]; - } - if (this.logInfo) - this._console.info.apply(this._console, this._parseArguments(arguments)); - }; - Log.prototype.warn = function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i - 0] = arguments[_i]; - } - if (this.logWarnings) - this._console.warn.apply(this._console, this._parseArguments(arguments)); - }; - Log.prototype.error = function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i - 0] = arguments[_i]; - } - if (this.logErrors) - this._console.error.apply(this._console, this._parseArguments(arguments)); - }; - Log.prototype.stack = function () { - var e = new Error(); - if (e.hasOwnProperty('stack')) { - return e.stack.replace('Error\n', 'Stack Trace\n'); - } - }; - Log.prototype._parseArguments = function (args) { - args = core.utils.argumentsToArray(args); - if (this.addTimestamps) - args.unshift(new Date().toLocaleString(), '-'); - return args; - }; - return Log; - })(); - core.Log = Log; - core.log = new Log(); - })(core = sdk.core || (sdk.core = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var core; - (function (core) { - var utils; - (function (utils) { - var hasOwn = Object.prototype.hasOwnProperty, toString = Object.prototype.toString, rdigit = /\d/, class2type = {}; - // Populate the class2type map - 'Boolean Number String Function Array Date RegExp Object'.split(' ').forEach(function (name) { - class2type["[object " + name + "]"] = name.toLowerCase(); + } + + data['state'] = JSON.stringify(state); + + if (USE_INSTANCEID) data['instanceid'] = INSTANCEID; + + if (state) { + url = [ + STD_ORIGIN, 'v2', 'presence', + 'sub-key', SUBSCRIBE_KEY, + 'channel', channel, + 'uuid', uuid, 'data' + ] + } else { + url = [ + STD_ORIGIN, 'v2', 'presence', + 'sub-key', SUBSCRIBE_KEY, + 'channel', channel, + 'uuid', encode(uuid) + ] + } + + xdr({ + callback : jsonp, + data : _get_url_params(data), + success : function(response) { + _invoke_callback(response, callback, err); + }, + fail : function(response) { + _invoke_error(response, err); + }, + url : url + + }); + + }, + + /* + PUBNUB.grant({ + channel : 'my_chat', + callback : fun, + error : fun, + ttl : 24 * 60, // Minutes + read : true, + write : true, + auth_key : '3y8uiajdklytowsj' + }); + */ + 'grant' : function( args, callback ) { + var callback = args['callback'] || callback + , err = args['error'] || function(){} + , channel = args['channel'] || args['channels'] + , channel_group = args['channel_group'] + , jsonp = jsonp_cb() + , ttl = args['ttl'] + , r = (args['read'] )?"1":"0" + , w = (args['write'])?"1":"0" + , m = (args['manage'])?"1":"0" + , auth_key = args['auth_key'] || args['auth_keys']; + + if (!callback) return error('Missing Callback'); + if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key'); + if (!PUBLISH_KEY) return error('Missing Publish Key'); + if (!SECRET_KEY) return error('Missing Secret Key'); + + var timestamp = Math.floor(new Date().getTime() / 1000) + , sign_input = SUBSCRIBE_KEY + "\n" + PUBLISH_KEY + "\n" + + "grant" + "\n"; + + var data = { + 'w' : w, + 'r' : r, + 'timestamp' : timestamp + }; + if (args['manage']) { + data['m'] = m; + } + if (isArray(channel)) { + channel = channel['join'](','); + } + if (isArray(auth_key)) { + auth_key = auth_key['join'](','); + } + if (typeof channel != 'undefined' && channel != null && channel.length > 0) data['channel'] = channel; + if (typeof channel_group != 'undefined' && channel_group != null && channel_group.length > 0) { + data['channel-group'] = channel_group; + } + if (jsonp != '0') { data['callback'] = jsonp; } + if (ttl || ttl === 0) data['ttl'] = ttl; + + if (auth_key) data['auth'] = auth_key; + + data = _get_url_params(data) + + if (!auth_key) delete data['auth']; + + sign_input += _get_pam_sign_input_from_params(data); + + var signature = hmac_SHA256( sign_input, SECRET_KEY ); + + signature = signature.replace( /\+/g, "-" ); + signature = signature.replace( /\//g, "_" ); + + data['signature'] = signature; + + xdr({ + callback : jsonp, + data : data, + success : function(response) { + _invoke_callback(response, callback, err); + }, + fail : function(response) { + _invoke_error(response, err); + }, + url : [ + STD_ORIGIN, 'v1', 'auth', 'grant' , + 'sub-key', SUBSCRIBE_KEY + ] + }); + }, + + /* + PUBNUB.mobile_gw_provision ({ + device_id: 'A655FBA9931AB', + op : 'add' | 'remove', + gw_type : 'apns' | 'gcm', + channel : 'my_chat', + callback : fun, + error : fun, + }); + */ + + 'mobile_gw_provision' : function( args ) { + + var callback = args['callback'] || function(){} + , auth_key = args['auth_key'] || AUTH_KEY + , err = args['error'] || function() {} + , jsonp = jsonp_cb() + , channel = args['channel'] + , op = args['op'] + , gw_type = args['gw_type'] + , device_id = args['device_id'] + , params + , url; + + if (!device_id) return error('Missing Device ID (device_id)'); + if (!gw_type) return error('Missing GW Type (gw_type: gcm or apns)'); + if (!op) return error('Missing GW Operation (op: add or remove)'); + if (!channel) return error('Missing gw destination Channel (channel)'); + if (!PUBLISH_KEY) return error('Missing Publish Key'); + if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key'); + + // Create URL + url = [ + STD_ORIGIN, 'v1/push/sub-key', + SUBSCRIBE_KEY, 'devices', device_id + ]; + + params = { 'uuid' : UUID, 'auth' : auth_key, 'type': gw_type}; + + if (op == "add") { + params['add'] = channel; + } else if (op == "remove") { + params['remove'] = channel; + } + + if (USE_INSTANCEID) data['instanceid'] = INSTANCEID; + + xdr({ + callback : jsonp, + data : params, + success : function(response) { + _invoke_callback(response, callback, err); + }, + fail : function(response) { + _invoke_error(response, err); + }, + url : url + }); + + }, + + /* + PUBNUB.audit({ + channel : 'my_chat', + callback : fun, + error : fun, + read : true, + write : true, + auth_key : '3y8uiajdklytowsj' + }); + */ + 'audit' : function( args, callback ) { + var callback = args['callback'] || callback + , err = args['error'] || function(){} + , channel = args['channel'] + , channel_group = args['channel_group'] + , auth_key = args['auth_key'] + , jsonp = jsonp_cb(); + + // Make sure we have a Channel + if (!callback) return error('Missing Callback'); + if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key'); + if (!PUBLISH_KEY) return error('Missing Publish Key'); + if (!SECRET_KEY) return error('Missing Secret Key'); + + var timestamp = Math.floor(new Date().getTime() / 1000) + , sign_input = SUBSCRIBE_KEY + "\n" + + PUBLISH_KEY + "\n" + + "audit" + "\n"; + + var data = {'timestamp' : timestamp }; + if (jsonp != '0') { data['callback'] = jsonp; } + if (typeof channel != 'undefined' && channel != null && channel.length > 0) data['channel'] = channel; + if (typeof channel_group != 'undefined' && channel_group != null && channel_group.length > 0) { + data['channel-group'] = channel_group; + } + if (auth_key) data['auth'] = auth_key; + + data = _get_url_params(data); + + if (!auth_key) delete data['auth']; + + sign_input += _get_pam_sign_input_from_params(data); + + var signature = hmac_SHA256( sign_input, SECRET_KEY ); + + signature = signature.replace( /\+/g, "-" ); + signature = signature.replace( /\//g, "_" ); + + data['signature'] = signature; + xdr({ + callback : jsonp, + data : data, + success : function(response) { + _invoke_callback(response, callback, err); + }, + fail : function(response) { + _invoke_error(response, err); + }, + url : [ + STD_ORIGIN, 'v1', 'auth', 'audit' , + 'sub-key', SUBSCRIBE_KEY + ] + }); + }, + + /* + PUBNUB.revoke({ + channel : 'my_chat', + callback : fun, + error : fun, + auth_key : '3y8uiajdklytowsj' + }); + */ + 'revoke' : function( args, callback ) { + args['read'] = false; + args['write'] = false; + SELF['grant']( args, callback ); + }, + 'set_uuid' : function(uuid) { + UUID = uuid; + CONNECT(); + }, + 'get_uuid' : function() { + return UUID; + }, + 'isArray' : function(arg) { + return isArray(arg); + }, + 'get_subscibed_channels' : function() { + return generate_channel_list(CHANNELS, true); + }, + 'presence_heartbeat' : function(args) { + var callback = args['callback'] || function() {} + var err = args['error'] || function() {} + var jsonp = jsonp_cb(); + var data = { 'uuid' : UUID, 'auth' : AUTH_KEY }; + + var st = JSON['stringify'](STATE); + if (st.length > 2) data['state'] = JSON['stringify'](STATE); + + if (PRESENCE_HB > 0 && PRESENCE_HB < 320) data['heartbeat'] = PRESENCE_HB; + + if (jsonp != '0') { data['callback'] = jsonp; } + + var channels = encode(generate_channel_list(CHANNELS, true)['join'](',')); + var channel_groups = generate_channel_group_list(CHANNEL_GROUPS, true)['join'](','); + + if (!channels) channels = ','; + if (channel_groups) data['channel-group'] = channel_groups; + + if (USE_INSTANCEID) data['instanceid'] = INSTANCEID; + + xdr({ + callback : jsonp, + data : _get_url_params(data), + timeout : SECOND * 5, + url : [ + STD_ORIGIN, 'v2', 'presence', + 'sub-key', SUBSCRIBE_KEY, + 'channel' , channels, + 'heartbeat' + ], + success : function(response) { + _invoke_callback(response, callback, err); + }, + fail : function(response) { _invoke_error(response, err); } + }); + }, + 'stop_timers': function () { + clearTimeout(_poll_timer); + clearTimeout(_poll_timer2); + clearTimeout(PRESENCE_HB_TIMEOUT); + }, + 'shutdown': function () { + SELF['stop_timers'](); + shutdown && shutdown(); + }, + + // Expose PUBNUB Functions + 'xdr' : xdr, + 'ready' : ready, + 'db' : db, + 'uuid' : generate_uuid, + 'map' : map, + 'each' : each, + 'each-channel' : each_channel, + 'grep' : grep, + 'offline' : function(){ _reset_offline( + 1, { "message" : "Offline. Please check your network settings." }) + }, + 'supplant' : supplant, + 'now' : rnow, + 'unique' : unique, + 'updater' : updater + }; + + function _poll_online() { + _is_online() || _reset_offline( 1, { + "error" : "Offline. Please check your network settings. " + }); + _poll_timer && clearTimeout(_poll_timer); + _poll_timer = timeout( _poll_online, SECOND ); + } + + function _poll_online2() { + if (!TIME_CHECK) return; + SELF['time'](function(success){ + detect_time_detla( function(){}, success ); + success || _reset_offline( 1, { + "error" : "Heartbeat failed to connect to Pubnub Servers." + + "Please check your network settings." }); - /** - * Ported from jQuery.fn.extend - * Optional first parameter makes deep copy - */ - function extend(targetObject, sourceObject) { - var args = []; - for (var _i = 2; _i < arguments.length; _i++) { - args[_i - 2] = arguments[_i]; - } - var options, name, src, copy, copyIsArray, clone, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false; - // Handle a deep copy situation - if (typeof target === "boolean") { - deep = target; - // skip the boolean and the target - target = arguments[i] || {}; - i++; - } - // Handle case when target is a string or something (possible in deep copy) - if (typeof target !== "object" && !isFunction(target)) { - target = {}; - } - for (; i < length; i++) { - // Only deal with non-null/undefined values - if ((options = arguments[i]) !== null) { - // Extend the base object - for (name in options) { - src = target[name]; - copy = options[name]; - // Prevent never-ending loop - if (target === copy) { - continue; - } - // Recurse if we're merging plain objects or arrays - if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) { - if (copyIsArray) { - copyIsArray = false; - clone = src && isArray(src) ? src : []; - } - else { - clone = src && isPlainObject(src) ? src : {}; - } - // Never move original objects, clone them - target[name] = extend(deep, clone, copy); - } - else if (copy !== undefined) { - target[name] = copy; - } - } - } - } - // Return the modified object - return target; - } - utils.extend = extend; - function forEach(object, cb) { - for (var i in object) { - if (!object.hasOwnProperty(i)) - continue; - var res = cb(object[i], i); - if (res === false) - break; - } - } - utils.forEach = forEach; - /** - * TODO Replace with something better - * @see https://github.com/joyent/node/blob/master/lib/querystring.js - * @param {object} parameters - * @returns {string} - */ - function queryStringify(parameters) { - var array = []; - forEach(parameters, function (v, i) { - if (isArray(v)) { - v.forEach(function (vv) { - array.push(encodeURIComponent(i) + '=' + encodeURIComponent(vv)); - }); - } - else { - array.push(encodeURIComponent(i) + '=' + encodeURIComponent(v)); - } - }); - return array.join('&'); - } - utils.queryStringify = queryStringify; - /** - * TODO Replace with something better - * @see https://github.com/joyent/node/blob/master/lib/querystring.js - * @param {string} queryString - * @returns {object} - */ - function parseQueryString(queryString) { - var argsParsed = {}, self = this; - queryString.split('&').forEach(function (arg) { - arg = decodeURIComponent(arg); - if (arg.indexOf('=') == -1) { - argsParsed[arg.trim()] = true; - } - else { - var pair = arg.split('='), key = pair[0].trim(), value = pair[1].trim(); - if (key in argsParsed) { - if (key in argsParsed && !self.isArray(argsParsed[key])) - argsParsed[key] = [argsParsed[key]]; - argsParsed[key].push(value); - } - else { - argsParsed[key] = value; - } - } - }); - return argsParsed; - } - utils.parseQueryString = parseQueryString; - /** - * Returns true if the passed value is valid email address. - * Checks multiple comma separated emails according to RFC 2822 if parameter `multiple` is `true` - */ - function isEmail(v, multiple) { - if (!!multiple) { - //this Regexp is also suitable for multiple emails (comma separated) - return /^(?:[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?[ ,;]*)+$/i.test(v); - } - else { - return /^[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i.test(v); - } - } - utils.isEmail = isEmail; - function isPhoneNumber(v) { - return (/\+?1[0-9]{3}[0-9a-z]{7}/im.test(v.toString().split(/[^0-9a-z\+]/im).join(''))); - } - utils.isPhoneNumber = isPhoneNumber; - /** - * @param args - * @returns {Array} - */ - function argumentsToArray(args) { - return Array.prototype.slice.call(args || [], 0); - } - utils.argumentsToArray = argumentsToArray; - function isDate(obj) { - return type(obj) === "date"; - } - utils.isDate = isDate; - function isFunction(obj) { - return type(obj) === "function"; - } - utils.isFunction = isFunction; - function isArray(obj) { - return Array.isArray ? Array.isArray(obj) : type(obj) === "array"; - } - utils.isArray = isArray; - // A crude way of determining if an object is a window - function isWindow(obj) { - return obj && typeof obj === "object" && "setInterval" in obj; - } - utils.isWindow = isWindow; - function isNan(obj) { - return obj === null || !rdigit.test(obj) || isNaN(obj); - } - utils.isNan = isNan; - function type(obj) { - return obj === null - ? String(obj) - : class2type[toString.call(obj)] || "object"; - } - utils.type = type; - function isPlainObject(obj) { - // Must be an Object. - // Because of IE, we also have to check the presence of the constructor property. - // Make sure that DOM nodes and window objects don't pass through, as well - if (!obj || type(obj) !== "object" || obj.nodeType || isWindow(obj)) { - return false; - } - // Not own constructor property must be Object - if (obj.constructor && !hasOwn.call(obj, "constructor") && !hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) { - return false; - } - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own. - var key; - for (key in obj) { } - return key === undefined || hasOwn.call(obj, key); - } - utils.isPlainObject = isPlainObject; - function getProperty(obj, property) { - return property - .split(/[.[\]]/) - .reduce(function (res, part) { - if (!res) - return undefined; - return part ? res[part] : res; - }, obj); - } - utils.getProperty = getProperty; - function poll(fn, interval, timeout) { - stopPolling(timeout); - interval = interval || 1000; - var next = function (delay) { - delay = delay || interval; - interval = delay; - return setTimeout(function () { - fn(next, delay); - }, delay); - }; - return next(); - } - utils.poll = poll; - function stopPolling(timeout) { - if (timeout) - clearTimeout(timeout); - } - utils.stopPolling = stopPolling; - function parseString(s) { - return s ? s.toString() : ''; - } - utils.parseString = parseString; - function parseNumber(n) { - if (!n) - return 0; - n = parseFloat(n); - return isNan(n) ? 0 : n; - } - utils.parseNumber = parseNumber; - function isNodeJS() { - return (typeof process !== 'undefined'); - } - utils.isNodeJS = isNodeJS; - function isBrowser() { - return (typeof window !== 'undefined'); - } - utils.isBrowser = isBrowser; - })(utils = core.utils || (core.utils = {})); - })(core = sdk.core || (sdk.core = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -/// -/// -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var core; - (function (core) { - /** - * @see https://github.com/Microsoft/TypeScript/issues/275 - */ - var Observable = (function () { - function Observable() { - if (!(this instanceof Observable)) - throw new Error('Observable(): New operator was omitted'); - this.off(); - } - Observable.prototype.hasListeners = function (event) { - return (event in this._listeners); - }; - Observable.prototype.on = function (events, callback) { - var _this = this; - if (typeof events == 'string') - events = [events]; - if (!events) - throw new Error('No events to subscribe to'); - if (typeof callback !== 'function') - throw new Error('Callback must be a function'); - events.forEach(function (event) { - if (!_this.hasListeners(event)) - _this._listeners[event] = []; - _this._listeners[event].push(callback); - }); - return this; - }; - Observable.prototype.emit = function (event) { - var _this = this; - var args = []; - for (var _i = 1; _i < arguments.length; _i++) { - args[_i - 1] = arguments[_i]; - } - var result = null; - if (!this.hasListeners(event)) - return null; - this._listeners[event].some(function (callback) { - result = callback.apply(_this, args); - return (result === false); - }); - return result; - }; - Observable.prototype.off = function (event, callback) { - var _this = this; - if (!event) { - this._listeners = {}; - } - else { - if (!callback) { - delete this._listeners[event]; - } - else { - if (!this.hasListeners(event)) - return this; - this._listeners[event].forEach(function (cb, i) { - if (cb === callback) - delete _this._listeners[event][i]; - }); - } - } - return this; - }; - Observable.prototype.destroy = function () { - this.off(); - core.log.debug('Observable.destroy(): Listeners were destroyed'); - return this; - }; - return Observable; - })(); - core.Observable = Observable; - })(core = sdk.core || (sdk.core = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -/// -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - __.prototype = b.prototype; - d.prototype = new __(); + _poll_timer2 && clearTimeout(_poll_timer2); + _poll_timer2 = timeout( _poll_online2, KEEPALIVE ); + }); + } + + function _reset_offline(err, msg) { + SUB_RECEIVER && SUB_RECEIVER(err, msg); + SUB_RECEIVER = null; + + clearTimeout(_poll_timer); + clearTimeout(_poll_timer2); + } + + if (!UUID) UUID = SELF['uuid'](); + if (!INSTANCEID) INSTANCEID = SELF['uuid'](); + db['set']( SUBSCRIBE_KEY + 'uuid', UUID ); + + _poll_timer = timeout( _poll_online, SECOND ); + _poll_timer2 = timeout( _poll_online2, KEEPALIVE ); + PRESENCE_HB_TIMEOUT = timeout( + start_presence_heartbeat, + ( PRESENCE_HB_INTERVAL - 3 ) * SECOND + ); + + // Detect Age of Message + function detect_latency(tt) { + var adjusted_time = rnow() - TIME_DRIFT; + return adjusted_time - tt / 10000; + } + + detect_time_detla(); + function detect_time_detla( cb, time ) { + var stime = rnow(); + + time && calculate(time) || SELF['time'](calculate); + + function calculate(time) { + if (!time) return; + var ptime = time / 10000 + , latency = (rnow() - stime) / 2; + TIME_DRIFT = rnow() - (ptime + latency); + cb && cb(TIME_DRIFT); + } + } + + return SELF; +} +function crypto_obj() { + + function SHA256(s) { + return CryptoJS['SHA256'](s)['toString'](CryptoJS['enc']['Hex']); + } + + var iv = "0123456789012345"; + + var allowedKeyEncodings = ['hex', 'utf8', 'base64', 'binary']; + var allowedKeyLengths = [128, 256]; + var allowedModes = ['ecb', 'cbc']; + + var defaultOptions = { + 'encryptKey': true, + 'keyEncoding': 'utf8', + 'keyLength': 256, + 'mode': 'cbc' + }; + + function parse_options(options) { + + // Defaults + options = options || {}; + if (!options['hasOwnProperty']('encryptKey')) options['encryptKey'] = defaultOptions['encryptKey']; + if (!options['hasOwnProperty']('keyEncoding')) options['keyEncoding'] = defaultOptions['keyEncoding']; + if (!options['hasOwnProperty']('keyLength')) options['keyLength'] = defaultOptions['keyLength']; + if (!options['hasOwnProperty']('mode')) options['mode'] = defaultOptions['mode']; + + // Validation + if (allowedKeyEncodings['indexOf'](options['keyEncoding']['toLowerCase']()) == -1) options['keyEncoding'] = defaultOptions['keyEncoding']; + if (allowedKeyLengths['indexOf'](parseInt(options['keyLength'], 10)) == -1) options['keyLength'] = defaultOptions['keyLength']; + if (allowedModes['indexOf'](options['mode']['toLowerCase']()) == -1) options['mode'] = defaultOptions['mode']; + + return options; + + } + + function decode_key(key, options) { + if (options['keyEncoding'] == 'base64') { + return CryptoJS['enc']['Base64']['parse'](key); + } else if (options['keyEncoding'] == 'hex') { + return CryptoJS['enc']['Hex']['parse'](key); + } else { + return key; + } + } + + function get_padded_key(key, options) { + key = decode_key(key, options); + if (options['encryptKey']) { + return CryptoJS['enc']['Utf8']['parse'](SHA256(key)['slice'](0, 32)); + } else { + return key; + } + } + + function get_mode(options) { + if (options['mode'] == 'ecb') { + return CryptoJS['mode']['ECB']; + } else { + return CryptoJS['mode']['CBC']; + } + } + + function get_iv(options) { + return (options['mode'] == 'cbc') ? CryptoJS['enc']['Utf8']['parse'](iv) : null; + } + + return { + + 'encrypt': function(data, key, options) { + if (!key) return data; + options = parse_options(options); + var iv = get_iv(options); + var mode = get_mode(options); + var cipher_key = get_padded_key(key, options); + var hex_message = JSON['stringify'](data); + var encryptedHexArray = CryptoJS['AES']['encrypt'](hex_message, cipher_key, {'iv': iv, 'mode': mode})['ciphertext']; + var base_64_encrypted = encryptedHexArray['toString'](CryptoJS['enc']['Base64']); + return base_64_encrypted || data; + }, + + 'decrypt': function(data, key, options) { + if (!key) return data; + options = parse_options(options); + var iv = get_iv(options); + var mode = get_mode(options); + var cipher_key = get_padded_key(key, options); + try { + var binary_enc = CryptoJS['enc']['Base64']['parse'](data); + var json_plain = CryptoJS['AES']['decrypt']({'ciphertext': binary_enc}, cipher_key, {'iv': iv, 'mode': mode})['toString'](CryptoJS['enc']['Utf8']); + var plaintext = JSON['parse'](json_plain); + return plaintext; + } + catch (e) { + return undefined; + } + } + }; +} +/* =-====================================================================-= */ +/* =-====================================================================-= */ +/* =-========================= UTIL =============================-= */ +/* =-====================================================================-= */ +/* =-====================================================================-= */ + +window['PUBNUB'] || (function() { + +/** + * UTIL LOCALS + */ + +var SWF = 'https://pubnub.a.ssl.fastly.net/pubnub.swf' +, ASYNC = 'async' +, UA = navigator.userAgent +, PNSDK = 'PubNub-JS-' + 'Web' + '/' + '3.7.14' +, XORIGN = UA.indexOf('MSIE 6') == -1; + +/** + * CONSOLE COMPATIBILITY + */ +window.console || (window.console=window.console||{}); +console.log || ( + console.log = + console.error = + ((window.opera||{}).postError||function(){}) +); + +/** + * LOCAL STORAGE OR COOKIE + */ +var db = (function(){ + var store = {}; + var ls = false; + try { + ls = window['localStorage']; + } catch (e) { } + var cookieGet = function(key) { + if (document.cookie.indexOf(key) == -1) return null; + return ((document.cookie||'').match( + RegExp(key+'=([^;]+)') + )||[])[1] || null; + }; + var cookieSet = function( key, value ) { + document.cookie = key + '=' + value + + '; expires=Thu, 1 Aug 2030 20:00:00 UTC; path=/'; + }; + var cookieTest = (function() { + try { + cookieSet('pnctest', '1'); + return cookieGet('pnctest') === '1'; + } catch (e) { + return false; + } + }()); + return { + 'get' : function(key) { + try { + if (ls) return ls.getItem(key); + if (cookieTest) return cookieGet(key); + return store[key]; + } catch(e) { + return store[key]; + } + }, + 'set' : function( key, value ) { + try { + if (ls) return ls.setItem( key, value ) && 0; + if (cookieTest) cookieSet( key, value ); + store[key] = value; + } catch(e) { + store[key] = value; + } + } + }; +})(); + +function get_hmac_SHA256(data,key) { + var hash = CryptoJS['HmacSHA256'](data, key); + return hash.toString(CryptoJS['enc']['Base64']); +} + +/** + * $ + * = + * var div = $('divid'); + */ +function $(id) { return document.getElementById(id) } + +/** + * ERROR + * ===== + * error('message'); + */ +function error(message) { console['error'](message) } + +/** + * SEARCH + * ====== + * var elements = search('a div span'); + */ +function search( elements, start) { + var list = []; + each( elements.split(/\s+/), function(el) { + each( (start || document).getElementsByTagName(el), function(node) { + list.push(node); + } ); + }); + return list; +} + +/** + * BIND + * ==== + * bind( 'keydown', search('a')[0], function(element) { + * ... + * } ); + */ +function bind( type, el, fun ) { + each( type.split(','), function(etype) { + var rapfun = function(e) { + if (!e) e = window.event; + if (!fun(e)) { + e.cancelBubble = true; + e.preventDefault && e.preventDefault(); + e.stopPropagation && e.stopPropagation(); + } + }; + + if ( el.addEventListener ) el.addEventListener( etype, rapfun, false ); + else if ( el.attachEvent ) el.attachEvent( 'on' + etype, rapfun ); + else el[ 'on' + etype ] = rapfun; + } ); +} + +/** + * UNBIND + * ====== + * unbind( 'keydown', search('a')[0] ); + */ +function unbind( type, el, fun ) { + if ( el.removeEventListener ) el.removeEventListener( type, false ); + else if ( el.detachEvent ) el.detachEvent( 'on' + type, false ); + else el[ 'on' + type ] = null; +} + +/** + * HEAD + * ==== + * head().appendChild(elm); + */ +function head() { return search('head')[0] } + +/** + * ATTR + * ==== + * var attribute = attr( node, 'attribute' ); + */ +function attr( node, attribute, value ) { + if (value) node.setAttribute( attribute, value ); + else return node && node.getAttribute && node.getAttribute(attribute); +} + +/** + * CSS + * === + * var obj = create('div'); + */ +function css( element, styles ) { + for (var style in styles) if (styles.hasOwnProperty(style)) + try {element.style[style] = styles[style] + ( + '|width|height|top|left|'.indexOf(style) > 0 && + typeof styles[style] == 'number' + ? 'px' : '' + )}catch(e){} +} + +/** + * CREATE + * ====== + * var obj = create('div'); + */ +function create(element) { return document.createElement(element) } + + +/** + * jsonp_cb + * ======== + * var callback = jsonp_cb(); + */ +function jsonp_cb() { return XORIGN || FDomainRequest() ? 0 : unique() } + + + +/** + * EVENTS + * ====== + * PUBNUB.events.bind( 'you-stepped-on-flower', function(message) { + * // Do Stuff with message + * } ); + * + * PUBNUB.events.fire( 'you-stepped-on-flower', "message-data" ); + * PUBNUB.events.fire( 'you-stepped-on-flower', {message:"data"} ); + * PUBNUB.events.fire( 'you-stepped-on-flower', [1,2,3] ); + * + */ +var events = { + 'list' : {}, + 'unbind' : function( name ) { events.list[name] = [] }, + 'bind' : function( name, fun ) { + (events.list[name] = events.list[name] || []).push(fun); + }, + 'fire' : function( name, data ) { + each( + events.list[name] || [], + function(fun) { fun(data) } + ); + } }; -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var core; - (function (core) { - var PageVisibility = (function (_super) { - __extends(PageVisibility, _super); - function PageVisibility() { - var _this = this; - _super.call(this); - this.events = { - change: 'change' - }; - var hidden = "hidden", onchange = function (evt) { - evt = evt || window.event; - var v = 'visible', h = 'hidden', evtMap = { - focus: v, focusin: v, pageshow: v, blur: h, focusout: h, pagehide: h - }; - _this._visible = (evt.type in evtMap) ? evtMap[evt.type] == v : !document[hidden]; - _this.emit(_this.events.change, _this._visible); - }; - this._visible = true; - if (typeof document == 'undefined' || typeof window == 'undefined') - return; - // Standards: - if (hidden in document) - document.addEventListener("visibilitychange", onchange); - else if ((hidden = "mozHidden") in document) - document.addEventListener("mozvisibilitychange", onchange); - else if ((hidden = "webkitHidden") in document) - document.addEventListener("webkitvisibilitychange", onchange); - else if ((hidden = "msHidden") in document) - document.addEventListener("msvisibilitychange", onchange); - else if ('onfocusin' in document) - document.onfocusin = document.onfocusout = onchange; - else - window.onpageshow = window.onpagehide = window.onfocus = window.onblur = onchange; - } - PageVisibility.prototype.visible = function () { - return this._visible; - }; - return PageVisibility; - })(core.Observable); - core.PageVisibility = PageVisibility; - })(core = sdk.core || (sdk.core = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -/// -/// -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var mocks; - (function (mocks) { - var Mock = (function () { - function Mock(method, path, json, status, statusText, delay) { - this._method = method.toUpperCase(); - this._path = path; - this._json = json || {}; - this._delay = delay || 10; - this._status = status || 200; - this._statusText = statusText || 'OK'; - } - Mock.prototype.path = function () { - return this._path; - }; - Mock.prototype.method = function () { - return this._method; - }; - Mock.prototype.test = function (request) { - return request.url.indexOf(this._path) > -1 && - request.method.toUpperCase() == this._method; - }; - Mock.prototype.getResponse = function (request) { - var _this = this; - return new sdk.externals._Promise(function (resolve, reject) { - setTimeout(function () { - resolve(_this.createResponse(_this._json)); - }, _this._delay); - }); - }; - Mock.prototype.createResponse = function (json, init) { - init = init || {}; - init.status = init.status || this._status; - init.statusText = init.statusText || this._statusText; - var str = JSON.stringify(json), res = sdk.http.Client.createResponse(str, init); - res.headers.set(sdk.http.ApiResponse.contentType, sdk.http.ApiResponse.jsonContentType); - return res; - }; - return Mock; - })(); - mocks.Mock = Mock; - })(mocks = sdk.mocks || (sdk.mocks = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -/// -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var mocks; - (function (mocks) { - var Registry = (function () { - function Registry() { - this._mocks = []; - } - Registry.prototype.add = function (mock) { - this._mocks.push(mock); - return this; - }; - Registry.prototype.clear = function () { - this._mocks = []; - return this; - }; - Registry.prototype.find = function (request) { - //console.log('Registry is looking for', request); - var mock = this._mocks.shift(); - if (!mock) - throw new Error('No mock in registry for request ' + request.method + ' ' + request.url); - if (!mock.test(request)) - throw new Error('Wrong request ' + request.method + ' ' + request.url + - ' for expected mock ' + mock.method() + ' ' + mock.path()); - return mock; - }; - Registry.prototype.apiCall = function (method, path, response, status, statusText) { - this.add(new mocks.Mock(method, path, response, status, statusText)); - return this; - }; - Registry.prototype.authentication = function () { - 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() + 3600000 - }); - return this; - }; - Registry.prototype.logout = function () { - this.apiCall('POST', '/restapi/oauth/revoke', {}); - return this; - }; - Registry.prototype.presenceLoad = function (id) { - this.apiCall('GET', '/restapi/v1.0/account/~/extension/' + id + '/presence', { - "uri": "https://platform.ringcentral.com/restapi/v1.0/account/123/extension/" + id + "/presence", - "extension": { - "uri": "https://platform.ringcentral.com/restapi/v1.0/account/123/extension/" + id, - "id": id, - "extensionNumber": "101" - }, - "activeCalls": [], - "presenceStatus": "Available", - "telephonyStatus": "Ringing", - "userStatus": "Available", - "dndStatus": "TakeAllCalls", - "extensionId": id - }); - return this; - }; - Registry.prototype.subscribeGeneric = function (expiresIn) { - expiresIn = expiresIn || 15 * 60 * 60; - var date = new Date(); - this.apiCall('POST', '/restapi/v1.0/subscription', { - 'eventFilters': [ - '/restapi/v1.0/account/~/extension/~/presence' - ], - 'expirationTime': new Date(date.getTime() + (expiresIn * 1000)).toISOString(), - 'expiresIn': expiresIn, - 'deliveryMode': { - 'transportType': 'PubNub', - 'encryption': false, - 'address': '123_foo', - 'subscriberKey': 'sub-c-foo', - 'secretKey': 'sec-c-bar' - }, - 'id': 'foo-bar-baz', - 'creationTime': date.toISOString(), - 'status': 'Active', - 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz' - }); - return this; - }; - Registry.prototype.subscribeOnPresence = function (id, detailed) { - id = id || '1'; - var date = new Date(); - this.apiCall('POST', '/restapi/v1.0/subscription', { - 'eventFilters': ['/restapi/v1.0/account/~/extension/' + id + '/presence' + (detailed ? '?detailedTelephonyState=true' : '')], - 'expirationTime': new Date(date.getTime() + (15 * 60 * 60 * 1000)).toISOString(), - 'deliveryMode': { - 'transportType': 'PubNub', - 'encryption': true, - 'address': '123_foo', - 'subscriberKey': 'sub-c-foo', - 'secretKey': 'sec-c-bar', - 'encryptionAlgorithm': 'AES', - 'encryptionKey': 'VQwb6EVNcQPBhE/JgFZ2zw==' - }, - 'creationTime': date.toISOString(), - 'id': 'foo-bar-baz', - 'status': 'Active', - 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz' - }); - return this; - }; - Registry.prototype.tokenRefresh = function (failure) { - if (!failure) { - 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' - }); - } - else { - this.apiCall('POST', '/restapi/oauth/token', { - 'message': 'Wrong token', - 'error_description': 'Wrong token', - 'description': 'Wrong token' - }, 400); - } - return this; - }; - return Registry; - })(); - mocks.Registry = Registry; - })(mocks = sdk.mocks || (sdk.mocks = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -/// -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var externals; - (function (externals) { - externals._Promise; - externals._fetch; - externals._Response; - externals._Request; - externals._Headers; - externals._PUBNUB; - function get() { - var root = Function('return this')(); - if (!externals._PUBNUB) - externals._PUBNUB = root.PUBNUB; - if (!externals._Promise) - externals._Promise = root.Promise; - if (!externals._fetch) - externals._fetch = root.fetch; - if (!externals._Headers) - externals._Headers = root.Headers; - if (!externals._Request) - externals._Request = root.Request; - if (!externals._Response) - externals._Response = root.Response; - return externals; + +/** + * XDR Cross Domain Request + * ======================== + * xdr({ + * url : ['http://www.blah.com/url'], + * success : function(response) {}, + * fail : function() {} + * }); + */ +function xdr( setup ) { + if (XORIGN || FDomainRequest()) return ajax(setup); + + var script = create('script') + , callback = setup.callback + , id = unique() + , finished = 0 + , xhrtme = setup.timeout || DEF_TIMEOUT + , timer = timeout( function(){done(1, {"message" : "timeout"})}, xhrtme ) + , fail = setup.fail || function(){} + , data = setup.data || {} + , success = setup.success || function(){} + , append = function() { head().appendChild(script) } + , done = function( failed, response ) { + if (finished) return; + finished = 1; + + script.onerror = null; + clearTimeout(timer); + + (failed || !response) || success(response); + + timeout( function() { + failed && fail(); + var s = $(id) + , p = s && s.parentNode; + p && p.removeChild(s); + }, SECOND ); + }; + + window[callback] = function(response) { + done( 0, response ); + }; + + if (!setup.blocking) script[ASYNC] = ASYNC; + + script.onerror = function() { done(1) }; + script.src = build_url( setup.url, data ); + + attr( script, 'id', id ); + + append(); + return done; +} + +/** + * CORS XHR Request + * ================ + * xdr({ + * url : ['http://www.blah.com/url'], + * success : function(response) {}, + * fail : function() {} + * }); + */ +function ajax( setup ) { + var xhr, response + , finished = function() { + if (loaded) return; + loaded = 1; + + clearTimeout(timer); + + try { response = JSON['parse'](xhr.responseText); } + catch (r) { return done(1); } + + complete = 1; + success(response); + } + , complete = 0 + , loaded = 0 + , xhrtme = setup.timeout || DEF_TIMEOUT + , timer = timeout( function(){done(1, {"message" : "timeout"})}, xhrtme ) + , fail = setup.fail || function(){} + , data = setup.data || {} + , success = setup.success || function(){} + , async = !(setup.blocking) + , done = function(failed,response) { + if (complete) return; + complete = 1; + + clearTimeout(timer); + + if (xhr) { + xhr.onerror = xhr.onload = null; + xhr.abort && xhr.abort(); + xhr = null; } - externals.get = get; - })(externals = sdk.externals || (sdk.externals = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -/// -/// -/// -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var http; - (function (http) { - /** - * @TODO Bring back tests - */ - var ApiResponse = (function () { - function ApiResponse(request, response, responseText) { - this._text = responseText; - this._request = request; - this._response = response; - this._json = null; - this._multipartTransactions = null; - } - ApiResponse.prototype.response = function () { - return this._response; - }; - ApiResponse.prototype.request = function () { - return this._request; - }; - ApiResponse.prototype.ok = function () { - return this._response && this._response.ok; - }; - ApiResponse.prototype.text = function () { - return this._text; - }; - ApiResponse.prototype.json = function () { - if (!this._isJson()) - throw new Error('Response is not JSON'); - if (!this._json) { - this._json = this._text ? JSON.parse(this._text) : null; - } - return this._json; - }; - ApiResponse.prototype.error = function (skipOKCheck) { - if (this.ok() && !skipOKCheck) - return null; - var message = (this._response && this._response.status ? this._response.status + ' ' : '') + - (this._response && this._response.statusText ? this._response.statusText : ''); - try { - var json = this.json(); - if (json.message) - message = json.message; - if (json.error_description) - message = json.error_description; - if (json.description) - message = json.description; - } - catch (ex) { } - return message; - }; - ApiResponse.prototype.multipart = function () { - if (!this._isMultipart()) - throw new Error('Response is not multipart'); - if (null === this._multipartTransactions) { - // Step 1. Split multipart response - if (!this._text) - throw new Error('No response body'); - var boundary = this._response.headers.get('Content-Type').match(/boundary=([^;]+)/i)[1]; - if (!boundary) - throw new Error('Cannot find boundary'); - var parts = this._text.toString().split(ApiResponse.boundarySeparator + boundary); - if (parts[0].trim() === '') - parts.shift(); - if (parts[parts.length - 1].trim() == ApiResponse.boundarySeparator) - parts.pop(); - if (parts.length < 1) - throw new Error('No parts in body'); - // Step 2. Parse status info - var statusInfo = ApiResponse.create(parts.shift(), this._response.status, this._response.statusText); - // Step 3. Parse all other parts - this._multipartTransactions = parts.map(function (part, i) { - var status = statusInfo.json().response[i].status; - return ApiResponse.create(part, status); - }); - } - return this._multipartTransactions; - }; - /** - * Short-hand method to get only JSON content of responses - */ - ApiResponse.prototype.multipartJson = function () { - return this.multipart().map(function (res) { - return res.json(); - }); - }; - ApiResponse.prototype._isContentType = function (contentType) { - return this._getContentType().indexOf(contentType) > -1; - }; - ApiResponse.prototype._getContentType = function () { - return this._response.headers.get(ApiResponse.contentType) || ''; - }; - ApiResponse.prototype._isMultipart = function () { - return this._isContentType(ApiResponse.multipartContentType); - }; - ApiResponse.prototype._isUrlEncoded = function () { - return this._isContentType(ApiResponse.urlencodedContentType); - }; - ApiResponse.prototype._isJson = function () { - return this._isContentType(ApiResponse.jsonContentType); - }; - /** - * Method is used to create Transaction objects from string parts of multipart/mixed response - * @param text - * @param status - * @param statusText - * @return {ApiResponse} - */ - ApiResponse.create = function (text, status, statusText) { - status = status || 200; - statusText = statusText || 'OK'; - text = text.replace(/\r/g, ''); - var headers = new sdk.externals._Headers(), headersAndBody = text.split(ApiResponse.bodySeparator), headersText = (headersAndBody.length > 1) ? headersAndBody.shift() : ''; - text = headersAndBody.join(ApiResponse.bodySeparator); - (headersText || '') - .split('\n') - .forEach(function (header) { - var split = header.trim().split(ApiResponse.headerSeparator), key = split.shift().trim(), value = split.join(ApiResponse.headerSeparator).trim(); - if (key) - headers.append(key, value); - }); - return new ApiResponse(null, http.Client.createResponse(text, { - headers: headers, - status: status, - statusText: statusText - }), text); - }; - ApiResponse.contentType = 'Content-Type'; - ApiResponse.jsonContentType = 'application/json'; - ApiResponse.multipartContentType = 'multipart/mixed'; - ApiResponse.urlencodedContentType = 'application/x-www-form-urlencoded'; - ApiResponse.headerSeparator = ':'; - ApiResponse.bodySeparator = '\n\n'; - ApiResponse.boundarySeparator = '--'; - return ApiResponse; - })(); - http.ApiResponse = ApiResponse; - })(http = sdk.http || (sdk.http = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -/// -/// -/// -/// -/// -/// -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var http; - (function (http) { - var allowedMethods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD']; - var Client = (function (_super) { - __extends(Client, _super); - function Client() { - _super.apply(this, arguments); - this.events = { - beforeRequest: 'beforeRequest', - requestSuccess: 'requestSuccess', - requestError: 'requestError' // means that request failed completely - }; - } - Client.prototype.sendRequest = function (request) { - var _this = this; - var res = new http.ApiResponse(request); //FIXME Potential leak - return new sdk.externals._Promise(function (resolve) { - //TODO Stop request if listeners return false - _this.emit(_this.events.beforeRequest, res); - resolve(_this._loadResponse(request)); - }) - .then(function (response) { - res['_response'] = Client.cloneResponse(response); - return response.text(); - }) - .then(function (text) { - res['_text'] = text; - if (!res.ok()) - throw Client.makeError(new Error('Response has unsuccessful status'), res); - _this.emit(_this.events.requestSuccess, res); - return res; - }) - .catch(function (e) { - if (!e.apiResponse) { - // we don't pass response since most likely it's parsing caused an error - e = Client.makeError(e, res); - } - _this.emit(_this.events.requestError, e); - throw e; - }); - }; - Client.prototype._loadResponse = function (request) { - return sdk.externals._fetch.call(null, request); - }; - /** - * Wraps the JS Error object with transaction information - * @param {Error} e - * @param {ApiResponse} apiResponse - * @return {IApiError} - */ - Client.makeError = function (e, apiResponse) { - var error = e; - // Wrap only if regular error - if (!error.hasOwnProperty('apiResponse') && !error.hasOwnProperty('originalMessage')) { - error.apiResponse = apiResponse; - error.originalMessage = error.message; - error.message = (apiResponse && apiResponse.error(true)) || error.originalMessage; - } - return error; - }; - /** - * TODO Wait for - * - https://github.com/github/fetch/issues/185 - * - https://github.com/bitinn/node-fetch/issues/34 - * @param {Response} response - * @return {Response} - */ - Client.cloneResponse = function (response) { - if (sdk.core.utils.isFunction(response.clone)) - return response.clone(); - var body = ''; - if (response.hasOwnProperty('_bodyInit')) - body = response['_bodyInit']; - if (response.hasOwnProperty('_bodyText')) - body = response['_bodyText']; - if (response.hasOwnProperty('_bodyBlob')) - body = response['_bodyBlob'].slice(); - if (response.hasOwnProperty('_bodyFormData')) - body = response['_bodyFormData']; - if (response.hasOwnProperty('_raw')) - body = response['_raw'].join(''); - var clone = new sdk.externals._Response(body, response); - if (response.hasOwnProperty('body')) - clone['body'] = response['body']; // accessing non-standard properties - return clone; - }; - /** - * Creates a response - * @param stringBody - * @param init - * @return {Response} - */ - Client.createResponse = function (stringBody, init) { - init = init || {}; - return new sdk.externals._Response(stringBody, init); - }; - Client.createRequest = function (input, init) { - init = init || {}; - var body = init.body; - // Assign request with empty body, Github's fetch throws errors if it cannot recognize the body type - var req = new sdk.externals._Request(input, sdk.core.utils.extend({}, init, { body: null })); - if (!req.url) - throw new Error('Url is not defined'); - if (!req.method) - req.method = 'GET'; - if (req.method && allowedMethods.indexOf(req.method) < 0) - throw new Error('Method has wrong value: ' + req.method); - if (!req.headers.has('Accept')) - req.headers.set('Accept', 'application/json'); - // Serialize body - if (sdk.core.utils.isPlainObject(init.body) || !init.body) { - if (!req.headers.has('Content-Type')) - req.headers.set('Content-Type', 'application/json'); - var contentType = req.headers.get('Content-Type'); - if (contentType.indexOf('application/json') > -1) { - body = JSON.stringify(init.body); - } - else if (contentType.indexOf('application/x-www-form-urlencoded') > -1) { - body = sdk.core.utils.queryStringify(init.body); - } - } - req.credentials = 'include'; - req.mode = 'cors'; - if (init.query) { - req.url = req.url + (req.url.indexOf('?') > -1 ? '&' : '?') + sdk.core.utils.queryStringify(init.query); - } - // Create another request with encoded body - req = new sdk.externals._Request(req.url, sdk.core.utils.extend(req, { body: body })); - // Keep the original body accessible directly (for mocks) - req.body = init.body; - return req; - }; - return Client; - })(sdk.core.Observable); - http.Client = Client; - })(http = sdk.http || (sdk.http = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -/// -/// -/// -/// -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var platform; - (function (platform) { - var Queue = (function () { - function Queue(cache, cacheId) { - this._cache = cache; - this._cacheId = cacheId; - this.setPollInterval(250); - this.setReleaseTimeout(5000); // If queue was not released then force it to do so after some timeout - } - Queue.prototype.isPaused = function () { - var storage = this._cache, cacheId = this._cacheId, time = storage.getItem(cacheId); - return !!time && Date.now() - parseInt(time) < this._releaseTimeout; - }; - Queue.prototype.pause = function () { - this._cache.setItem(this._cacheId, Date.now()); - return this; - }; - Queue.prototype.resume = function () { - this._cache.removeItem(this._cacheId); - return this; - }; - Queue.prototype.poll = function () { - var _this = this; - if (this._promise) - return this._promise; - this._promise = new sdk.externals._Promise(function (resolve, reject) { - sdk.core.utils.poll(function (next) { - if (_this.isPaused()) - return next(); - _this._promise = null; - _this.resume(); // this is actually not needed but why not - resolve(null); - }, _this._pollInterval); - }); - return this._promise; - }; - Queue.prototype.releaseTimeout = function () { - return this._releaseTimeout; - }; - Queue.prototype.pollInterval = function () { - return this._pollInterval; - }; - Queue.prototype.setReleaseTimeout = function (releaseTimeout) { - this._releaseTimeout = releaseTimeout; - return this; - }; - Queue.prototype.setPollInterval = function (pollInterval) { - this._pollInterval = pollInterval; - return this; - }; - return Queue; - })(); - platform.Queue = Queue; - })(platform = sdk.platform || (sdk.platform = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -/// -/// -/// -/// -/// -/// -/// -/// -/// -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var platform; - (function (platform) { - var Platform = (function (_super) { - __extends(Platform, _super); - function Platform(client, cache, server, appKey, appSecret) { - _super.call(this); - this._refreshDelayMs = 100; - this._clearCacheOnRefreshError = true; - this._cacheId = 'platform'; - this.events = { - accessViolation: 'accessViolation', - logoutSuccess: 'logoutSuccess', - logoutError: 'logoutError', - authorizeSuccess: 'authorizeSuccess', - authorizeError: 'authorizeError', - refreshSuccess: 'refreshSuccess', - refreshError: 'refreshError' - }; - this._server = server; - this._appKey = appKey; - this._appSecret = appSecret; - this._cache = cache; - this._client = client; - this._queue = new platform.Queue(this._cache, this._cacheId + '-refresh'); - this._auth = new platform.Auth(this._cache, this._cacheId); - } - Platform.prototype.auth = function () { - return this._auth; - }; - Platform.prototype.createUrl = function (path, options) { - path = path || ''; - options = options || {}; - var builtUrl = '', hasHttp = path.indexOf('http://') != -1 || path.indexOf('https://') != -1; - if (options.addServer && !hasHttp) - builtUrl += this._server; - if (path.indexOf(Platform._urlPrefix) == -1 && !hasHttp) - builtUrl += Platform._urlPrefix + '/' + Platform._apiVersion; - builtUrl += path; - if (options.addMethod || options.addToken) - builtUrl += (path.indexOf('?') > -1 ? '&' : '?'); - if (options.addMethod) - builtUrl += '_method=' + options.addMethod; - if (options.addToken) - builtUrl += (options.addMethod ? '&' : '') + 'access_token=' + this._auth.accessToken(); - return builtUrl; - }; - Platform.prototype.authUrl = function (options) { - options = options || {}; - return this.createUrl(Platform._authorizeEndpoint + '?' + sdk.core.utils.queryStringify({ - 'response_type': 'code', - 'redirect_uri': options.redirectUri || '', - 'client_id': this._appKey, - 'state': options.state || '', - 'brand_id': options.brandId || '', - 'display': options.display || '', - 'prompt': options.prompt || '' - }), { addServer: true }); - }; - Platform.prototype.parseAuthRedirectUrl = function (url) { - var qs = sdk.core.utils.parseQueryString(url.split('?').reverse()[0]), error = qs.error_description || qs.error; - if (error) { - var e = new Error(error); - e.error = qs.error; - throw e; - } - return qs; - }; - Platform.prototype.loggedIn = function () { - return this._ensureAuthentication() - .then(function () { - return true; - }) - .catch(function () { - return false; - }); - }; - Platform.prototype.login = function (options) { - var _this = this; - options = options || {}; - options.remember = options.remember || false; - var body = { - "access_token_ttl": Platform._accessTokenTtl, - "refresh_token_ttl": options.remember ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl - }; - if (!options.code) { - body.grant_type = 'password'; - body.username = options.username; - body.password = options.password; - body.extension = options.extension || ''; - } - else if (options.code) { - body.grant_type = 'authorization_code'; - body.code = options.code; - body.redirect_uri = options.redirectUri; - } - if (options.endpointId) - body.endpoint_id = options.endpointId; - return this._tokenRequest(Platform._tokenEndpoint, body).then(function (res) { - _this._auth - .setData(res.json()) - .setRemember(options.remember); - _this.emit(_this.events.authorizeSuccess, res); - return res; - }).catch(function (e) { - _this._cache.clean(); - _this.emit(_this.events.authorizeError, e); - throw e; - }); - }; - Platform.prototype.refresh = function () { - var _this = this; - var refresh = new sdk.externals._Promise(function (resolve, reject) { - if (_this._queue.isPaused()) { - return resolve(_this._refreshPolling()); - } - _this._queue.pause(); - // Make sure all existing AJAX calls had a chance to reach the server - setTimeout(function () { - sdk.core.log.debug('Platform.refresh(): Performing token refresh (access token', _this._auth.accessToken(), ', refresh token', _this._auth.refreshToken(), ')'); - // Perform sanity checks - if (!_this._auth.refreshToken()) - return reject(new Error('Refresh token is missing')); - if (!_this._auth.refreshTokenValid()) - return reject(new Error('Refresh token has expired')); - if (!_this._queue.isPaused()) - return reject(new Error('Queue was resumed before refresh call')); - resolve(_this._tokenRequest(Platform._tokenEndpoint, { - "grant_type": "refresh_token", - "refresh_token": _this._auth.refreshToken(), - "access_token_ttl": Platform._accessTokenTtl, - "refresh_token_ttl": _this._auth.remember() ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl - })); - }, _this._refreshDelayMs); - }); - return refresh.then(function (res) { - // This means refresh has happened elsewhere and we are here because of timeout - if (res && res.json && res.json()) { - var json = res.json(); - sdk.core.log.info('Platform.refresh(): Token was refreshed', res); - if (!json.refresh_token || !json.access_token) { - throw sdk.http.Client.makeError(new Error('Malformed OAuth response'), res); - } - _this._auth.setData(json); - _this._queue.resume(); - } - _this.emit(_this.events.refreshSuccess, res); - return res; - }).catch(function (e) { - e = sdk.http.Client.makeError(e); - if (_this._clearCacheOnRefreshError) { - _this._cache.clean(); - } - _this.emit(_this.events.accessViolation, e); - _this.emit(_this.events.refreshError, e); - throw e; - }); - }; - /** - * @returns {Promise} - */ - Platform.prototype.logout = function () { - var _this = this; - this._queue.pause(); - return this._tokenRequest(Platform._revokeEndpoint, { - token: this._auth.accessToken() - }).then(function (res) { - _this._queue.resume(); - _this._cache.clean(); - _this.emit(_this.events.logoutSuccess, res); - return res; - }).catch(function (e) { - _this._queue.resume(); - _this.emit(_this.events.accessViolation, e); - _this.emit(_this.events.logoutError, e); - throw e; - }); - }; - Platform.prototype.inflateRequest = function (request, options) { - var _this = this; - options = options || {}; - if (options.skipAuthCheck) - return sdk.externals._Promise.resolve(request); - return this - ._ensureAuthentication() - .then(function () { - request.headers.set('Authorization', _this._authHeader()); - request.url = _this.createUrl(request.url, { addServer: true }); - //TODO Add User-Agent here - return request; - }); - }; - Platform.prototype.sendRequest = function (request, options) { - var _this = this; - return this - .inflateRequest(request, options) - .then(function (req) { - return _this._client.sendRequest(req); - }) - .catch(function (e) { - // Guard is for errors that come from polling - if (!e.apiResponse || !e.apiResponse.response() || (e.apiResponse.response().status != 401)) - throw e; - _this._auth.cancelAccessToken(); - return _this.sendRequest(request, options); - }); - }; - /** - * General purpose function to send anything to server - */ - Platform.prototype.send = function (url, options) { - try { - //FIXME https://github.com/bitinn/node-fetch/issues/43 - url = this.createUrl(url, { addServer: true }); - return this.sendRequest(sdk.http.Client.createRequest(url, options), options); - } - catch (e) { - return sdk.externals._Promise.reject(e); - } - }; - Platform.prototype.get = function (url, options) { - options = options || {}; - options.method = 'GET'; - return this.send(url, options); - }; - Platform.prototype.post = function (url, options) { - options = options || {}; - options.method = 'POST'; - return this.send(url, options); - }; - Platform.prototype.put = function (url, options) { - options = options || {}; - options.method = 'PUT'; - return this.send(url, options); - }; - Platform.prototype['delete'] = function (url, options) { - options = options || {}; - options.method = 'DELETE'; - return this.send(url, options); - }; - Platform.prototype._tokenRequest = function (path, body) { - return this.send(path, { - skipAuthCheck: true, - body: body, - method: 'POST', - headers: { - 'Authorization': 'Basic ' + this._apiKey(), - 'Content-Type': 'application/x-www-form-urlencoded' - } - }); - }; - Platform.prototype._ensureAuthentication = function () { - if (this._isAccessTokenValid()) - return sdk.externals._Promise.resolve(null); - return this.refresh(); - }; - Platform.prototype._isAccessTokenValid = function () { - return (this._auth.accessTokenValid() && !this._queue.isPaused()); - }; - Platform.prototype._refreshPolling = function () { - var _this = this; - sdk.core.log.warn('Platform.refresh(): Refresh is already in progress, polling started'); - return this._queue.poll().then(function () { - if (!_this._isAccessTokenValid()) { - throw new Error('Automatic authentification timeout'); - } - return null; - }); - }; - Platform.prototype._apiKey = function () { - var apiKey = this._appKey + ':' + this._appSecret; - return (typeof btoa == 'function') ? btoa(apiKey) : new Buffer(apiKey).toString('base64'); - }; - Platform.prototype._authHeader = function () { - var token = this._auth.accessToken(); - return this._auth.tokenType() + (token ? ' ' + token : ''); - }; - Platform._urlPrefix = '/restapi'; - Platform._apiVersion = 'v1.0'; - Platform._accessTokenTtl = null; // Platform server by default sets it to 60 * 60 = 1 hour - Platform._refreshTokenTtl = 10 * 60 * 60; // 10 hours - Platform._refreshTokenTtlRemember = 7 * 24 * 60 * 60; // 1 week - Platform._tokenEndpoint = '/restapi/oauth/token'; - Platform._revokeEndpoint = '/restapi/oauth/revoke'; - Platform._authorizeEndpoint = '/restapi/oauth/authorize'; - return Platform; - })(sdk.core.Observable); - platform.Platform = Platform; - })(platform = sdk.platform || (sdk.platform = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -/// -/// -/// -/// -/// -/// -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var subscription; - (function (subscription_1) { - var Subscription = (function (_super) { - __extends(Subscription, _super); - function Subscription(pubnubFactory, platform) { - _super.call(this); - this._renewHandicapMs = 2 * 60 * 1000; - this.events = { - notification: 'notification', - removeSuccess: 'removeSuccess', - removeError: 'removeError', - renewSuccess: 'renewSuccess', - renewError: 'renewError', - subscribeSuccess: 'subscribeSuccess', - subscribeError: 'subscribeError' - }; - this._pubnubFactory = pubnubFactory; - this._platform = platform; - this._pubnub = null; - this._eventFilters = []; - this._timeout = null; - this._subscription = null; - } - Subscription.prototype.alive = function () { - return this._subscription && - this._subscription.id && - this._subscription.deliveryMode && - this._subscription.deliveryMode.subscriberKey && - this._subscription.deliveryMode.address; - }; - Subscription.prototype.setSubscription = function (subscription) { - this._clearTimeout(); - this._subscription = subscription; - if (!this._pubnub) - this._subscribeAtPubnub(); - this._setTimeout(); - return this; - }; - Subscription.prototype.subscription = function () { - return this._subscription; - }; - /** - * Creates or updates subscription if there is an active one - * @param {{events?:string[]}} [options] New array of events - * @returns {Promise} - */ - Subscription.prototype.register = function (options) { - if (this.alive()) { - return this.renew(options); - } - else { - return this.subscribe(options); - } - }; - Subscription.prototype.addEvents = function (events) { - this._eventFilters = this._eventFilters.concat(events); - return this; - }; - Subscription.prototype.setEvents = function (events) { - this._eventFilters = events; - return this; - }; - Subscription.prototype.subscribe = function (options) { - var _this = this; - options = options || {}; - if (options.events) - this.setEvents(options.events); - this._clearTimeout(); - return new sdk.externals._Promise(function (resolve, reject) { - if (!_this._eventFilters || !_this._eventFilters.length) - throw new Error('Events are undefined'); - resolve(_this._platform.post('/restapi/v1.0/subscription', { - body: { - eventFilters: _this._getFullEventFilters(), - deliveryMode: { - transportType: 'PubNub' - } - } - })); - }).then(function (ajax) { - _this.setSubscription(ajax.json()) - .emit(_this.events.subscribeSuccess, ajax); - return ajax; - }).catch(function (e) { - e = sdk.http.Client.makeError(e); - _this.reset() - .emit(_this.events.subscribeError, e); - throw e; - }); - }; - Subscription.prototype.renew = function (options) { - var _this = this; - options = options || {}; - if (options.events) - this.setEvents(options.events); - this._clearTimeout(); - return new sdk.externals._Promise(function (resolve, reject) { - if (!_this.alive()) - throw new Error('Subscription is not alive'); - if (!_this._eventFilters || !_this._eventFilters.length) - throw new Error('Events are undefined'); - return _this._platform.put('/restapi/v1.0/subscription/' + _this._subscription.id, { - body: { - eventFilters: _this._getFullEventFilters() - } - }); - }) - .then(function (ajax) { - _this.setSubscription(ajax.json()) - .emit(_this.events.renewSuccess, ajax.json()); - return ajax; - }) - .catch(function (e) { - e = sdk.http.Client.makeError(e); - _this.reset() - .emit(_this.events.renewError, e); - throw e; - }); - }; - Subscription.prototype.remove = function () { - var _this = this; - return new sdk.externals._Promise(function (resolve, reject) { - if (!_this._subscription || !_this._subscription.id) - throw new Error('Subscription ID is required'); - resolve(_this._platform.delete('/restapi/v1.0/subscription/' + _this._subscription.id)); - }).then(function (ajax) { - _this.reset() - .emit(_this.events.removeSuccess, ajax); - return ajax; - }).catch(function (e) { - e = sdk.http.Client.makeError(e); - _this.emit(_this.events.removeError, e); - throw e; - }); - }; - /** - * Remove subscription and disconnect from PUBNUB - * This method resets subscription at client side but backend is not notified - */ - Subscription.prototype.reset = function () { - this._clearTimeout(); - if (this.alive() && this._pubnub) - this._pubnub.unsubscribe({ channel: this._subscription.deliveryMode.address }); - this._subscription = null; - return this; - }; - Subscription.prototype.destroy = function () { - this.reset(); - sdk.core.log.info('RC.subscription.Subscription: Destroyed'); - return _super.prototype.destroy.call(this); - }; - Subscription.prototype._getFullEventFilters = function () { - var _this = this; - return this._eventFilters.map(function (event) { - return _this._platform.createUrl(event); - }); - }; - Subscription.prototype._setTimeout = function () { - var _this = this; - this._clearTimeout(); - if (!this.alive()) - throw new Error('Subscription is not alive'); - var timeToExpiration = (this._subscription.expiresIn * 1000) - this._renewHandicapMs; - this._timeout = setTimeout(function () { - _this.renew({}); - }, timeToExpiration); - return this; - }; - Subscription.prototype._clearTimeout = function () { - clearTimeout(this._timeout); - return this; - }; - Subscription.prototype._decrypt = function (message) { - if (!this.alive()) - throw new Error('Subscription is not alive'); - if (this._subscription.deliveryMode.encryptionKey) { - var PUBNUB = this._pubnubFactory.getPubnub(); - message = PUBNUB.crypto_obj.decrypt(message, this._subscription.deliveryMode.encryptionKey, { - encryptKey: false, - keyEncoding: 'base64', - keyLength: 128, - mode: 'ecb' - }); - } - return message; - }; - Subscription.prototype._notify = function (message) { - this.emit(this.events.notification, this._decrypt(message)); - return this; - }; - Subscription.prototype._subscribeAtPubnub = function () { - var _this = this; - if (!this.alive()) - throw new Error('Subscription is not alive'); - var PUBNUB = this._pubnubFactory.getPubnub(); - this._pubnub = PUBNUB.init({ - ssl: true, - subscribe_key: this._subscription.deliveryMode.subscriberKey - }); - this._pubnub.ready(); - this._pubnub.subscribe({ - channel: this._subscription.deliveryMode.address, - message: function (message, env, channel) { - sdk.core.log.info('RC.core.Subscription: Incoming message', message); - _this._notify(message); - }, - connect: function () { - sdk.core.log.info('RC.core.Subscription: PUBNUB connected'); + + failed && fail(response); + }; + + // Send + try { + xhr = FDomainRequest() || + window.XDomainRequest && + new XDomainRequest() || + new XMLHttpRequest(); + + xhr.onerror = xhr.onabort = function(e){ done( + 1, e || (xhr && xhr.responseText) || { "error" : "Network Connection Error"} + ) }; + xhr.onload = xhr.onloadend = finished; + xhr.onreadystatechange = function() { + if (xhr && xhr.readyState == 4) { + switch(xhr.status) { + case 200: + break; + default: + try { + response = JSON['parse'](xhr.responseText); + done(1,response); } - }); - return this; - }; - return Subscription; - })(sdk.core.Observable); - subscription_1.Subscription = Subscription; - })(subscription = sdk.subscription || (sdk.subscription = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -/// -/// -/// -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var pubnub; - (function (pubnub) { - var PubnubMock = (function (_super) { - __extends(PubnubMock, _super); - function PubnubMock(options) { - _super.call(this); - this.options = options; - this.crypto_obj = sdk.externals._PUBNUB.crypto_obj; - } - PubnubMock.prototype.ready = function () { }; - PubnubMock.prototype.subscribe = function (options) { - this.on('message-' + options.channel, options.message); - }; - PubnubMock.prototype.unsubscribe = function (options) { - this.off('message-' + options.channel); - }; - PubnubMock.prototype.receiveMessage = function (msg, channel) { - this.emit('message-' + channel, msg, 'env', channel); - }; - return PubnubMock; - })(sdk.core.Observable); - pubnub.PubnubMock = PubnubMock; - var PubnubMockFactory = (function () { - function PubnubMockFactory() { - this.crypto_obj = sdk.externals._PUBNUB.crypto_obj; - } - PubnubMockFactory.prototype.init = function (options) { - return new PubnubMock(options); - }; - return PubnubMockFactory; - })(); - pubnub.PubnubMockFactory = PubnubMockFactory; - })(pubnub = sdk.pubnub || (sdk.pubnub = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -/// -/// -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var pubnub; - (function (pubnub) { - var PubnubFactory = (function () { - function PubnubFactory(flag) { - this._useMock = false; - this._useMock = !!flag; - this._mock = new pubnub.PubnubMockFactory(); + catch (r) { return done(1, {status : xhr.status, payload : null, message : xhr.responseText}); } + return; } - PubnubFactory.prototype.getPubnub = function () { - return this._useMock ? this._mock : sdk.externals._PUBNUB; - }; - return PubnubFactory; - })(); - pubnub.PubnubFactory = PubnubFactory; - })(pubnub = sdk.pubnub || (sdk.pubnub = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var SDK = (function () { - function SDK(options) { - options = options || {}; - sdk.externals.get(); - this._mockRegistry = new sdk.mocks.Registry(); - this._cache = new sdk.core.Cache(typeof localStorage !== 'undefined' ? localStorage : {}, options.cachePrefix); - this._client = options.useHttpMock ? new sdk.http.ClientMock(this._mockRegistry) : new sdk.http.Client(); - this._platform = new sdk.platform.Platform(this._client, this._cache, options.server, options.appKey, options.appSecret); - this._pubnubFactory = new sdk.pubnub.PubnubFactory(options.usePubnubMock); - //TODO Link Platform events with Subscriptions and the rest } - SDK.prototype.platform = function () { - return this._platform; - }; - SDK.prototype.cache = function () { - return this._cache; - }; - SDK.prototype.createSubscription = function () { - return new sdk.subscription.Subscription(this._pubnubFactory, this._platform); - }; - SDK.prototype.createPageVisibility = function () { - return new sdk.core.PageVisibility(); - }; - SDK.prototype.createObservable = function () { - return new sdk.core.Observable(); - }; - SDK.prototype.log = function () { - return sdk.core.log; - }; - SDK.prototype.utils = function () { - return sdk.core.utils; - }; - SDK.prototype.mockRegistry = function () { return this._mockRegistry; }; - SDK.version = '2.0.0'; - SDK.server = { - sandbox: 'https://platform.devtest.ringcentral.com', - production: 'https://platform.ringcentral.com' - }; - return SDK; - })(); - sdk.SDK = SDK; - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -var e = RingCentral.sdk.externals.get(); -if (typeof define === 'function' && define.amd) { - define(['pubnub'], function (PUBNUB) { - e._PUBNUB = PUBNUB; - return RingCentral.sdk; - }); + } + + var url = build_url(setup.url,data); + + xhr.open( 'GET', url, async ); + if (async) xhr.timeout = xhrtme; + xhr.send(); + } + catch(eee) { + done(0); + XORIGN = 0; + return xdr(setup); + } + + // Return 'done' + return done; } -else if (typeof module === 'object' && module.exports) { - e._PUBNUB = require('pubnub'); - e._Promise = typeof (Promise) !== 'undefined' ? Promise : require('es6-promise').Promise; - e._fetch = require('node-fetch'); - e._Request = e._fetch['Request']; - e._Response = e._fetch['Response']; - e._Headers = e._fetch['Headers']; - module.exports = RingCentral.sdk; + +// Test Connection State +function _is_online() { + if (!('onLine' in navigator)) return 1; + try { return navigator['onLine'] } + catch (e) { return true } } -else { + + +function sendBeacon(url) { + if (!('sendBeacon' in navigator)) return false; + + return navigator['sendBeacon'](url); } -/// -/// -/// -/// -/// -/// -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var http; - (function (http) { - var ClientMock = (function (_super) { - __extends(ClientMock, _super); - function ClientMock(registry) { - _super.call(this); - this._registry = registry; - } - ClientMock.prototype._loadResponse = function (request) { - var _this = this; - return new sdk.externals._Promise(function (resolve) { - sdk.core.log.debug('API REQUEST', request.method, request.url); - var mock = _this._registry.find(request); - resolve(mock.getResponse(request)); - }); - }; - return ClientMock; - })(http.Client); - http.ClientMock = ClientMock; - })(http = sdk.http || (sdk.http = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -/// -/// -/// -/// -/// -/// -/// -/// -/// -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var platform; - (function (platform) { - var Auth = (function () { - function Auth(cache, cacheId) { - this._cache = cache; - this._cacheId = cacheId; - } - Auth.prototype.accessToken = function () { - return this.data().access_token; - }; - Auth.prototype.refreshToken = function () { - return this.data().refresh_token; - }; - Auth.prototype.tokenType = function () { - return this.data().token_type; - }; - Auth.prototype.data = function () { - return this._cache.getItem(this._cacheId) || { - token_type: '', - access_token: '', - expires_in: 0, - refresh_token: '', - refresh_token_expires_in: 0 - }; - }; - Auth.prototype.setData = function (authData) { - var oldAuthData = this.data(); - authData = sdk.core.utils.extend({}, oldAuthData, authData); - authData.expire_time = Date.now() + (authData.expires_in * 1000); - authData.refresh_token_expire_time = Date.now() + (authData.refresh_token_expires_in * 1000); - sdk.core.log.info('Auth.setData(): Tokens were updated, new:', authData, ', old:', oldAuthData); - this._cache.setItem(this._cacheId, authData); - return this; - }; - /** - * Check if there is a valid (not expired) access token - */ - Auth.prototype.accessTokenValid = function () { - var authData = this.data(); - return (authData.token_type === Auth.forcedTokenType || (authData.expire_time - Auth.refreshHandicapMs > Date.now())); - }; - /** - * Check if there is a valid (not expired) access token - */ - Auth.prototype.refreshTokenValid = function () { - return (this.data().refresh_token_expire_time > Date.now()); - }; - Auth.prototype.cancelAccessToken = function () { - return this.setData({ - access_token: '', - expires_in: 0 - }); - }; - /** - * This method sets a special authentication mode used in Service Web - * @return {Platform} - */ - Auth.prototype.forceAuthentication = function () { - this.setData({ - token_type: Auth.forcedTokenType, - access_token: '', - expires_in: 0, - refresh_token: '', - refresh_token_expires_in: 0 - }); - return this; - }; - Auth.prototype.setRemember = function (remember) { - return this.setData({ remember: remember }); - }; - Auth.prototype.remember = function () { - return !!this.data().remember; - }; - Auth.refreshHandicapMs = 60 * 1000; // 1 minute - Auth.forcedTokenType = 'forced'; - return Auth; - })(); - platform.Auth = Auth; - })(platform = sdk.platform || (sdk.platform = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); - -/*! - * @overview es6-promise - a tiny implementation of Promises/A+. - * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) - * @license Licensed under MIT license - * See https://raw.githubusercontent.com/jakearchibald/es6-promise/master/LICENSE - * @version 2.2.0 - */ -(function() { - "use strict"; - function lib$es6$promise$utils$$objectOrFunction(x) { - return typeof x === 'function' || (typeof x === 'object' && x !== null); - } +/* =-====================================================================-= */ +/* =-====================================================================-= */ +/* =-========================= PUBNUB ===========================-= */ +/* =-====================================================================-= */ +/* =-====================================================================-= */ + +var PDIV = $('pubnub') || 0 +, CREATE_PUBNUB = function(setup) { - function lib$es6$promise$utils$$isFunction(x) { - return typeof x === 'function'; - } + // Force JSONP if requested from user. + if (setup['jsonp']) XORIGN = 0; + else XORIGN = UA.indexOf('MSIE 6') == -1; - function lib$es6$promise$utils$$isMaybeThenable(x) { - return typeof x === 'object' && x !== null; - } + var SUBSCRIBE_KEY = setup['subscribe_key'] || '' + , KEEPALIVE = (+setup['keepalive'] || DEF_KEEPALIVE) * SECOND + , UUID = setup['uuid'] || db['get'](SUBSCRIBE_KEY+'uuid')||''; - var lib$es6$promise$utils$$_isArray; - if (!Array.isArray) { - lib$es6$promise$utils$$_isArray = function (x) { - return Object.prototype.toString.call(x) === '[object Array]'; - }; - } else { - lib$es6$promise$utils$$_isArray = Array.isArray; - } + var leave_on_unload = setup['leave_on_unload'] || 0; - var lib$es6$promise$utils$$isArray = lib$es6$promise$utils$$_isArray; - var lib$es6$promise$asap$$len = 0; - var lib$es6$promise$asap$$toString = {}.toString; - var lib$es6$promise$asap$$vertxNext; - var lib$es6$promise$asap$$customSchedulerFn; + setup['xdr'] = xdr; + setup['db'] = db; + setup['error'] = setup['error'] || error; + setup['_is_online'] = _is_online; + setup['jsonp_cb'] = jsonp_cb; + setup['hmac_SHA256']= get_hmac_SHA256; + setup['crypto_obj'] = crypto_obj(); + setup['sendBeacon'] = sendBeacon; + setup['params'] = { 'pnsdk' : PNSDK } - function lib$es6$promise$asap$$asap(callback, arg) { - lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len] = callback; - lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len + 1] = arg; - lib$es6$promise$asap$$len += 2; - if (lib$es6$promise$asap$$len === 2) { - // If len is 2, that means that we need to schedule an async flush. - // If additional callbacks are queued before the queue is flushed, they - // will be processed by this flush that we are scheduling. - if (lib$es6$promise$asap$$customSchedulerFn) { - lib$es6$promise$asap$$customSchedulerFn(lib$es6$promise$asap$$flush); - } else { - lib$es6$promise$asap$$scheduleFlush(); + var SELF = function(setup) { + return CREATE_PUBNUB(setup); + }; + + var PN = PN_API(setup); + + for (var prop in PN) { + if (PN.hasOwnProperty(prop)) { + SELF[prop] = PN[prop]; } - } } + SELF['css'] = css; + SELF['$'] = $; + SELF['create'] = create; + SELF['bind'] = bind; + SELF['head'] = head; + SELF['search'] = search; + SELF['attr'] = attr; + SELF['events'] = events; + SELF['init'] = SELF; + SELF['secure'] = SELF; + SELF['crypto_obj'] = crypto_obj(); // export to instance - var lib$es6$promise$asap$$default = lib$es6$promise$asap$$asap; - function lib$es6$promise$asap$$setScheduler(scheduleFn) { - lib$es6$promise$asap$$customSchedulerFn = scheduleFn; - } - var lib$es6$promise$asap$$browserWindow = (typeof window !== 'undefined') ? window : undefined; - var lib$es6$promise$asap$$browserGlobal = lib$es6$promise$asap$$browserWindow || {}; - var lib$es6$promise$asap$$BrowserMutationObserver = lib$es6$promise$asap$$browserGlobal.MutationObserver || lib$es6$promise$asap$$browserGlobal.WebKitMutationObserver; - var lib$es6$promise$asap$$isNode = typeof process !== 'undefined' && {}.toString.call(process) === '[object process]'; + // Add Leave Functions + bind( 'beforeunload', window, function() { + if (leave_on_unload) SELF['each-channel'](function(ch){ SELF['LEAVE']( ch.name, 0 ) }); + return true; + } ); - // test for web worker but not in IE10 - var lib$es6$promise$asap$$isWorker = typeof Uint8ClampedArray !== 'undefined' && - typeof importScripts !== 'undefined' && - typeof MessageChannel !== 'undefined'; + // Return without Testing + if (setup['notest']) return SELF; - // node - function lib$es6$promise$asap$$useNextTick() { - var nextTick = process.nextTick; - // node version 0.10.x displays a deprecation warning when nextTick is used recursively - // setImmediate should be used instead instead - var version = process.versions.node.match(/^(?:(\d+)\.)?(?:(\d+)\.)?(\*|\d+)$/); - if (Array.isArray(version) && version[1] === '0' && version[2] === '10') { - nextTick = setImmediate; - } - return function() { - nextTick(lib$es6$promise$asap$$flush); - }; - } + bind( 'offline', window, SELF['offline'] ); + bind( 'offline', document, SELF['offline'] ); - // vertx - function lib$es6$promise$asap$$useVertxTimer() { - return function() { - lib$es6$promise$asap$$vertxNext(lib$es6$promise$asap$$flush); - }; - } + // Return PUBNUB Socket Object + return SELF; +}; +CREATE_PUBNUB['init'] = CREATE_PUBNUB; +CREATE_PUBNUB['secure'] = CREATE_PUBNUB; +CREATE_PUBNUB['crypto_obj'] = crypto_obj(); // export to constructor - function lib$es6$promise$asap$$useMutationObserver() { - var iterations = 0; - var observer = new lib$es6$promise$asap$$BrowserMutationObserver(lib$es6$promise$asap$$flush); - var node = document.createTextNode(''); - observer.observe(node, { characterData: true }); +// Bind for PUBNUB Readiness to Subscribe +if (document.readyState === 'complete') { + timeout( ready, 0 ); +} +else { + bind( 'load', window, function(){ timeout( ready, 0 ) } ); +} - return function() { - node.data = (iterations = ++iterations % 2); - }; - } +var pdiv = PDIV || {}; - // web worker - function lib$es6$promise$asap$$useMessageChannel() { - var channel = new MessageChannel(); - channel.port1.onmessage = lib$es6$promise$asap$$flush; - return function () { - channel.port2.postMessage(0); - }; - } +// CREATE A PUBNUB GLOBAL OBJECT +PUBNUB = CREATE_PUBNUB({ + 'notest' : 1, + 'publish_key' : attr( pdiv, 'pub-key' ), + 'subscribe_key' : attr( pdiv, 'sub-key' ), + 'ssl' : !document.location.href.indexOf('https') || + attr( pdiv, 'ssl' ) == 'on', + 'origin' : attr( pdiv, 'origin' ), + 'uuid' : attr( pdiv, 'uuid' ) +}); - function lib$es6$promise$asap$$useSetTimeout() { - return function() { - setTimeout(lib$es6$promise$asap$$flush, 1); - }; - } +// jQuery Interface +window['jQuery'] && (window['jQuery']['PUBNUB'] = CREATE_PUBNUB); - var lib$es6$promise$asap$$queue = new Array(1000); - function lib$es6$promise$asap$$flush() { - for (var i = 0; i < lib$es6$promise$asap$$len; i+=2) { - var callback = lib$es6$promise$asap$$queue[i]; - var arg = lib$es6$promise$asap$$queue[i+1]; +// For Modern JS + Testling.js - http://testling.com/ +typeof(module) !== 'undefined' && (module['exports'] = PUBNUB) && ready(); - callback(arg); +var pubnubs = $('pubnubs') || 0; - lib$es6$promise$asap$$queue[i] = undefined; - lib$es6$promise$asap$$queue[i+1] = undefined; - } +// LEAVE NOW IF NO PDIV. +if (!PDIV) return; - lib$es6$promise$asap$$len = 0; - } +// PUBNUB Flash Socket +css( PDIV, { 'position' : 'absolute', 'top' : -SECOND } ); - function lib$es6$promise$asap$$attemptVertex() { - try { - var r = require; - var vertx = r('vertx'); - lib$es6$promise$asap$$vertxNext = vertx.runOnLoop || vertx.runOnContext; - return lib$es6$promise$asap$$useVertxTimer(); - } catch(e) { - return lib$es6$promise$asap$$useSetTimeout(); - } - } +if ('opera' in window || attr( PDIV, 'flash' )) PDIV['innerHTML'] = + ''; - var lib$es6$promise$asap$$scheduleFlush; - // Decide what async method to use to triggering processing of queued callbacks: - if (lib$es6$promise$asap$$isNode) { - lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useNextTick(); - } else if (lib$es6$promise$asap$$BrowserMutationObserver) { - lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMutationObserver(); - } else if (lib$es6$promise$asap$$isWorker) { - lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMessageChannel(); - } else if (lib$es6$promise$asap$$browserWindow === undefined && typeof require === 'function') { - lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$attemptVertex(); - } else { - lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useSetTimeout(); - } +// Create Interface for Opera Flash +PUBNUB['rdx'] = function( id, data ) { + if (!data) return FDomainRequest[id]['onerror'](); + FDomainRequest[id]['responseText'] = unescape(data); + FDomainRequest[id]['onload'](); +}; - function lib$es6$promise$$internal$$noop() {} +function FDomainRequest() { + if (!pubnubs || !pubnubs['get']) return 0; - var lib$es6$promise$$internal$$PENDING = void 0; - var lib$es6$promise$$internal$$FULFILLED = 1; - var lib$es6$promise$$internal$$REJECTED = 2; + var fdomainrequest = { + 'id' : FDomainRequest['id']++, + 'send' : function() {}, + 'abort' : function() { fdomainrequest['id'] = {} }, + 'open' : function( method, url ) { + FDomainRequest[fdomainrequest['id']] = fdomainrequest; + pubnubs['get']( fdomainrequest['id'], url ); + } + }; + + return fdomainrequest; +} +FDomainRequest['id'] = SECOND; + +})(); +(function(){ + +// --------------------------------------------------------------------------- +// WEBSOCKET INTERFACE +// --------------------------------------------------------------------------- +var WS = PUBNUB['ws'] = function( url, protocols ) { + if (!(this instanceof WS)) return new WS( url, protocols ); + + var self = this + , url = self.url = url || '' + , protocol = self.protocol = protocols || 'Sec-WebSocket-Protocol' + , bits = url.split('/') + , setup = { + 'ssl' : bits[0] === 'wss:' + ,'origin' : bits[2] + ,'publish_key' : bits[3] + ,'subscribe_key' : bits[4] + ,'channel' : bits[5] + }; - var lib$es6$promise$$internal$$GET_THEN_ERROR = new lib$es6$promise$$internal$$ErrorObject(); + // READY STATES + self['CONNECTING'] = 0; // The connection is not yet open. + self['OPEN'] = 1; // The connection is open and ready to communicate. + self['CLOSING'] = 2; // The connection is in the process of closing. + self['CLOSED'] = 3; // The connection is closed or couldn't be opened. - function lib$es6$promise$$internal$$selfFullfillment() { - return new TypeError("You cannot resolve a promise with itself"); - } + // CLOSE STATES + self['CLOSE_NORMAL'] = 1000; // Normal Intended Close; completed. + self['CLOSE_GOING_AWAY'] = 1001; // Closed Unexpecttedly. + self['CLOSE_PROTOCOL_ERROR'] = 1002; // Server: Not Supported. + self['CLOSE_UNSUPPORTED'] = 1003; // Server: Unsupported Protocol. + self['CLOSE_TOO_LARGE'] = 1004; // Server: Too Much Data. + self['CLOSE_NO_STATUS'] = 1005; // Server: No reason. + self['CLOSE_ABNORMAL'] = 1006; // Abnormal Disconnect. - function lib$es6$promise$$internal$$cannotReturnOwn() { - return new TypeError('A promises callback cannot return that same promise.'); - } + // Events Default + self['onclose'] = self['onerror'] = + self['onmessage'] = self['onopen'] = + self['onsend'] = function(){}; - function lib$es6$promise$$internal$$getThen(promise) { - try { - return promise.then; - } catch(error) { - lib$es6$promise$$internal$$GET_THEN_ERROR.error = error; - return lib$es6$promise$$internal$$GET_THEN_ERROR; - } - } + // Attributes + self['binaryType'] = ''; + self['extensions'] = ''; + self['bufferedAmount'] = 0; + self['trasnmitting'] = false; + self['buffer'] = []; + self['readyState'] = self['CONNECTING']; - function lib$es6$promise$$internal$$tryThen(then, value, fulfillmentHandler, rejectionHandler) { - try { - then.call(value, fulfillmentHandler, rejectionHandler); - } catch(e) { - return e; - } + // Close if no setup. + if (!url) { + self['readyState'] = self['CLOSED']; + self['onclose']({ + 'code' : self['CLOSE_ABNORMAL'], + 'reason' : 'Missing URL', + 'wasClean' : true + }); + return self; } - function lib$es6$promise$$internal$$handleForeignThenable(promise, thenable, then) { - lib$es6$promise$asap$$default(function(promise) { - var sealed = false; - var error = lib$es6$promise$$internal$$tryThen(then, thenable, function(value) { - if (sealed) { return; } - sealed = true; - if (thenable !== value) { - lib$es6$promise$$internal$$resolve(promise, value); - } else { - lib$es6$promise$$internal$$fulfill(promise, value); - } - }, function(reason) { - if (sealed) { return; } - sealed = true; - - lib$es6$promise$$internal$$reject(promise, reason); - }, 'Settle: ' + (promise._label || ' unknown promise')); + // PubNub WebSocket Emulation + self.pubnub = PUBNUB['init'](setup); + self.pubnub.setup = setup; + self.setup = setup; - if (!sealed && error) { - sealed = true; - lib$es6$promise$$internal$$reject(promise, error); + self.pubnub['subscribe']({ + 'restore' : false, + 'channel' : setup['channel'], + 'disconnect' : self['onerror'], + 'reconnect' : self['onopen'], + 'error' : function() { + self['onclose']({ + 'code' : self['CLOSE_ABNORMAL'], + 'reason' : 'Missing URL', + 'wasClean' : false + }); + }, + 'callback' : function(message) { + self['onmessage']({ 'data' : message }); + }, + 'connect' : function() { + self['readyState'] = self['OPEN']; + self['onopen'](); } - }, promise); - } - - function lib$es6$promise$$internal$$handleOwnThenable(promise, thenable) { - if (thenable._state === lib$es6$promise$$internal$$FULFILLED) { - lib$es6$promise$$internal$$fulfill(promise, thenable._result); - } else if (thenable._state === lib$es6$promise$$internal$$REJECTED) { - lib$es6$promise$$internal$$reject(promise, thenable._result); - } else { - lib$es6$promise$$internal$$subscribe(thenable, undefined, function(value) { - lib$es6$promise$$internal$$resolve(promise, value); - }, function(reason) { - lib$es6$promise$$internal$$reject(promise, reason); - }); - } - } - - function lib$es6$promise$$internal$$handleMaybeThenable(promise, maybeThenable) { - if (maybeThenable.constructor === promise.constructor) { - lib$es6$promise$$internal$$handleOwnThenable(promise, maybeThenable); - } else { - var then = lib$es6$promise$$internal$$getThen(maybeThenable); + }); +}; - if (then === lib$es6$promise$$internal$$GET_THEN_ERROR) { - lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$GET_THEN_ERROR.error); - } else if (then === undefined) { - lib$es6$promise$$internal$$fulfill(promise, maybeThenable); - } else if (lib$es6$promise$utils$$isFunction(then)) { - lib$es6$promise$$internal$$handleForeignThenable(promise, maybeThenable, then); - } else { - lib$es6$promise$$internal$$fulfill(promise, maybeThenable); +// --------------------------------------------------------------------------- +// WEBSOCKET SEND +// --------------------------------------------------------------------------- +WS.prototype.send = function(data) { + var self = this; + self.pubnub['publish']({ + 'channel' : self.pubnub.setup['channel'], + 'message' : data, + 'callback' : function(response) { + self['onsend']({ 'data' : response }); } - } - } + }); +}; - function lib$es6$promise$$internal$$resolve(promise, value) { - if (promise === value) { - lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$selfFullfillment()); - } else if (lib$es6$promise$utils$$objectOrFunction(value)) { - lib$es6$promise$$internal$$handleMaybeThenable(promise, value); - } else { - lib$es6$promise$$internal$$fulfill(promise, value); - } - } +// --------------------------------------------------------------------------- +// WEBSOCKET CLOSE +// --------------------------------------------------------------------------- +WS.prototype.close = function() { + var self = this; + self.pubnub['unsubscribe']({ 'channel' : self.pubnub.setup['channel'] }); + self['readyState'] = self['CLOSED']; + self['onclose']({}); +}; - function lib$es6$promise$$internal$$publishRejection(promise) { - if (promise._onerror) { - promise._onerror(promise._result); - } +})(); +/* +CryptoJS v3.1.2 +code.google.com/p/crypto-js +(c) 2009-2013 by Jeff Mott. All rights reserved. +code.google.com/p/crypto-js/wiki/License +*/ +var 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)}}, +r=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<< +32-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, +2),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)))}}, +u=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]= +c[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; +d[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); - function lib$es6$promise$$internal$$fulfill(promise, value) { - if (promise._state !== lib$es6$promise$$internal$$PENDING) { return; } +// HMAC SHA256 +(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< +l;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+/="}})(); - if (promise._subscribers.length !== 0) { - lib$es6$promise$asap$$default(lib$es6$promise$$internal$$publish, promise); - } - } +// BlockCipher +(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])}, +_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]), +f=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, +m,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, +E,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/ +4294967296);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); +(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, +this,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, +1701076831]).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})}, +decrypt: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, +b.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)}})}(); - lib$es6$promise$asap$$default(lib$es6$promise$$internal$$publishRejection, promise); - } +// AES +(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, +16,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>>> +8&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= +d[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)})(); - function lib$es6$promise$$internal$$subscribe(parent, child, onFulfillment, onRejection) { - var subscribers = parent._subscribers; - var length = subscribers.length; +// Mode ECB +CryptoJS.mode.ECB = (function () { + var ECB = CryptoJS.lib.BlockCipherMode.extend(); - parent._onerror = null; + ECB.Encryptor = ECB.extend({ + processBlock: function (words, offset) { + this._cipher.encryptBlock(words, offset); + } + }); - subscribers[length] = child; - subscribers[length + lib$es6$promise$$internal$$FULFILLED] = onFulfillment; - subscribers[length + lib$es6$promise$$internal$$REJECTED] = onRejection; + ECB.Decryptor = ECB.extend({ + processBlock: function (words, offset) { + this._cipher.decryptBlock(words, offset); + } + }); - if (length === 0 && parent._state) { - lib$es6$promise$asap$$default(lib$es6$promise$$internal$$publish, parent); - } - } + return ECB; +}());// Moved to hmac-sha-256.js +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(7)(module))) - function lib$es6$promise$$internal$$publish(promise) { - var subscribers = promise._subscribers; - var settled = promise._state; +/***/ }, +/* 11 */ +/***/ function(module, exports) { - if (subscribers.length === 0) { return; } +'use strict'; - var child, callback, detail = promise._result; +exports.__esModule = true; - for (var i = 0; i < subscribers.length; i += 3) { - child = subscribers[i]; - callback = subscribers[i + settled]; +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; }; })(); - if (child) { - lib$es6$promise$$internal$$invokeCallback(settled, child, callback, detail); - } else { - callback(detail); - } - } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - promise._subscribers.length = 0; - } +var Cache = (function () { + _createClass(Cache, null, [{ + key: 'defaultPrefix', + value: 'rc-', + enumerable: true + }]); - function lib$es6$promise$$internal$$ErrorObject() { - this.error = null; + function Cache(storage, prefix) { + _classCallCheck(this, Cache); + + this.setPrefix(prefix); + this._storage = storage; } - var lib$es6$promise$$internal$$TRY_CATCH_ERROR = new lib$es6$promise$$internal$$ErrorObject(); + Cache.prototype.setPrefix = function setPrefix(prefix) { + this._prefix = prefix || Cache.defaultPrefix; + return this; + }; - function lib$es6$promise$$internal$$tryCatch(callback, detail) { - try { - return callback(detail); - } catch(e) { - lib$es6$promise$$internal$$TRY_CATCH_ERROR.error = e; - return lib$es6$promise$$internal$$TRY_CATCH_ERROR; - } - } + Cache.prototype.setItem = function setItem(key, data) { + this._storage[this._prefixKey(key)] = JSON.stringify(data); + return this; + }; - function lib$es6$promise$$internal$$invokeCallback(settled, promise, callback, detail) { - var hasCallback = lib$es6$promise$utils$$isFunction(callback), - value, error, succeeded, failed; + Cache.prototype.removeItem = function removeItem(key) { + delete this._storage[this._prefixKey(key)]; + return this; + }; - if (hasCallback) { - value = lib$es6$promise$$internal$$tryCatch(callback, detail); + Cache.prototype.getItem = function getItem(key) { + var item = this._storage[this._prefixKey(key)]; + if (!item) return null; + return JSON.parse(item); + }; - if (value === lib$es6$promise$$internal$$TRY_CATCH_ERROR) { - failed = true; - error = value.error; - value = null; - } else { - succeeded = true; - } + Cache.prototype.clean = function clean() { - if (promise === value) { - lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$cannotReturnOwn()); - return; + for (var key in this._storage) { + + if (!this._storage.hasOwnProperty(key)) continue; + + if (key.indexOf(this._prefix) === 0) { + delete this._storage[key]; + } } - } else { - value = detail; - succeeded = true; - } + return this; + }; - if (promise._state !== lib$es6$promise$$internal$$PENDING) { - // noop - } else if (hasCallback && succeeded) { - lib$es6$promise$$internal$$resolve(promise, value); - } else if (failed) { - lib$es6$promise$$internal$$reject(promise, error); - } else if (settled === lib$es6$promise$$internal$$FULFILLED) { - lib$es6$promise$$internal$$fulfill(promise, value); - } else if (settled === lib$es6$promise$$internal$$REJECTED) { - lib$es6$promise$$internal$$reject(promise, value); - } - } + Cache.prototype._prefixKey = function _prefixKey(key) { + return this._prefix + key; + }; - function lib$es6$promise$$internal$$initializePromise(promise, resolver) { - try { - resolver(function resolvePromise(value){ - lib$es6$promise$$internal$$resolve(promise, value); - }, function rejectPromise(reason) { - lib$es6$promise$$internal$$reject(promise, reason); - }); - } catch(e) { - lib$es6$promise$$internal$$reject(promise, e); - } - } + return Cache; +})(); - function lib$es6$promise$enumerator$$Enumerator(Constructor, input) { - var enumerator = this; +exports['default'] = Cache; +module.exports = exports['default']; - enumerator._instanceConstructor = Constructor; - enumerator.promise = new Constructor(lib$es6$promise$$internal$$noop); +/***/ }, +/* 12 */ +/***/ function(module, exports) { - if (enumerator._validateInput(input)) { - enumerator._input = input; - enumerator.length = input.length; - enumerator._remaining = input.length; +'use strict'; - enumerator._init(); +exports.__esModule = true; - if (enumerator.length === 0) { - lib$es6$promise$$internal$$fulfill(enumerator.promise, enumerator._result); - } else { - enumerator.length = enumerator.length || 0; - enumerator._enumerate(); - if (enumerator._remaining === 0) { - lib$es6$promise$$internal$$fulfill(enumerator.promise, enumerator._result); - } - } - } else { - lib$es6$promise$$internal$$reject(enumerator.promise, enumerator._validationError()); - } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + +var Observable = (function () { + function Observable() { + _classCallCheck(this, Observable); + + this.off(); } - lib$es6$promise$enumerator$$Enumerator.prototype._validateInput = function(input) { - return lib$es6$promise$utils$$isArray(input); + Observable.prototype.hasListeners = function hasListeners(event) { + return event in this._listeners; }; - lib$es6$promise$enumerator$$Enumerator.prototype._validationError = function() { - return new Error('Array Methods must be provided an Array'); - }; + Observable.prototype.on = function on(events, callback) { + var _this = this; - lib$es6$promise$enumerator$$Enumerator.prototype._init = function() { - this._result = new Array(this.length); - }; + if (typeof events == 'string') events = [events]; + if (!events) throw new Error('No events to subscribe to'); + if (typeof callback !== 'function') throw new Error('Callback must be a function'); - var lib$es6$promise$enumerator$$default = lib$es6$promise$enumerator$$Enumerator; + events.forEach(function (event) { - lib$es6$promise$enumerator$$Enumerator.prototype._enumerate = function() { - var enumerator = this; + if (!_this.hasListeners(event)) _this._listeners[event] = []; - var length = enumerator.length; - var promise = enumerator.promise; - var input = enumerator._input; + _this._listeners[event].push(callback); + }); - for (var i = 0; promise._state === lib$es6$promise$$internal$$PENDING && i < length; i++) { - enumerator._eachEntry(input[i], i); - } + return this; }; - lib$es6$promise$enumerator$$Enumerator.prototype._eachEntry = function(entry, i) { - var enumerator = this; - var c = enumerator._instanceConstructor; + Observable.prototype.emit = function emit(event) { + var _this2 = this; - if (lib$es6$promise$utils$$isMaybeThenable(entry)) { - if (entry.constructor === c && entry._state !== lib$es6$promise$$internal$$PENDING) { - entry._onerror = null; - enumerator._settledAt(entry._state, i, entry._result); - } else { - enumerator._willSettleAt(c.resolve(entry), i); + for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; } - } else { - enumerator._remaining--; - enumerator._result[i] = entry; - } - }; - lib$es6$promise$enumerator$$Enumerator.prototype._settledAt = function(state, i, value) { - var enumerator = this; - var promise = enumerator.promise; + var result = null; - if (promise._state === lib$es6$promise$$internal$$PENDING) { - enumerator._remaining--; + if (!this.hasListeners(event)) return null; - if (state === lib$es6$promise$$internal$$REJECTED) { - lib$es6$promise$$internal$$reject(promise, value); - } else { - enumerator._result[i] = value; - } - } + this._listeners[event].some(function (callback) { - if (enumerator._remaining === 0) { - lib$es6$promise$$internal$$fulfill(promise, enumerator._result); - } + result = callback.apply(_this2, args); + return result === false; + }); + + return result; }; - lib$es6$promise$enumerator$$Enumerator.prototype._willSettleAt = function(promise, i) { - var enumerator = this; + Observable.prototype.off = function off(event, callback) { + var _this3 = this; - lib$es6$promise$$internal$$subscribe(promise, undefined, function(value) { - enumerator._settledAt(lib$es6$promise$$internal$$FULFILLED, i, value); - }, function(reason) { - enumerator._settledAt(lib$es6$promise$$internal$$REJECTED, i, reason); - }); - }; - function lib$es6$promise$promise$all$$all(entries) { - return new lib$es6$promise$enumerator$$default(this, entries).promise; - } - var lib$es6$promise$promise$all$$default = lib$es6$promise$promise$all$$all; - function lib$es6$promise$promise$race$$race(entries) { - /*jshint validthis:true */ - var Constructor = this; + if (!event) { - var promise = new Constructor(lib$es6$promise$$internal$$noop); + this._listeners = {}; + } else { - if (!lib$es6$promise$utils$$isArray(entries)) { - lib$es6$promise$$internal$$reject(promise, new TypeError('You must pass an array to race.')); - return promise; - } + if (!callback) { - var length = entries.length; + delete this._listeners[event]; + } else { - function onFulfillment(value) { - lib$es6$promise$$internal$$resolve(promise, value); - } + if (!this.hasListeners(event)) return this; - function onRejection(reason) { - lib$es6$promise$$internal$$reject(promise, reason); - } + this._listeners[event].forEach(function (cb, i) { - for (var i = 0; promise._state === lib$es6$promise$$internal$$PENDING && i < length; i++) { - lib$es6$promise$$internal$$subscribe(Constructor.resolve(entries[i]), undefined, onFulfillment, onRejection); - } + if (cb === callback) delete _this3._listeners[event][i]; + }); + } + } - return promise; - } - var lib$es6$promise$promise$race$$default = lib$es6$promise$promise$race$$race; - function lib$es6$promise$promise$resolve$$resolve(object) { - /*jshint validthis:true */ - var Constructor = this; + return this; + }; - if (object && typeof object === 'object' && object.constructor === Constructor) { - return object; - } + return Observable; +})(); - var promise = new Constructor(lib$es6$promise$$internal$$noop); - lib$es6$promise$$internal$$resolve(promise, object); - return promise; - } - var lib$es6$promise$promise$resolve$$default = lib$es6$promise$promise$resolve$$resolve; - function lib$es6$promise$promise$reject$$reject(reason) { - /*jshint validthis:true */ - var Constructor = this; - var promise = new Constructor(lib$es6$promise$$internal$$noop); - lib$es6$promise$$internal$$reject(promise, reason); - return promise; - } - var lib$es6$promise$promise$reject$$default = lib$es6$promise$promise$reject$$reject; +exports['default'] = Observable; +module.exports = exports['default']; - var lib$es6$promise$promise$$counter = 0; +/***/ }, +/* 13 */ +/***/ function(module, exports, __webpack_require__) { - function lib$es6$promise$promise$$needsResolver() { - throw new TypeError('You must pass a resolver function as the first argument to the promise constructor'); - } +'use strict'; - function lib$es6$promise$promise$$needsNew() { - throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function."); - } +exports.__esModule = true; - var lib$es6$promise$promise$$default = lib$es6$promise$promise$$Promise; - /** - Promise objects represent the eventual result of an asynchronous operation. The - primary way of interacting with a promise is through its `then` method, which - registers callbacks to receive either a promise’s eventual value or the reason - why the promise cannot be fulfilled. +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; }; })(); - Terminology - ----------- +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - `promise` is an object or function with a `then` method whose behavior conforms to this specification. - - `thenable` is an object or function that defines a `then` method. - - `value` is any legal JavaScript value (including undefined, a thenable, or a promise). - - `exception` is a value that is thrown using the throw statement. - - `reason` is a value that indicates why a promise was rejected. - - `settled` the final resting state of a promise, fulfilled or rejected. +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - A promise can be in one of three states: pending, fulfilled, or rejected. +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; } - Promises that are fulfilled have a fulfillment value and are in the fulfilled - state. Promises that are rejected have a rejection reason and are in the - rejected state. A fulfillment value is never a thenable. +var _coreExternals = __webpack_require__(3); - Promises can also be said to *resolve* a value. If this value is also a - promise, then the original promise's settled state will match the value's - settled state. So a promise that *resolves* a promise that rejects will - itself reject, and a promise that *resolves* a promise that fulfills will - itself fulfill. +var _coreUtils = __webpack_require__(2); +var _Utils = __webpack_require__(14); - Basic Usage: - ------------ +var _coreObservable = __webpack_require__(12); - ```js - var promise = new Promise(function(resolve, reject) { - // on success - resolve(value); +var _coreObservable2 = _interopRequireDefault(_coreObservable); - // on failure - reject(reason); - }); +var _ApiResponse = __webpack_require__(15); - promise.then(function(value) { - // on fulfillment - }, function(reason) { - // on rejection - }); - ``` +var _ApiResponse2 = _interopRequireDefault(_ApiResponse); - Advanced Usage: - --------------- +var Client = (function (_Observable) { + _inherits(Client, _Observable); - Promises shine when abstracting away asynchronous interactions such as - `XMLHttpRequest`s. + function Client() { + _classCallCheck(this, Client); - ```js - function getJSON(url) { - return new Promise(function(resolve, reject){ - var xhr = new XMLHttpRequest(); + _Observable.apply(this, arguments); - xhr.open('GET', url); - xhr.onreadystatechange = handler; - xhr.responseType = 'json'; - xhr.setRequestHeader('Accept', 'application/json'); - xhr.send(); + this.events = { + beforeRequest: 'beforeRequest', + requestSuccess: 'requestSuccess', + requestError: 'requestError' + }; + } - function handler() { - if (this.readyState === this.DONE) { - if (this.status === 200) { - resolve(this.response); - } else { - reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']')); - } - } - }; - }); - } + /** + * @name IApiError + * @property {string} stack + * @property {string} originalMessage + * @property {ApiResponse} apiResponse + */ - getJSON('/posts.json').then(function(json) { - // on fulfillment - }, function(reason) { - // on rejection - }); - ``` + /** + * @param {Request} request + * @return {Promise} + */ - Unlike callbacks, promises are great composable primitives. + Client.prototype.sendRequest = function sendRequest(request) { + var apiResponse; + return regeneratorRuntime.async(function sendRequest$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + apiResponse = new _ApiResponse2['default'](request); + context$2$0.prev = 1; - ```js - Promise.all([ - getJSON('/posts'), - getJSON('/comments') - ]).then(function(values){ - values[0] // => postsJSON - values[1] // => commentsJSON + //TODO Stop request if listeners return false + this.emit(this.events.beforeRequest, apiResponse); - return values; - }); - ``` + context$2$0.next = 5; + return regeneratorRuntime.awrap(this._loadResponse(request)); - @class Promise - @param {function} resolver - Useful for tooling. - @constructor - */ - function lib$es6$promise$promise$$Promise(resolver) { - this._id = lib$es6$promise$promise$$counter++; - this._state = undefined; - this._result = undefined; - this._subscribers = []; + case 5: + apiResponse._response = context$2$0.sent; - if (lib$es6$promise$$internal$$noop !== resolver) { - if (!lib$es6$promise$utils$$isFunction(resolver)) { - lib$es6$promise$promise$$needsResolver(); - } + if (!(apiResponse._isMultipart() || apiResponse._isJson())) { + context$2$0.next = 10; + break; + } - if (!(this instanceof lib$es6$promise$promise$$Promise)) { - lib$es6$promise$promise$$needsNew(); - } + context$2$0.next = 9; + return regeneratorRuntime.awrap(apiResponse.response().text()); - lib$es6$promise$$internal$$initializePromise(this, resolver); - } - } + case 9: + apiResponse._text = context$2$0.sent; - lib$es6$promise$promise$$Promise.all = lib$es6$promise$promise$all$$default; - lib$es6$promise$promise$$Promise.race = lib$es6$promise$promise$race$$default; - lib$es6$promise$promise$$Promise.resolve = lib$es6$promise$promise$resolve$$default; - lib$es6$promise$promise$$Promise.reject = lib$es6$promise$promise$reject$$default; - lib$es6$promise$promise$$Promise._setScheduler = lib$es6$promise$asap$$setScheduler; - lib$es6$promise$promise$$Promise._asap = lib$es6$promise$asap$$default; + case 10: + if (apiResponse.ok()) { + context$2$0.next = 12; + break; + } - lib$es6$promise$promise$$Promise.prototype = { - constructor: lib$es6$promise$promise$$Promise, + throw new Error('Response has unsuccessful status'); - /** - The primary way of interacting with a promise is through its `then` method, - which registers callbacks to receive either a promise's eventual value or the - reason why the promise cannot be fulfilled. + case 12: - ```js - findUser().then(function(user){ - // user is available - }, function(reason){ - // user is unavailable, and you are given the reason why - }); - ``` + this.emit(this.events.requestSuccess, apiResponse); - Chaining - -------- + return context$2$0.abrupt('return', apiResponse); - The return value of `then` is itself a promise. This second, 'downstream' - promise is resolved with the return value of the first promise's fulfillment - or rejection handler, or rejected if the handler throws an exception. + case 16: + context$2$0.prev = 16; + context$2$0.t0 = context$2$0['catch'](1); - ```js - findUser().then(function (user) { - return user.name; - }, function (reason) { - return 'default name'; - }).then(function (userName) { - // If `findUser` fulfilled, `userName` will be the user's name, otherwise it - // will be `'default name'` - }); + if (!context$2$0.t0.apiResponse) context$2$0.t0 = this.makeError(context$2$0.t0, apiResponse); - findUser().then(function (user) { - throw new Error('Found user, but still unhappy'); - }, function (reason) { - throw new Error('`findUser` rejected and we're unhappy'); - }).then(function (value) { - // never reached - }, function (reason) { - // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'. - // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'. - }); - ``` - If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream. + this.emit(this.events.requestError, context$2$0.t0); - ```js - findUser().then(function (user) { - throw new PedagogicalException('Upstream error'); - }).then(function (value) { - // never reached - }).then(function (value) { - // never reached - }, function (reason) { - // The `PedgagocialException` is propagated all the way down to here - }); - ``` + throw context$2$0.t0; - Assimilation - ------------ + case 21: + case 'end': + return context$2$0.stop(); + } + }, null, this, [[1, 16]]); + }; - Sometimes the value you want to propagate to a downstream promise can only be - retrieved asynchronously. This can be achieved by returning a promise in the - fulfillment or rejection handler. The downstream promise will then be pending - until the returned promise is settled. This is called *assimilation*. + /** + * @param {Request} request + * @return {Promise} + * @private + */ + + Client.prototype._loadResponse = function _loadResponse(request) { + return regeneratorRuntime.async(function _loadResponse$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + context$2$0.next = 2; + return regeneratorRuntime.awrap(_coreExternals.fetch.call(null, request)); + + case 2: + return context$2$0.abrupt('return', context$2$0.sent); + + case 3: + case 'end': + return context$2$0.stop(); + } + }, null, this); + }; - ```js - findUser().then(function (user) { - return findCommentsByAuthor(user); - }).then(function (comments) { - // The user's comments are now available - }); - ``` + /** + * Wraps the JS Error object with transaction information + * @param {Error|IApiError} e + * @param {ApiResponse} apiResponse + * @return {IApiError} + */ - If the assimliated promise rejects, then the downstream promise will also reject. + Client.prototype.makeError = function makeError(e, apiResponse) { - ```js - findUser().then(function (user) { - return findCommentsByAuthor(user); - }).then(function (comments) { - // If `findCommentsByAuthor` fulfills, we'll have the value here - }, function (reason) { - // If `findCommentsByAuthor` rejects, we'll have the reason here - }); - ``` + // Wrap only if regular error + if (!e.hasOwnProperty('apiResponse') && !e.hasOwnProperty('originalMessage')) { - Simple Example - -------------- + e.apiResponse = apiResponse; + e.originalMessage = e.message; + e.message = apiResponse && apiResponse.error(true) || e.originalMessage; + } - Synchronous Example + return e; + }; - ```javascript - var result; + /** + * + * @param {object} init + * @param {object} [init.url] + * @param {object} [init.body] + * @param {string} [init.method] + * @param {object} [init.query] + * @param {object} [init.headers] + * @return {Request} + */ + + Client.prototype.createRequest = function createRequest(init) { + + init = init || {}; + init.headers = init.headers || {}; + + // Sanity checks + if (!init.url) throw new Error('Url is not defined'); + if (!init.method) init.method = 'GET'; + if (init.method && Client._allowedMethods.indexOf(init.method) < 0) throw new Error('Method has wrong value: ' + init.method); - try { - result = findResult(); - // success - } catch(reason) { - // failure - } - ``` + // Defaults + init.credentials = init.credentials || 'include'; + init.mode = init.mode || 'cors'; - Errback Example + // Append Query String + if (init.query) { + init.url = init.url + (init.url.indexOf('?') > -1 ? '&' : '?') + _coreUtils.queryStringify(init.query); + } - ```js - findResult(function(result, err){ - if (err) { - // failure - } else { - // success + if (!_Utils.findHeaderName('Accept', init.headers)) { + init.headers['Accept'] = _ApiResponse2['default']._jsonContentType; } - }); - ``` - Promise Example; + // Serialize body + //TODO Check that body is a plain object + if (typeof init.body !== 'string' || !init.body) { - ```javascript - findResult().then(function(result){ - // success - }, function(reason){ - // failure - }); - ``` + var contentTypeHeaderName = _Utils.findHeaderName(_ApiResponse2['default']._contentType, init.headers); - Advanced Example - -------------- + if (!contentTypeHeaderName) { + contentTypeHeaderName = _ApiResponse2['default']._contentType; + init.headers[contentTypeHeaderName] = _ApiResponse2['default']._jsonContentType; + } - Synchronous Example + var contentType = init.headers[contentTypeHeaderName]; - ```javascript - var author, books; + // Assign a new encoded body + if (contentType.indexOf(_ApiResponse2['default']._jsonContentType) > -1) { + init.body = JSON.stringify(init.body); + } else if (contentType.indexOf(_ApiResponse2['default']._urlencodedContentType) > -1) { + init.body = _coreUtils.queryStringify(init.body); + } + } - try { - author = findAuthor(); - books = findBooksByAuthor(author); - // success - } catch(reason) { - // failure - } - ``` + // Create a request with encoded body + var req = new _coreExternals.Request(init.url, init); - Errback Example + // Keep the original body accessible directly (for mocks) + req.originalBody = init.body; - ```js + return req; + }; - function foundBooks(books) { + _createClass(Client, null, [{ + key: '_allowedMethods', + value: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'], + enumerable: true + }]); - } + return Client; +})(_coreObservable2['default']); - function failure(reason) { +exports['default'] = Client; +module.exports = exports['default']; - } +/***/ }, +/* 14 */ +/***/ function(module, exports, __webpack_require__) { - findAuthor(function(author, err){ - if (err) { - failure(err); - // failure - } else { - try { - findBoooksByAuthor(author, function(books, err) { - if (err) { - failure(err); - } else { - try { - foundBooks(books); - } catch(reason) { - failure(reason); - } - } - }); - } catch(error) { - failure(err); - } - // success - } - }); - ``` +'use strict'; - Promise Example; +exports.__esModule = true; +exports.createResponse = createResponse; +exports.findHeaderName = findHeaderName; - ```javascript - findAuthor(). - then(findBooksByAuthor). - then(function(books){ - // found books - }).catch(function(reason){ - // something went wrong - }); - ``` +function _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; } } - @method then - @param {Function} onFulfilled - @param {Function} onRejected - Useful for tooling. - @return {Promise} - */ - then: function(onFulfillment, onRejection) { - var parent = this; - var state = parent._state; +var _coreExternals = __webpack_require__(3); - if (state === lib$es6$promise$$internal$$FULFILLED && !onFulfillment || state === lib$es6$promise$$internal$$REJECTED && !onRejection) { - return this; - } +var _coreUtils = __webpack_require__(2); + +var utils = _interopRequireWildcard(_coreUtils); + +/** + * Creates a response + * @param stringBody + * @param init + * @return {Response} + */ - var child = new this.constructor(lib$es6$promise$$internal$$noop); - var result = parent._result; +function createResponse(stringBody, init) { - if (state) { - var callback = arguments[state - 1]; - lib$es6$promise$asap$$default(function(){ - lib$es6$promise$$internal$$invokeCallback(state, child, callback, result); - }); - } else { - lib$es6$promise$$internal$$subscribe(parent, child, onFulfillment, onRejection); - } + init = init || {}; - return child; - }, + var response = new _coreExternals.Response(stringBody, init); - /** - `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same - as the catch block of a try/catch statement. + //TODO Wait for https://github.com/bitinn/node-fetch/issues/38 + if (utils.isNodeJS()) { - ```js - function findAuthor(){ - throw new Error('couldn't find that author'); - } + response._text = stringBody; + response._decode = function () { + return this._text; + }; + } - // synchronous - try { - findAuthor(); - } catch(reason) { - // something went wrong - } + return response; +} - // async with promises - findAuthor().catch(function(reason){ - // something went wrong - }); - ``` +function findHeaderName(name, headers) { + name = name.toLowerCase(); + return Object.keys(headers).reduce(function (res, key) { + if (res) return res; + if (name == key.toLowerCase()) return key; + return res; + }, null); +} - @method catch - @param {Function} onRejection - Useful for tooling. - @return {Promise} - */ - 'catch': function(onRejection) { - return this.then(null, onRejection); - } - }; - function lib$es6$promise$polyfill$$polyfill() { - var local; +/***/ }, +/* 15 */ +/***/ 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 _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; } } + +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__(14); + +var utils = _interopRequireWildcard(_Utils); + +var ApiResponse = (function () { + _createClass(ApiResponse, null, [{ + key: '_contentType', + value: 'Content-Type', + enumerable: true + }, { + key: '_jsonContentType', + value: 'application/json', + enumerable: true + }, { + key: '_multipartContentType', + value: 'multipart/mixed', + enumerable: true + }, { + key: '_urlencodedContentType', + value: 'application/x-www-form-urlencoded', + enumerable: true + }, { + key: '_headerSeparator', + value: ':', + enumerable: true + }, { + key: '_bodySeparator', + value: '\n\n', + enumerable: true + }, { + key: '_boundarySeparator', + value: '--', + + /** + * @param {Request} request + * @param {Response} response + * @param {string} responseText + */ + enumerable: true + }]); - if (typeof global !== 'undefined') { - local = global; - } else if (typeof self !== 'undefined') { - local = self; - } else { - try { - local = Function('return this')(); - } catch (e) { - throw new Error('polyfill failed because global object is unavailable in this environment'); - } - } + function ApiResponse(request, response, responseText) { + _classCallCheck(this, ApiResponse); - var P = local.Promise; + /** @type {Request} */ + this._request = request; - if (P && Object.prototype.toString.call(P.resolve()) === '[object Promise]' && !P.cast) { - return; - } + /** @type {Response} */ + this._response = response; - local.Promise = lib$es6$promise$promise$$default; + this._text = responseText; + this._json = null; + this._multipart = []; } - var lib$es6$promise$polyfill$$default = lib$es6$promise$polyfill$$polyfill; - var lib$es6$promise$umd$$ES6Promise = { - 'Promise': lib$es6$promise$promise$$default, - 'polyfill': lib$es6$promise$polyfill$$default + /** + * @return {Response} + */ + + ApiResponse.prototype.response = function response() { + return this._response; }; - /* global define:true module:true window: true */ - if (typeof define === 'function' && define['amd']) { - define(function() { return lib$es6$promise$umd$$ES6Promise; }); - } else if (typeof module !== 'undefined' && module['exports']) { - module['exports'] = lib$es6$promise$umd$$ES6Promise; - } else if (typeof this !== 'undefined') { - this['ES6Promise'] = lib$es6$promise$umd$$ES6Promise; - } + /** + * @return {Request} + */ - lib$es6$promise$polyfill$$default(); -}).call(this); + ApiResponse.prototype.request = function request() { + return this._request; + }; + /** + * @return {boolean} + */ -(function() { - 'use strict'; + ApiResponse.prototype.ok = function ok() { + return this._response && this._response.ok; + }; - if (self.fetch) { - return - } + /** + * @return {string} + */ - function normalizeName(name) { - if (typeof name !== 'string') { - name = String(name) - } - if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) { - throw new TypeError('Invalid character in header field name') - } - return name.toLowerCase() - } + ApiResponse.prototype.text = function text() { + if (!this._isJson() && !this._isMultipart()) throw new Error('Response is not text'); + return this._text; + }; - function normalizeValue(value) { - if (typeof value !== 'string') { - value = String(value) - } - return value - } + /** + * @return {object} + */ - function Headers(headers) { - this.map = {} + ApiResponse.prototype.json = function json() { + if (!this._isJson()) throw new Error('Response is not JSON'); + if (!this._json) { + this._json = this._text ? JSON.parse(this._text) : null; + } + return this._json; + }; - if (headers instanceof Headers) { - headers.forEach(function(value, name) { - this.append(name, value) - }, this) + /** + * @param [skipOKCheck] + * @return {string} + */ - } else if (headers) { - Object.getOwnPropertyNames(headers).forEach(function(name) { - this.append(name, headers[name]) - }, this) - } - } + ApiResponse.prototype.error = function error(skipOKCheck) { - Headers.prototype.append = function(name, value) { - name = normalizeName(name) - value = normalizeValue(value) - var list = this.map[name] - if (!list) { - list = [] - this.map[name] = list - } - list.push(value) - } + if (this.ok() && !skipOKCheck) return null; - Headers.prototype['delete'] = function(name) { - delete this.map[normalizeName(name)] - } + var message = (this._response && this._response.status ? this._response.status + ' ' : '') + (this._response && this._response.statusText ? this._response.statusText : ''); - Headers.prototype.get = function(name) { - var values = this.map[normalizeName(name)] - return values ? values[0] : null - } + try { - Headers.prototype.getAll = function(name) { - return this.map[normalizeName(name)] || [] - } + if (this.json().message) message = this.json().message; + if (this.json().error_description) message = this.json().error_description; + if (this.json().description) message = this.json().description; + } catch (e) {} - Headers.prototype.has = function(name) { - return this.map.hasOwnProperty(normalizeName(name)) - } + return message; + }; - Headers.prototype.set = function(name, value) { - this.map[normalizeName(name)] = [normalizeValue(value)] - } + /** + * @return {ApiResponse[]} + */ - Headers.prototype.forEach = function(callback, thisArg) { - Object.getOwnPropertyNames(this.map).forEach(function(name) { - this.map[name].forEach(function(value) { - callback.call(thisArg, value, name, this) - }, this) - }, this) - } + ApiResponse.prototype.multipart = function multipart() { - function consumed(body) { - if (body.bodyUsed) { - return Promise.reject(new TypeError('Already read')) - } - body.bodyUsed = true - } + if (!this._isMultipart()) throw new Error('Response is not multipart'); - function fileReaderReady(reader) { - return new Promise(function(resolve, reject) { - reader.onload = function() { - resolve(reader.result) - } - reader.onerror = function() { - reject(reader.error) - } - }) - } + if (!this._multipart.length) { - function readBlobAsArrayBuffer(blob) { - var reader = new FileReader() - reader.readAsArrayBuffer(blob) - return fileReaderReady(reader) - } + // Step 1. Split multipart response - function readBlobAsText(blob) { - var reader = new FileReader() - reader.readAsText(blob) - return fileReaderReady(reader) - } + var text = this.text(); - var support = { - blob: 'FileReader' in self && 'Blob' in self && (function() { - try { - new Blob(); - return true - } catch(e) { - return false - } - })(), - formData: 'FormData' in self - } + if (!text) throw new Error('No response body'); - function Body() { - this.bodyUsed = false + var boundary = this._getContentType().match(/boundary=([^;]+)/i)[1]; + if (!boundary) throw new Error('Cannot find boundary'); - this._initBody = function(body) { - this._bodyInit = body - if (typeof body === 'string') { - this._bodyText = body - } else if (support.blob && Blob.prototype.isPrototypeOf(body)) { - this._bodyBlob = body - } else if (support.formData && FormData.prototype.isPrototypeOf(body)) { - this._bodyFormData = body - } else if (!body) { - this._bodyText = '' - } else { - throw new Error('unsupported BodyInit type') - } - } + var parts = text.toString().split(ApiResponse._boundarySeparator + boundary); - if (support.blob) { - this.blob = function() { - var rejected = consumed(this) - if (rejected) { - return rejected - } + if (parts[0].trim() === '') parts.shift(); + if (parts[parts.length - 1].trim() == ApiResponse._boundarySeparator) parts.pop(); - if (this._bodyBlob) { - return Promise.resolve(this._bodyBlob) - } else if (this._bodyFormData) { - throw new Error('could not read FormData body as blob') - } else { - return Promise.resolve(new Blob([this._bodyText])) - } - } + if (parts.length < 1) throw new Error('No parts in body'); - this.arrayBuffer = function() { - return this.blob().then(readBlobAsArrayBuffer) - } + // Step 2. Parse status info - this.text = function() { - var rejected = consumed(this) - if (rejected) { - return rejected - } + var statusInfo = ApiResponse.create(parts.shift(), this._response.status, this._response.statusText).json(); - if (this._bodyBlob) { - return readBlobAsText(this._bodyBlob) - } else if (this._bodyFormData) { - throw new Error('could not read FormData body as text') - } else { - return Promise.resolve(this._bodyText) - } - } - } else { - this.text = function() { - var rejected = consumed(this) - return rejected ? rejected : Promise.resolve(this._bodyText) - } - } + // Step 3. Parse all other parts - if (support.formData) { - this.formData = function() { - return this.text().then(decode) - } - } + this._multipart = parts.map(function (part, i) { - this.json = function() { - return this.text().then(JSON.parse) - } + var status = statusInfo.response[i].status; + + return ApiResponse.create(part, status); + }); + } - return this - } + return this._multipart; + }; - // HTTP methods whose capitalization should be normalized - var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'] + ApiResponse.prototype._isContentType = function _isContentType(contentType) { + return this._getContentType().indexOf(contentType) > -1; + }; - function normalizeMethod(method) { - var upcased = method.toUpperCase() - return (methods.indexOf(upcased) > -1) ? upcased : method - } + ApiResponse.prototype._getContentType = function _getContentType() { + return this._response.headers.get(ApiResponse._contentType) || ''; + }; - function Request(input, options) { - options = options || {} - var body = options.body - if (Request.prototype.isPrototypeOf(input)) { - if (input.bodyUsed) { - throw new TypeError('Already read') - } - this.url = input.url - this.credentials = input.credentials - if (!options.headers) { - this.headers = new Headers(input.headers) - } - this.method = input.method - this.mode = input.mode - if (!body) { - body = input._bodyInit - input.bodyUsed = true - } - } else { - this.url = input - } + ApiResponse.prototype._isMultipart = function _isMultipart() { + return this._isContentType(ApiResponse._multipartContentType); + }; - this.credentials = options.credentials || this.credentials || 'omit' - if (options.headers || !this.headers) { - this.headers = new Headers(options.headers) - } - this.method = normalizeMethod(options.method || this.method || 'GET') - this.mode = options.mode || this.mode || null - this.referrer = null + ApiResponse.prototype._isUrlEncoded = function _isUrlEncoded() { + return this._isContentType(ApiResponse._urlencodedContentType); + }; - if ((this.method === 'GET' || this.method === 'HEAD') && body) { - throw new TypeError('Body not allowed for GET or HEAD requests') - } - this._initBody(body) - } + ApiResponse.prototype._isJson = function _isJson() { + return this._isContentType(ApiResponse._jsonContentType); + }; - function decode(body) { - var form = new FormData() - body.trim().split('&').forEach(function(bytes) { - if (bytes) { - var split = bytes.split('=') - var name = split.shift().replace(/\+/g, ' ') - var value = split.join('=').replace(/\+/g, ' ') - form.append(decodeURIComponent(name), decodeURIComponent(value)) - } - }) - return form - } + /** + * Method is used to create ApiResponse object from string parts of multipart/mixed response + * @param {string} [text] + * @param {number} [status] + * @param {string} [statusText] + * @return {ApiResponse} + */ - function headers(xhr) { - var head = new Headers() - var pairs = xhr.getAllResponseHeaders().trim().split('\n') - pairs.forEach(function(header) { - var split = header.trim().split(':') - var key = split.shift().trim() - var value = split.join(':').trim() - head.append(key, value) - }) - return head - } + ApiResponse.create = function create(text, status, statusText) { - Body.call(Request.prototype) + text = text || ''; + status = status || 200; + statusText = statusText || 'OK'; - function Response(bodyInit, options) { - if (!options) { - options = {} - } + text = text.replace(/\r/g, ''); - this._initBody(bodyInit) - this.type = 'default' - this.url = null - this.status = options.status - this.ok = this.status >= 200 && this.status < 300 - this.statusText = options.statusText - this.headers = options.headers instanceof Headers ? options.headers : new Headers(options.headers) - this.url = options.url || '' - } + var headers = new _coreExternals.Headers(), + headersAndBody = text.split(ApiResponse._bodySeparator), + headersText = headersAndBody.length > 1 ? headersAndBody.shift() : ''; - Body.call(Response.prototype) + text = headersAndBody.join(ApiResponse._bodySeparator); - self.Headers = Headers; - self.Request = Request; - self.Response = Response; + (headersText || '').split('\n').forEach(function (header) { - self.fetch = function(input, init) { - var request - if (Request.prototype.isPrototypeOf(input) && !init) { - request = input - } else { - request = new Request(input, init) - } + var split = header.trim().split(ApiResponse._headerSeparator), + key = split.shift().trim(), + value = split.join(ApiResponse._headerSeparator).trim(); - return new Promise(function(resolve, reject) { - var xhr = new XMLHttpRequest() + if (key) headers.append(key, value); + }); - function responseURL() { - if ('responseURL' in xhr) { - return xhr.responseURL - } + return new ApiResponse(null, utils.createResponse(text, { + headers: headers, + status: status, + statusText: statusText + }), text); + }; - // Avoid security warnings on getResponseHeader when not allowed by CORS - if (/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())) { - return xhr.getResponseHeader('X-Request-URL') - } + return ApiResponse; +})(); - return; - } +exports['default'] = ApiResponse; +module.exports = exports['default']; - xhr.onload = function() { - var status = (xhr.status === 1223) ? 204 : xhr.status - if (status < 100 || status > 599) { - reject(new TypeError('Network request failed')) - return - } - var options = { - status: status, - statusText: xhr.statusText, - headers: headers(xhr), - url: responseURL() - } - var body = 'response' in xhr ? xhr.response : xhr.responseText; - resolve(new Response(body, options)) - } +/***/ }, +/* 16 */ +/***/ function(module, exports, __webpack_require__) { - xhr.onerror = function() { - reject(new TypeError('Network request failed')) - } +'use strict'; - xhr.open(request.method, request.url, true) +exports.__esModule = true; - if (request.credentials === 'include') { - xhr.withCredentials = true - } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - if ('responseType' in xhr && support.blob) { - xhr.responseType = 'blob' - } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - request.headers.forEach(function(value, name) { - xhr.setRequestHeader(name, value) - }) +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; } - xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit) - }) - } - self.fetch.polyfill = true -})(); +var _Registry = __webpack_require__(17); -// Version: 3.7.13 -/* =-====================================================================-= */ -/* =-====================================================================-= */ -/* =-========================= JSON =============================-= */ -/* =-====================================================================-= */ -/* =-====================================================================-= */ +var _Registry2 = _interopRequireDefault(_Registry); -(window['JSON'] && window['JSON']['stringify']) || (function () { - window['JSON'] || (window['JSON'] = {}); +var _httpClient = __webpack_require__(13); - function toJSON(key) { - try { return this.valueOf() } - catch(e) { return null } - } +var _httpClient2 = _interopRequireDefault(_httpClient); - 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 = { // table of character substitutions - '\b': '\\b', - '\t': '\\t', - '\n': '\\n', - '\f': '\\f', - '\r': '\\r', - '"' : '\\"', - '\\': '\\\\' - }, - rep; +var Client = (function (_HttpClient) { + _inherits(Client, _HttpClient); - function quote(string) { - escapable.lastIndex = 0; - return escapable.test(string) ? - '"' + string.replace(escapable, function (a) { - var c = meta[a]; - return typeof c === 'string' ? c : - '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }) + '"' : - '"' + string + '"'; + function Client() { + _classCallCheck(this, Client); + + _HttpClient.call(this); + this._registry = new _Registry2['default'](); } - function str(key, holder) { - var i, // The loop counter. - k, // The member key. - v, // The member value. - length, - partial, - mind = gap, - value = holder[key]; + Client.prototype.registry = function registry() { + return this._registry; + }; - if (value && typeof value === 'object') { - value = toJSON.call( value, key ); - } + Client.prototype._loadResponse = function _loadResponse(request) { + var mock; + return regeneratorRuntime.async(function _loadResponse$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + mock = this._registry.find(request); + context$2$0.next = 3; + return regeneratorRuntime.awrap(mock.getResponse(request)); + + case 3: + return context$2$0.abrupt('return', context$2$0.sent); + + case 4: + case 'end': + return context$2$0.stop(); + } + }, null, this); + }; - if (typeof rep === 'function') { - value = rep.call(holder, key, value); - } + return Client; +})(_httpClient2['default']); - switch (typeof value) { - case 'string': - return quote(value); +exports['default'] = Client; +module.exports = exports['default']; - case 'number': - return isFinite(value) ? String(value) : 'null'; +/***/ }, +/* 17 */ +/***/ function(module, exports, __webpack_require__) { - case 'boolean': - case 'null': - return String(value); +'use strict'; - case 'object': +exports.__esModule = true; - if (!value) { - return 'null'; - } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - gap += indent; - partial = []; +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - if (Object.prototype.toString.apply(value) === '[object Array]') { +var _Mock = __webpack_require__(18); - length = value.length; - for (i = 0; i < length; i += 1) { - partial[i] = str(i, value) || 'null'; - } +var _Mock2 = _interopRequireDefault(_Mock); - v = partial.length === 0 ? '[]' : - gap ? '[\n' + gap + - partial.join(',\n' + gap) + '\n' + - mind + ']' : - '[' + partial.join(',') + ']'; - gap = mind; - return v; - } - if (rep && typeof rep === 'object') { - length = rep.length; - for (i = 0; i < length; i += 1) { - k = rep[i]; - if (typeof k === 'string') { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ': ' : ':') + v); - } - } - } - } else { - for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ': ' : ':') + v); - } - } - } - } +var Registry = (function () { + function Registry() { + _classCallCheck(this, Registry); - v = partial.length === 0 ? '{}' : - gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + - mind + '}' : '{' + partial.join(',') + '}'; - gap = mind; - return v; - } + this._mocks = []; } - if (typeof JSON['stringify'] !== 'function') { - JSON['stringify'] = function (value, replacer, space) { - var i; - gap = ''; - indent = ''; + Registry.prototype.add = function add(mock) { + this._mocks.push(mock); + return this; + }; + + Registry.prototype.clear = function clear() { + this._mocks = []; + return this; + }; + + Registry.prototype.find = function find(request) { + + //console.log('Registry is looking for', request); + + var mock = this._mocks.shift(); - if (typeof space === 'number') { - for (i = 0; i < space; i += 1) { - indent += ' '; - } - } else if (typeof space === 'string') { - indent = space; - } - rep = replacer; - if (replacer && typeof replacer !== 'function' && - (typeof replacer !== 'object' || - typeof replacer.length !== 'number')) { - throw new Error('JSON.stringify'); - } - return str('', {'': value}); - }; - } + if (!mock) throw new Error('No mock in registry for request ' + request.method + ' ' + request.url); - if (typeof JSON['parse'] !== 'function') { - // JSON is parsed on the server for security. - JSON['parse'] = function (text) {return eval('('+text+')')}; - } -}()); -var NOW = 1 -, READY = false -, READY_BUFFER = [] -, PRESENCE_SUFFIX = '-pnpres' -, DEF_WINDOWING = 10 // MILLISECONDS. -, DEF_TIMEOUT = 10000 // MILLISECONDS. -, DEF_SUB_TIMEOUT = 310 // SECONDS. -, DEF_KEEPALIVE = 60 // SECONDS (FOR TIMESYNC). -, SECOND = 1000 // A THOUSAND MILLISECONDS. -, URLBIT = '/' -, PARAMSBIT = '&' -, PRESENCE_HB_THRESHOLD = 5 -, PRESENCE_HB_DEFAULT = 30 -, SDK_VER = '3.7.13' -, REPL = /{([\w\-]+)}/g; + if (!mock.test(request)) throw new Error('Wrong request ' + request.method + ' ' + request.url + ' for expected mock ' + mock.method() + ' ' + mock.path()); -/** - * UTILITIES - */ -function unique() { return'x'+ ++NOW+''+(+new Date) } -function rnow() { return+new Date } + return mock; + }; -/** - * NEXTORIGIN - * ========== - * var next_origin = nextorigin(); - */ -var nextorigin = (function() { - var max = 20 - , ori = Math.floor(Math.random() * max); - return function( origin, failover ) { - return origin.indexOf('pubsub.') > 0 - && origin.replace( - 'pubsub', 'ps' + ( - failover ? generate_uuid().split('-')[0] : - (++ori < max? ori : ori=1) - ) ) || origin; - } -})(); + Registry.prototype.apiCall = function apiCall(method, path, response, status, statusText) { + this.add(new _Mock2['default'](method, path, response, status, statusText)); -/** - * Build Url - * ======= - * - */ -function build_url( url_components, url_params ) { - var url = url_components.join(URLBIT) - , params = []; + return this; + }; - if (!url_params) return url; + Registry.prototype.authentication = function authentication() { - each( url_params, function( key, value ) { - var value_str = (typeof value == 'object')?JSON['stringify'](value):value; - (typeof value != 'undefined' && - value != null && encode(value_str).length > 0 - ) && params.push(key + "=" + encode(value_str)); - } ); + 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() + 3600000 + }); - url += "?" + params.join(PARAMSBIT); - return url; -} + return this; + }; -/** - * UPDATER - * ======= - * var timestamp = unique(); - */ -function updater( fun, rate ) { - var timeout - , last = 0 - , runnit = function() { - if (last + rate > rnow()) { - clearTimeout(timeout); - timeout = setTimeout( runnit, rate ); - } - else { - last = rnow(); - fun(); - } + Registry.prototype.logout = function logout() { + + this.apiCall('POST', '/restapi/oauth/revoke', {}); + + return this; }; - return runnit; -} + Registry.prototype.presenceLoad = function presenceLoad(id) { -/** - * GREP - * ==== - * var list = grep( [1,2,3], function(item) { return item % 2 } ) - */ -function grep( list, fun ) { - var fin = []; - each( list || [], function(l) { fun(l) && fin.push(l) } ); - return fin -} + this.apiCall('GET', '/restapi/v1.0/account/~/extension/' + id + '/presence', { + "uri": "https://platform.ringcentral.com/restapi/v1.0/account/123/extension/" + id + "/presence", + "extension": { + "uri": "https://platform.ringcentral.com/restapi/v1.0/account/123/extension/" + id, + "id": id, + "extensionNumber": "101" + }, + "activeCalls": [], + "presenceStatus": "Available", + "telephonyStatus": "Ringing", + "userStatus": "Available", + "dndStatus": "TakeAllCalls", + "extensionId": id + }); -/** - * SUPPLANT - * ======== - * var text = supplant( 'Hello {name}!', { name : 'John' } ) - */ -function supplant( str, values ) { - return str.replace( REPL, function( _, match ) { - return values[match] || _ - } ); -} + return this; + }; -/** - * timeout - * ======= - * timeout( function(){}, 100 ); - */ -function timeout( fun, wait ) { - return setTimeout( fun, wait ); -} + Registry.prototype.subscribeGeneric = function subscribeGeneric(expiresIn) { -/** - * uuid - * ==== - * var my_uuid = generate_uuid(); - */ -function generate_uuid(callback) { - var u = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, - function(c) { - var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); - return v.toString(16); - }); - if (callback) callback(u); - return u; -} + expiresIn = expiresIn || 15 * 60 * 60; -function isArray(arg) { - return !!arg && typeof arg !== 'string' && (Array.isArray && Array.isArray(arg) || typeof(arg.length) === "number") - //return !!arg && (Array.isArray && Array.isArray(arg) || typeof(arg.length) === "number") -} + var date = new Date(); -/** - * EACH - * ==== - * each( [1,2,3], function(item) { } ) - */ -function each( o, f) { - if ( !o || !f ) return; + this.apiCall('POST', '/restapi/v1.0/subscription', { + 'eventFilters': ['/restapi/v1.0/account/~/extension/~/presence'], + 'expirationTime': new Date(date.getTime() + expiresIn * 1000).toISOString(), + 'expiresIn': expiresIn, + 'deliveryMode': { + 'transportType': 'PubNub', + 'encryption': false, + 'address': '123_foo', + 'subscriberKey': 'sub-c-foo', + 'secretKey': 'sec-c-bar' + }, + 'id': 'foo-bar-baz', + 'creationTime': date.toISOString(), + 'status': 'Active', + 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz' + }); - if ( isArray(o) ) - for ( var i = 0, l = o.length; i < l; ) - f.call( o[i], o[i], i++ ); - else - for ( var i in o ) - o.hasOwnProperty && - o.hasOwnProperty(i) && - f.call( o[i], i, o[i] ); -} + return this; + }; -/** - * MAP - * === - * var list = map( [1,2,3], function(item) { return item + 1 } ) - */ -function map( list, fun ) { - var fin = []; - each( list || [], function( k, v ) { fin.push(fun( k, v )) } ); - return fin; -} + Registry.prototype.subscribeOnPresence = function subscribeOnPresence(id, detailed) { + id = id || '1'; -function pam_encode(str) { - return encodeURIComponent(str).replace(/[!'()*~]/g, function(c) { - return '%' + c.charCodeAt(0).toString(16).toUpperCase(); - }); -} + var date = new Date(); -/** - * ENCODE - * ====== - * var encoded_data = encode('path'); - */ -function encode(path) { return encodeURIComponent(path) } + this.apiCall('POST', '/restapi/v1.0/subscription', { + 'eventFilters': ['/restapi/v1.0/account/~/extension/' + id + '/presence' + (detailed ? '?detailedTelephonyState=true' : '')], + 'expirationTime': new Date(date.getTime() + 15 * 60 * 60 * 1000).toISOString(), + 'deliveryMode': { + 'transportType': 'PubNub', + 'encryption': true, + 'address': '123_foo', + 'subscriberKey': 'sub-c-foo', + 'secretKey': 'sec-c-bar', + 'encryptionAlgorithm': 'AES', + 'encryptionKey': 'VQwb6EVNcQPBhE/JgFZ2zw==' + }, + 'creationTime': date.toISOString(), + 'id': 'foo-bar-baz', + 'status': 'Active', + 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz' + }); -/** - * Generate Subscription Channel List - * ================================== - * generate_channel_list(channels_object); - */ -function generate_channel_list(channels, nopresence) { - var list = []; - each( channels, function( channel, status ) { - if (nopresence) { - if(channel.search('-pnpres') < 0) { - if (status.subscribed) list.push(channel); - } - } else { - if (status.subscribed) list.push(channel); - } - }); - return list.sort(); -} + return this; + }; -/** - * Generate Subscription Channel Groups List - * ================================== - * generate_channel_group_list(channels_groups object); - */ -function generate_channel_group_list(channel_groups, nopresence) { - var list = []; - each(channel_groups, function( channel_group, status ) { - if (nopresence) { - if(channel_group.search('-pnpres') < 0) { - if (status.subscribed) list.push(channel_group); - } + Registry.prototype.tokenRefresh = function tokenRefresh(failure) { + + if (!failure) { + + 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' + }); } else { - if (status.subscribed) list.push(channel_group); + + this.apiCall('POST', '/restapi/oauth/token', { + 'message': 'Wrong token', + 'error_description': 'Wrong token', + 'description': 'Wrong token' + }, 400); } - }); - return list.sort(); -} -// PUBNUB READY TO CONNECT -function ready() { timeout( function() { - if (READY) return; - READY = 1; - each( READY_BUFFER, function(connect) { connect() } ); -}, SECOND ); } + return this; + }; + + return Registry; +})(); + +exports['default'] = Registry; +module.exports = exports['default']; + +/***/ }, +/* 18 */ +/***/ function(module, exports, __webpack_require__) { + +'use strict'; + +exports.__esModule = true; + +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'); } } + +var _httpApiResponse = __webpack_require__(15); + +var _httpApiResponse2 = _interopRequireDefault(_httpApiResponse); + +var _coreUtils = __webpack_require__(2); + +var _httpUtils = __webpack_require__(14); + +var Mock = (function () { + function Mock(method, path, json, status, statusText, delay) { + _classCallCheck(this, Mock); + + this._method = method.toUpperCase(); + this._path = path; + this._json = json || {}; + this._delay = delay || 10; + this._status = status || 200; + this._statusText = statusText || 'OK'; + } + + Mock.prototype.path = function path() { + return this._path; + }; + + Mock.prototype.method = function method() { + return this._method; + }; + + Mock.prototype.test = function test(request) { -function PNmessage(args) { - msg = args || {'apns' : {}}, - msg['getPubnubMessage'] = function() { - var m = {}; + return request.url.indexOf(this._path) > -1 && request.method.toUpperCase() == this._method; + }; - if (Object.keys(msg['apns']).length) { - m['pn_apns'] = { - 'aps' : { - 'alert' : msg['apns']['alert'] , - 'badge' : msg['apns']['badge'] - } - } - for (var k in msg['apns']) { - m['pn_apns'][k] = msg['apns'][k]; - } - var exclude1 = ['badge','alert']; - for (var k in exclude1) { - delete m['pn_apns'][exclude1[k]]; + Mock.prototype.getResponse = function getResponse(request) { + return regeneratorRuntime.async(function getResponse$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + context$2$0.next = 2; + return regeneratorRuntime.awrap(_coreUtils.delay(this._delay)); + + case 2: + return context$2$0.abrupt('return', this.createResponse(this._json)); + + case 3: + case 'end': + return context$2$0.stop(); } - } + }, null, this); + }; + Mock.prototype.createResponse = function createResponse(json, init) { + init = init || {}; - if (msg['gcm']) { - m['pn_gcm'] = { - 'data' : msg['gcm'] - } - } + init.status = init.status || this._status; + init.statusText = init.statusText || this._statusText; - for (var k in msg) { - m[k] = msg[k]; - } - var exclude = ['apns','gcm','publish', 'channel','callback','error']; - for (var k in exclude) { - delete m[exclude[k]]; - } + var str = JSON.stringify(json), + res = _httpUtils.createResponse(str, init); - return m; + res.headers.set(_httpApiResponse2['default']._contentType, _httpApiResponse2['default']._jsonContentType); + + return res; }; - msg['publish'] = function() { - var m = msg.getPubnubMessage(); + return Mock; +})(); - if (msg['pubnub'] && msg['channel']) { - msg['pubnub'].publish({ - 'message' : m, - 'channel' : msg['channel'], - 'callback' : msg['callback'], - 'error' : msg['error'] - }) - } - }; - return msg; -} +exports['default'] = Mock; +module.exports = exports['default']; + +/***/ }, +/* 19 */ +/***/ 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'); } } + +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 _coreObservable = __webpack_require__(12); + +var _coreObservable2 = _interopRequireDefault(_coreObservable); + +var _Queue = __webpack_require__(20); + +var _Queue2 = _interopRequireDefault(_Queue); + +var _Auth = __webpack_require__(21); + +var _Auth2 = _interopRequireDefault(_Auth); + +var _coreExternals = __webpack_require__(3); + +var _coreUtils = __webpack_require__(2); + +var Platform = (function (_Observable) { + _inherits(Platform, _Observable); + + _createClass(Platform, null, [{ + key: '_urlPrefix', + value: '/restapi', + enumerable: true + }, { + key: '_apiVersion', + value: 'v1.0', + enumerable: true + }, { + key: '_accessTokenTtl', + value: null, + // Platform server by default sets it to 60 * 60 = 1 hour + enumerable: true + }, { + key: '_refreshTokenTtl', + value: 10 * 60 * 60, + // 10 hours + enumerable: true + }, { + key: '_refreshTokenTtlRemember', + value: 7 * 24 * 60 * 60, + // 1 week + enumerable: true + }, { + key: '_tokenEndpoint', + value: '/restapi/oauth/token', + enumerable: true + }, { + key: '_revokeEndpoint', + value: '/restapi/oauth/revoke', + enumerable: true + }, { + key: '_authorizeEndpoint', + value: '/restapi/oauth/authorize', + enumerable: true + }, { + key: '_refreshDelayMs', + value: 100, + enumerable: true + }, { + key: '_cacheId', + value: 'platform', + enumerable: true + }, { + key: '_clearCacheOnRefreshError', + value: true, + enumerable: true + }]); + + function Platform(client, cache, server, appKey, appSecret) { + _classCallCheck(this, Platform); + + _Observable.call(this); + + this.events = { + beforeLogin: 'beforeLogin', + loginSuccess: 'loginSuccess', + loginError: 'loginError', + beforeRefresh: 'beforeRefresh', + refreshSuccess: 'refreshSuccess', + refreshError: 'refreshError', + beforeLogout: 'beforeLogout', + logoutSuccess: 'logoutSuccess', + logoutError: 'logoutError' + }; + this._server = server; + this._appKey = appKey; + this._appSecret = appSecret; -function PN_API(setup) { - var SUB_WINDOWING = +setup['windowing'] || DEF_WINDOWING - , SUB_TIMEOUT = (+setup['timeout'] || DEF_SUB_TIMEOUT) * SECOND - , KEEPALIVE = (+setup['keepalive'] || DEF_KEEPALIVE) * SECOND - , TIME_CHECK = setup['timecheck'] || 0 - , NOLEAVE = setup['noleave'] || 0 - , PUBLISH_KEY = setup['publish_key'] || 'demo' - , SUBSCRIBE_KEY = setup['subscribe_key'] || 'demo' - , AUTH_KEY = setup['auth_key'] || '' - , SECRET_KEY = setup['secret_key'] || '' - , hmac_SHA256 = setup['hmac_SHA256'] - , SSL = setup['ssl'] ? 's' : '' - , ORIGIN = 'http'+SSL+'://'+(setup['origin']||'pubsub.pubnub.com') - , STD_ORIGIN = nextorigin(ORIGIN) - , SUB_ORIGIN = nextorigin(ORIGIN) - , CONNECT = function(){} - , PUB_QUEUE = [] - , CLOAK = true - , TIME_DRIFT = 0 - , SUB_CALLBACK = 0 - , SUB_CHANNEL = 0 - , SUB_RECEIVER = 0 - , SUB_RESTORE = setup['restore'] || 0 - , SUB_BUFF_WAIT = 0 - , TIMETOKEN = 0 - , RESUMED = false - , CHANNELS = {} - , CHANNEL_GROUPS = {} - , SUB_ERROR = function(){} - , STATE = {} - , PRESENCE_HB_TIMEOUT = null - , PRESENCE_HB = validate_presence_heartbeat( - setup['heartbeat'] || setup['pnexpires'] || 0, setup['error'] - ) - , PRESENCE_HB_INTERVAL = setup['heartbeat_interval'] || (PRESENCE_HB / 2) -1 - , PRESENCE_HB_RUNNING = false - , NO_WAIT_FOR_PENDING = setup['no_wait_for_pending'] - , COMPATIBLE_35 = setup['compatible_3.5'] || false - , xdr = setup['xdr'] - , params = setup['params'] || {} - , error = setup['error'] || function() {} - , _is_online = setup['_is_online'] || function() { return 1 } - , jsonp_cb = setup['jsonp_cb'] || function() { return 0 } - , db = setup['db'] || {'get': function(){}, 'set': function(){}} - , CIPHER_KEY = setup['cipher_key'] - , UUID = setup['uuid'] || ( !setup['unique_uuid'] && db && db['get'](SUBSCRIBE_KEY+'uuid') || '') - , USE_INSTANCEID = setup['instance_id'] || false - , INSTANCEID = '' - , _poll_timer - , _poll_timer2; + /** @type {Cache} */ + this._cache = cache; - if (PRESENCE_HB === 2) PRESENCE_HB_INTERVAL = 1; + /** @type {Client} */ + this._client = client; - var crypto_obj = setup['crypto_obj'] || - { - 'encrypt' : function(a,key){ return a}, - 'decrypt' : function(b,key){return b} - }; + this._queue = new _Queue2['default'](this._cache, Platform._cacheId + '-refresh'); - function _get_url_params(data) { - if (!data) data = {}; - each( params , function( key, value ) { - if (!(key in data)) data[key] = value; - }); - return data; + this._auth = new _Auth2['default'](this._cache, Platform._cacheId); } - function _object_to_key_list(o) { - var l = [] - each( o , function( key, value ) { - l.push(key); - }); - return l; - } - function _object_to_key_list_sorted(o) { - return _object_to_key_list(o).sort(); - } + /** + * @return {Auth} + */ - function _get_pam_sign_input_from_params(params) { - var si = ""; - var l = _object_to_key_list_sorted(params); + Platform.prototype.auth = function auth() { + return this._auth; + }; - for (var i in l) { - var k = l[i] - si += k + "=" + pam_encode(params[k]) ; - if (i != l.length - 1) si += "&" - } - return si; - } + /** + * @return {Client} + */ - function validate_presence_heartbeat(heartbeat, cur_heartbeat, error) { - var err = false; + Platform.prototype.client = function client() { + return this._client; + }; - if (typeof heartbeat === 'undefined') { - return cur_heartbeat; - } + /** + * @param {string} path + * @param {object} [options] + * @param {boolean} [options.addServer] + * @param {string} [options.addMethod] + * @param {boolean} [options.addToken] + * @return {string} + */ - if (typeof heartbeat === 'number') { - if (heartbeat > PRESENCE_HB_THRESHOLD || heartbeat == 0) - err = false; - else - err = true; - } else if(typeof heartbeat === 'boolean'){ - if (!heartbeat) { - return 0; - } else { - return PRESENCE_HB_DEFAULT; - } - } else { - err = true; - } + Platform.prototype.createUrl = function createUrl(path, options) { - if (err) { - error && error("Presence Heartbeat value invalid. Valid range ( x > " + PRESENCE_HB_THRESHOLD + " or x = 0). Current Value : " + (cur_heartbeat || PRESENCE_HB_THRESHOLD)); - return cur_heartbeat || PRESENCE_HB_THRESHOLD; - } else return heartbeat; - } + path = path || ''; + options = options || {}; - function encrypt(input, key) { - return crypto_obj['encrypt'](input, key || CIPHER_KEY) || input; - } - function decrypt(input, key) { - return crypto_obj['decrypt'](input, key || CIPHER_KEY) || - crypto_obj['decrypt'](input, CIPHER_KEY) || - input; - } + var builtUrl = '', + hasHttp = path.indexOf('http://') != -1 || path.indexOf('https://') != -1; - function error_common(message, callback) { - callback && callback({ 'error' : message || "error occurred"}); - error && error(message); - } - function _presence_heartbeat() { + if (options.addServer && !hasHttp) builtUrl += this._server; - clearTimeout(PRESENCE_HB_TIMEOUT); + if (path.indexOf(Platform._urlPrefix) == -1 && !hasHttp) builtUrl += Platform._urlPrefix + '/' + Platform._apiVersion; - if (!PRESENCE_HB_INTERVAL || PRESENCE_HB_INTERVAL >= 500 || - PRESENCE_HB_INTERVAL < 1 || - (!generate_channel_list(CHANNELS,true).length && !generate_channel_group_list(CHANNEL_GROUPS, true).length ) ) - { - PRESENCE_HB_RUNNING = false; - return; + builtUrl += path; + + if (options.addMethod || options.addToken) builtUrl += path.indexOf('?') > -1 ? '&' : '?'; + + if (options.addMethod) builtUrl += '_method=' + options.addMethod; + if (options.addToken) builtUrl += (options.addMethod ? '&' : '') + 'access_token=' + this._auth.accessToken(); + + return builtUrl; + }; + + /** + * @param {string} options.redirectUri + * @param {string} options.state + * @param {string} options.brandId + * @param {string} options.display + * @param {string} options.prompt + * @return {string} + */ + + Platform.prototype.authUrl = function authUrl(options) { + + options = options || {}; + + return this.createUrl(Platform._authorizeEndpoint + '?' + _coreUtils.queryStringify({ + 'response_type': 'code', + 'redirect_uri': options.redirectUri || '', + 'client_id': this._appKey, + 'state': options.state || '', + 'brand_id': options.brandId || '', + 'display': options.display || '', + 'prompt': options.prompt || '' + }), { addServer: true }); + }; + + /** + * @param {string} url + * @return {Object} + */ + + Platform.prototype.parseAuthRedirectUrl = function parseAuthRedirectUrl(url) { + + var qs = _coreUtils.parseQueryString(url.split('?').reverse()[0]), + error = qs.error_description || qs.error; + + if (error) { + var e = new Error(error); + e.error = qs.error; + throw e; } - PRESENCE_HB_RUNNING = true; - SELF['presence_heartbeat']({ - 'callback' : function(r) { - PRESENCE_HB_TIMEOUT = timeout( _presence_heartbeat, (PRESENCE_HB_INTERVAL) * SECOND ); - }, - 'error' : function(e) { - error && error("Presence Heartbeat unable to reach Pubnub servers." + JSON.stringify(e)); - PRESENCE_HB_TIMEOUT = timeout( _presence_heartbeat, (PRESENCE_HB_INTERVAL) * SECOND ); + return qs; + }; + + /** + * @return {Promise} + */ + + Platform.prototype.loggedIn = function loggedIn() { + return regeneratorRuntime.async(function loggedIn$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + context$2$0.prev = 0; + context$2$0.next = 3; + return regeneratorRuntime.awrap(this._ensureAuthentication()); + + case 3: + return context$2$0.abrupt('return', true); + + case 6: + context$2$0.prev = 6; + context$2$0.t0 = context$2$0['catch'](0); + return context$2$0.abrupt('return', false); + + case 9: + case 'end': + return context$2$0.stop(); } - }); - } + }, null, this, [[0, 6]]); + }; - function start_presence_heartbeat() { - !PRESENCE_HB_RUNNING && _presence_heartbeat(); - } + /** + * @param {string} options.username + * @param {string} options.password + * @param {string} options.extension + * @param {string} options.code + * @param {string} options.redirectUri + * @param {string} options.endpointId + * @returns {Promise} + */ + + Platform.prototype.login = function login(options) { + var body, apiResponse, json; + return regeneratorRuntime.async(function login$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + context$2$0.prev = 0; - function publish(next) { + options = options || {}; - if (NO_WAIT_FOR_PENDING) { - if (!PUB_QUEUE.length) return; - } else { - if (next) PUB_QUEUE.sending = 0; - if ( PUB_QUEUE.sending || !PUB_QUEUE.length ) return; - PUB_QUEUE.sending = 1; - } + options.remember = options.remember || false; - xdr(PUB_QUEUE.shift()); - } - function each_channel_group(callback) { - var count = 0; + this.emit(this.events.beforeLogin); - each( generate_channel_group_list(CHANNEL_GROUPS), function(channel_group) { - var chang = CHANNEL_GROUPS[channel_group]; + body = { + "access_token_ttl": Platform._accessTokenTtl, + "refresh_token_ttl": options.remember ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl + }; - if (!chang) return; + if (!options.code) { - count++; - (callback||function(){})(chang); - } ); + body.grant_type = 'password'; + body.username = options.username; + body.password = options.password; + body.extension = options.extension || ''; + } else if (options.code) { - return count; - } + body.grant_type = 'authorization_code'; + body.code = options.code; + body.redirect_uri = options.redirectUri; + //body.client_id = this.getCredentials().key; // not needed + } + + if (options.endpointId) body.endpoint_id = options.endpointId; + + context$2$0.next = 9; + return regeneratorRuntime.awrap(this._tokenRequest(Platform._tokenEndpoint, body)); - function each_channel(callback) { - var count = 0; + case 9: + apiResponse = context$2$0.sent; + json = apiResponse.json(); - each( generate_channel_list(CHANNELS), function(channel) { - var chan = CHANNELS[channel]; + this._auth.setData(json).setRemember(options.remember); - if (!chan) return; + this.emit(this.events.loginSuccess, apiResponse); - count++; - (callback||function(){})(chan); - } ); + return context$2$0.abrupt('return', apiResponse); - return count; - } - function _invoke_callback(response, callback, err) { - if (typeof response == 'object') { - if (response['error']) { - var callback_data = {}; + case 16: + context$2$0.prev = 16; + context$2$0.t0 = context$2$0['catch'](0); - if (response['message']) { - callback_data['message'] = response['message']; - } + this._cache.clean(); - if (response['payload']) { - callback_data['payload'] = response['payload']; - } + this.emit(this.events.loginError, context$2$0.t0); - err && err(callback_data); - return; + throw context$2$0.t0; + case 21: + case 'end': + return context$2$0.stop(); } - if (response['payload']) { - if (response['next_page']) - callback && callback(response['payload'], response['next_page']); - else - callback && callback(response['payload']); - return; - } - } - callback && callback(response); - } + }, null, this, [[0, 16]]); + }; - function _invoke_error(response,err) { + /** + * @returns {Promise} + */ - if (typeof response == 'object' && response['error']) { - var callback_data = {}; + Platform.prototype.refresh = function refresh() { + var res, json; + return regeneratorRuntime.async(function refresh$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + context$2$0.prev = 0; - if (response['message']) { - callback_data['message'] = response['message']; - } + this.emit(this.events.beforeRefresh); - if (response['payload']) { - callback_data['payload'] = response['payload']; - } - - err && err(callback_data); - return; - } else { - err && err(response); - } - } - function CR(args, callback, url1, data) { - var callback = args['callback'] || callback - , err = args['error'] || error - , jsonp = jsonp_cb(); + if (!this._queue.isPaused()) { + context$2$0.next = 9; + break; + } - data = data || {}; - - if (!data['auth']) { - data['auth'] = args['auth_key'] || AUTH_KEY; - } - - var url = [ - STD_ORIGIN, 'v1', 'channel-registration', - 'sub-key', SUBSCRIBE_KEY - ]; + context$2$0.next = 5; + return regeneratorRuntime.awrap(this._queue.poll()); - url.push.apply(url,url1); - - if (jsonp) data['callback'] = jsonp; - - xdr({ - callback : jsonp, - data : _get_url_params(data), - success : function(response) { - _invoke_callback(response, callback, err); - }, - fail : function(response) { - _invoke_error(response, err); - }, - url : url - }); + case 5: + if (this._isAccessTokenValid()) { + context$2$0.next = 7; + break; + } - } + throw new Error('Automatic authentification timeout'); - // Announce Leave Event - var SELF = { - 'LEAVE' : function( channel, blocking, auth_key, callback, error ) { + case 7: - var data = { 'uuid' : UUID, 'auth' : auth_key || AUTH_KEY } - , origin = nextorigin(ORIGIN) - , callback = callback || function(){} - , err = error || function(){} - , jsonp = jsonp_cb(); + this.emit(this.events.refreshSuccess, null); - // Prevent Leaving a Presence Channel - if (channel.indexOf(PRESENCE_SUFFIX) > 0) return true; + return context$2$0.abrupt('return', null); - if (COMPATIBLE_35) { - if (!SSL) return false; - if (jsonp == '0') return false; - } + case 9: - if (NOLEAVE) return false; + this._queue.pause(); - if (jsonp != '0') data['callback'] = jsonp; + // Make sure all existing AJAX calls had a chance to reach the server + context$2$0.next = 12; + return regeneratorRuntime.awrap(_coreUtils.delay(Platform._refreshDelayMs)); - if (USE_INSTANCEID) data['instanceid'] = INSTANCEID; + case 12: + if (this._auth.refreshToken()) { + context$2$0.next = 14; + break; + } - xdr({ - blocking : blocking || SSL, - timeout : 2000, - callback : jsonp, - data : _get_url_params(data), - success : function(response) { - _invoke_callback(response, callback, err); - }, - fail : function(response) { - _invoke_error(response, err); - }, - url : [ - origin, 'v2', 'presence', 'sub_key', - SUBSCRIBE_KEY, 'channel', encode(channel), 'leave' - ] - }); - return true; - }, - 'LEAVE_GROUP' : function( channel_group, blocking, auth_key, callback, error ) { + throw new Error('Refresh token is missing'); - var data = { 'uuid' : UUID, 'auth' : auth_key || AUTH_KEY } - , origin = nextorigin(ORIGIN) - , callback = callback || function(){} - , err = error || function(){} - , jsonp = jsonp_cb(); + case 14: + if (this._auth.refreshTokenValid()) { + context$2$0.next = 16; + break; + } - // Prevent Leaving a Presence Channel Group - if (channel_group.indexOf(PRESENCE_SUFFIX) > 0) return true; + throw new Error('Refresh token has expired'); - if (COMPATIBLE_35) { - if (!SSL) return false; - if (jsonp == '0') return false; - } + case 16: + if (this._queue.isPaused()) { + context$2$0.next = 18; + break; + } - if (NOLEAVE) return false; + throw new Error('Queue was resumed before refresh call'); - if (jsonp != '0') data['callback'] = jsonp; + case 18: + context$2$0.next = 20; + return regeneratorRuntime.awrap(this._tokenRequest(Platform._tokenEndpoint, { + "grant_type": "refresh_token", + "refresh_token": this._auth.refreshToken(), + "access_token_ttl": Platform._accessTokenTtl, + "refresh_token_ttl": this._auth.remember() ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl + })); - if (channel_group && channel_group.length > 0) data['channel-group'] = channel_group; + case 20: + res = context$2$0.sent; + json = res.json(); - if (USE_INSTANCEID) data['instanceid'] = INSTANCEID; + if (json.access_token) { + context$2$0.next = 24; + break; + } - xdr({ - blocking : blocking || SSL, - timeout : 5000, - callback : jsonp, - data : _get_url_params(data), - success : function(response) { - _invoke_callback(response, callback, err); - }, - fail : function(response) { - _invoke_error(response, err); - }, - url : [ - origin, 'v2', 'presence', 'sub_key', - SUBSCRIBE_KEY, 'channel', encode(','), 'leave' - ] - }); - return true; - }, - 'set_resumed' : function(resumed) { - RESUMED = resumed; - }, - 'get_cipher_key' : function() { - return CIPHER_KEY; - }, - 'set_cipher_key' : function(key) { - CIPHER_KEY = key; - }, - 'raw_encrypt' : function(input, key) { - return encrypt(input, key); - }, - 'raw_decrypt' : function(input, key) { - return decrypt(input, key); - }, - 'get_heartbeat' : function() { - return PRESENCE_HB; - }, - - 'set_heartbeat' : function(heartbeat, heartbeat_interval) { - PRESENCE_HB = validate_presence_heartbeat(heartbeat, PRESENCE_HB, error); - PRESENCE_HB_INTERVAL = heartbeat_interval || (PRESENCE_HB / 2) - 1; - if (PRESENCE_HB == 2) { - PRESENCE_HB_INTERVAL = 1; - } - CONNECT(); - _presence_heartbeat(); - }, - - 'get_heartbeat_interval' : function() { - return PRESENCE_HB_INTERVAL; - }, - - 'set_heartbeat_interval' : function(heartbeat_interval) { - PRESENCE_HB_INTERVAL = heartbeat_interval; - _presence_heartbeat(); - }, - - 'get_version' : function() { - return SDK_VER; - }, - 'getGcmMessageObject' : function(obj) { - return { - 'data' : obj - } - }, - 'getApnsMessageObject' : function(obj) { - var x = { - 'aps' : { 'badge' : 1, 'alert' : ''} - } - for (k in obj) { - k[x] = obj[k]; - } - return x; - }, - 'newPnMessage' : function() { - var x = {}; - if (gcm) x['pn_gcm'] = gcm; - if (apns) x['pn_apns'] = apns; - for ( k in n ) { - x[k] = n[k]; - } - return x; - }, + throw this._client.makeError(new Error('Malformed OAuth response'), res); - '_add_param' : function(key,val) { - params[key] = val; - }, + case 24: - 'channel_group' : function(args, callback) { - var ns_ch = args['channel_group'] - , callback = callback || args['callback'] - , channels = args['channels'] || args['channel'] - , cloak = args['cloak'] - , namespace - , channel_group - , url = [] - , data = {} - , mode = args['mode'] || 'add'; + this._auth.setData(json); + this._queue.resume(); + this.emit(this.events.refreshSuccess, res); - if (ns_ch) { - var ns_ch_a = ns_ch.split(':'); + return context$2$0.abrupt('return', res); - if (ns_ch_a.length > 1) { - namespace = (ns_ch_a[0] === '*')?null:ns_ch_a[0]; + case 30: + context$2$0.prev = 30; + context$2$0.t0 = context$2$0['catch'](0); - channel_group = ns_ch_a[1]; - } else { - channel_group = ns_ch_a[0]; - } + context$2$0.t0 = this._client.makeError(context$2$0.t0); + + if (Platform._clearCacheOnRefreshError) { + this._cache.clean(); + } + + this.emit(this.events.refreshError, context$2$0.t0); + + throw context$2$0.t0; + + case 36: + case 'end': + return context$2$0.stop(); } + }, null, this, [[0, 30]]); + }; + + /** + * @returns {Promise} + */ - namespace && url.push('namespace') && url.push(encode(namespace)); + Platform.prototype.logout = function logout() { + var res; + return regeneratorRuntime.async(function logout$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + context$2$0.prev = 0; - url.push('channel-group'); + this.emit(this.events.beforeLogout); - if (channel_group && channel_group !== '*') { - url.push(channel_group); - } + this._queue.pause(); - if (channels ) { - if (isArray(channels)) { - channels = channels.join(','); - } - data[mode] = channels; - data['cloak'] = (CLOAK)?'true':'false'; - } else { - if (mode === 'remove') url.push('remove'); - } + context$2$0.next = 5; + return regeneratorRuntime.awrap(this._tokenRequest(Platform._revokeEndpoint, { + token: this._auth.accessToken() + })); - if (typeof cloak != 'undefined') data['cloak'] = (cloak)?'true':'false'; + case 5: + res = context$2$0.sent; - CR(args, callback, url, data); - }, + this._queue.resume(); + this._cache.clean(); - 'channel_group_list_groups' : function(args, callback) { - var namespace; + this.emit(this.events.logoutSuccess, res); - namespace = args['namespace'] || args['ns'] || args['channel_group'] || null; - if (namespace) { - args["channel_group"] = namespace + ":*"; - } + return context$2$0.abrupt('return', res); - SELF['channel_group'](args, callback); - }, + case 12: + context$2$0.prev = 12; + context$2$0.t0 = context$2$0['catch'](0); - 'channel_group_list_channels' : function(args, callback) { - if (!args['channel_group']) return error('Missing Channel Group'); - SELF['channel_group'](args, callback); - }, + this._queue.resume(); - 'channel_group_remove_channel' : function(args, callback) { - if (!args['channel_group']) return error('Missing Channel Group'); - if (!args['channel'] && !args['channels'] ) return error('Missing Channel'); + this.emit(this.events.logoutError, context$2$0.t0); - args['mode'] = 'remove'; - SELF['channel_group'](args,callback); - }, + throw context$2$0.t0; - 'channel_group_remove_group' : function(args, callback) { - if (!args['channel_group']) return error('Missing Channel Group'); - if (args['channel']) return error('Use channel_group_remove_channel if you want to remove a channel from a group.'); + case 17: + case 'end': + return context$2$0.stop(); + } + }, null, this, [[0, 12]]); + }; - args['mode'] = 'remove'; - SELF['channel_group'](args,callback); - }, + /** + * @param {Request} request + * @param {object} [options] + * @param {boolean} [options.skipAuthCheck] + * @return {Promise} + */ - 'channel_group_add_channel' : function(args, callback) { - if (!args['channel_group']) return error('Missing Channel Group'); - if (!args['channel'] && !args['channels'] ) return error('Missing Channel'); - SELF['channel_group'](args,callback); - }, + Platform.prototype.inflateRequest = function inflateRequest(request, options) { + return regeneratorRuntime.async(function inflateRequest$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: - 'channel_group_cloak' : function(args, callback) { - if (typeof args['cloak'] == 'undefined') { - callback(CLOAK); - return; - } - CLOAK = args['cloak']; - SELF['channel_group'](args,callback); - }, + options = options || {}; - 'channel_group_list_namespaces' : function(args, callback) { - var url = ['namespace']; - CR(args, callback, url); - }, - 'channel_group_remove_namespace' : function(args, callback) { - var url = ['namespace',args['namespace'],'remove']; - CR(args, callback, url); - }, + if (!options.skipAuthCheck) { + context$2$0.next = 3; + break; + } - /* - PUBNUB.history({ - channel : 'my_chat_channel', - limit : 100, - callback : function(history) { } - }); - */ - 'history' : function( args, callback ) { - var callback = args['callback'] || callback - , count = args['count'] || args['limit'] || 100 - , reverse = args['reverse'] || "false" - , err = args['error'] || function(){} - , auth_key = args['auth_key'] || AUTH_KEY - , cipher_key = args['cipher_key'] - , channel = args['channel'] - , channel_group = args['channel_group'] - , start = args['start'] - , end = args['end'] - , include_token = args['include_token'] - , params = {} - , jsonp = jsonp_cb(); + return context$2$0.abrupt('return', request); - // Make sure we have a Channel - if (!channel && !channel_group) return error('Missing Channel'); - if (!callback) return error('Missing Callback'); - if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key'); + case 3: + context$2$0.next = 5; + return regeneratorRuntime.awrap(this._ensureAuthentication()); - params['stringtoken'] = 'true'; - params['count'] = count; - params['reverse'] = reverse; - params['auth'] = auth_key; + case 5: - if (channel_group) { - params['channel-group'] = channel_group; - if (!channel) { - channel = ','; - } + request.headers.set('Authorization', this._authHeader()); + //request.url = this.createUrl(request.url, {addServer: true}); //FIXME Spec prevents this... + + //TODO Add User-Agent here + + return context$2$0.abrupt('return', request); + + case 7: + case 'end': + return context$2$0.stop(); } - if (jsonp) params['callback'] = jsonp; - if (start) params['start'] = start; - if (end) params['end'] = end; - if (include_token) params['include_token'] = 'true'; + }, null, this); + }; - // Send Message - xdr({ - callback : jsonp, - data : _get_url_params(params), - success : function(response) { - if (typeof response == 'object' && response['error']) { - err({'message' : response['message'], 'payload' : response['payload']}); - return; - } - var messages = response[0]; - var decrypted_messages = []; - for (var a = 0; a < messages.length; a++) { - var new_message = decrypt(messages[a],cipher_key); - try { - decrypted_messages['push'](JSON['parse'](new_message)); - } catch (e) { - decrypted_messages['push']((new_message)); - } + /** + * @param {Request} request + * @param {object} [options] + * @param {boolean} [options.skipAuthCheck] + * @return {Promise} + */ + + Platform.prototype.sendRequest = function sendRequest(request, options) { + return regeneratorRuntime.async(function sendRequest$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + context$2$0.prev = 0; + context$2$0.next = 3; + return regeneratorRuntime.awrap(this.inflateRequest(request, options)); + + case 3: + request = context$2$0.sent; + context$2$0.next = 6; + return regeneratorRuntime.awrap(this._client.sendRequest(request)); + + case 6: + return context$2$0.abrupt('return', context$2$0.sent); + + case 9: + context$2$0.prev = 9; + context$2$0.t0 = context$2$0['catch'](0); + + if (!(!context$2$0.t0.apiResponse || !context$2$0.t0.apiResponse.response() || context$2$0.t0.apiResponse.response().status != 401)) { + context$2$0.next = 13; + break; } - callback([decrypted_messages, response[1], response[2]]); - }, - fail : function(response) { - _invoke_error(response, err); - }, - url : [ - STD_ORIGIN, 'v2', 'history', 'sub-key', - SUBSCRIBE_KEY, 'channel', encode(channel) - ] - }); - }, - - /* - PUBNUB.replay({ - source : 'my_channel', - destination : 'new_channel' - }); - */ - 'replay' : function(args, callback) { - var callback = callback || args['callback'] || function(){} - , auth_key = args['auth_key'] || AUTH_KEY - , source = args['source'] - , destination = args['destination'] - , stop = args['stop'] - , start = args['start'] - , end = args['end'] - , reverse = args['reverse'] - , limit = args['limit'] - , jsonp = jsonp_cb() - , data = {} - , url; - // Check User Input - if (!source) return error('Missing Source Channel'); - if (!destination) return error('Missing Destination Channel'); - if (!PUBLISH_KEY) return error('Missing Publish Key'); - if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key'); + throw context$2$0.t0; - // Setup URL Params - if (jsonp != '0') data['callback'] = jsonp; - if (stop) data['stop'] = 'all'; - if (reverse) data['reverse'] = 'true'; - if (start) data['start'] = start; - if (end) data['end'] = end; - if (limit) data['count'] = limit; + case 13: - data['auth'] = auth_key; + this._auth.cancelAccessToken(); - // Compose URL Parts - url = [ - STD_ORIGIN, 'v1', 'replay', - PUBLISH_KEY, SUBSCRIBE_KEY, - source, destination - ]; + context$2$0.next = 16; + return regeneratorRuntime.awrap(this.sendRequest(request, options)); - // Start (or Stop) Replay! - xdr({ - callback : jsonp, - success : function(response) { - _invoke_callback(response, callback, err); - }, - fail : function() { callback([ 0, 'Disconnected' ]) }, - url : url, - data : _get_url_params(data) - }); - }, + case 16: + return context$2$0.abrupt('return', context$2$0.sent); - /* - PUBNUB.auth('AJFLKAJSDKLA'); - */ - 'auth' : function(auth) { - AUTH_KEY = auth; - CONNECT(); - }, + case 17: + case 'end': + return context$2$0.stop(); + } + }, null, this, [[0, 9]]); + }; - /* - PUBNUB.time(function(time){ }); - */ - 'time' : function(callback) { - var jsonp = jsonp_cb(); + /** + * General purpose function to send anything to server + * @param {object} [options.body] + * @param {string} [options.url] + * @param {string} [options.method] + * @param {object} [options.query] + * @param {object} [options.headers] + * @param {boolean} [options.skipAuthCheck] + * @return {Promise} + */ + + Platform.prototype.send = function send() { + var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; + return regeneratorRuntime.async(function send$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + + //FIXME https://github.com/bitinn/node-fetch/issues/43 + options.url = this.createUrl(options.url, { addServer: true }); + + context$2$0.next = 3; + return regeneratorRuntime.awrap(this.sendRequest(this._client.createRequest(options), options)); + + case 3: + return context$2$0.abrupt('return', context$2$0.sent); + + case 4: + case 'end': + return context$2$0.stop(); + } + }, null, this); + }; - var data = { 'uuid' : UUID, 'auth' : AUTH_KEY } + /** + * @param {string} url + * @param {object} query + * @param {object} [options] + * @param {object} [options.headers] + * @param {boolean} [options.skipAuthCheck] + * @return {Promise} + */ + + Platform.prototype.get = function get(url, query, options) { + return regeneratorRuntime.async(function get$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + options = options || {}; + options.method = 'GET'; + options.url = url; + options.query = query; + context$2$0.next = 6; + return regeneratorRuntime.awrap(this.send(options)); - if (USE_INSTANCEID) data['instanceid'] = INSTANCEID; + case 6: + return context$2$0.abrupt('return', context$2$0.sent); - xdr({ - callback : jsonp, - data : _get_url_params(data), - timeout : SECOND * 5, - url : [STD_ORIGIN, 'time', jsonp], - success : function(response) { callback(response[0]) }, - fail : function() { callback(0) } - }); - }, + case 7: + case 'end': + return context$2$0.stop(); + } + }, null, this); + }; - /* - PUBNUB.publish({ - channel : 'my_chat_channel', - message : 'hello!' - }); - */ - 'publish' : function( args, callback ) { - var msg = args['message']; - if (!msg) return error('Missing Message'); + /** + * @param {string} url + * @param {object} body + * @param {object} query + * @param {object} [options] + * @param {object} [options.headers] + * @param {boolean} [options.skipAuthCheck] + * @return {Promise} + */ + + Platform.prototype.post = function post(url, body, query, options) { + return regeneratorRuntime.async(function post$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + options = options || {}; + options.method = 'POST'; + options.url = url; + options.query = query; + options.body = body; + context$2$0.next = 7; + return regeneratorRuntime.awrap(this.send(options)); + + case 7: + return context$2$0.abrupt('return', context$2$0.sent); + + case 8: + case 'end': + return context$2$0.stop(); + } + }, null, this); + }; - var callback = callback || args['callback'] || msg['callback'] || function(){} - , channel = args['channel'] || msg['channel'] - , auth_key = args['auth_key'] || AUTH_KEY - , cipher_key = args['cipher_key'] - , err = args['error'] || msg['error'] || function() {} - , post = args['post'] || false - , store = ('store_in_history' in args) ? args['store_in_history']: true - , jsonp = jsonp_cb() - , add_msg = 'push' - , params - , url; + /** + * @param {string} url + * @param {object} body + * @param {object} query + * @param {object} [options] + * @param {object} [options.headers] + * @param {boolean} [options.skipAuthCheck] + * @return {Promise} + */ + + Platform.prototype.put = function put(url, body, query, options) { + return regeneratorRuntime.async(function put$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + options = options || {}; + options.method = 'PUT'; + options.url = url; + options.query = query; + options.body = body; + context$2$0.next = 7; + return regeneratorRuntime.awrap(this.send(options)); + + case 7: + return context$2$0.abrupt('return', context$2$0.sent); + + case 8: + case 'end': + return context$2$0.stop(); + } + }, null, this); + }; - if (args['prepend']) add_msg = 'unshift' + /** + * @param {string} url + * @param {string} query + * @param {object} [options] + * @param {object} [options.headers] + * @param {boolean} [options.skipAuthCheck] + * @return {Promise} + */ + + Platform.prototype['delete'] = function _delete(url, query, options) { + return regeneratorRuntime.async(function _delete$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + options = options || {}; + options.method = 'DELETE'; + options.url = url; + options.query = query; + context$2$0.next = 6; + return regeneratorRuntime.awrap(this.send(options)); - if (!channel) return error('Missing Channel'); - if (!PUBLISH_KEY) return error('Missing Publish Key'); - if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key'); + case 6: + return context$2$0.abrupt('return', context$2$0.sent); - if (msg['getPubnubMessage']) { - msg = msg['getPubnubMessage'](); + case 7: + case 'end': + return context$2$0.stop(); } + }, null, this); + }; - // If trying to send Object - msg = JSON['stringify'](encrypt(msg, cipher_key)); + Platform.prototype._tokenRequest = function _tokenRequest(path, body) { + return regeneratorRuntime.async(function _tokenRequest$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + context$2$0.next = 2; + return regeneratorRuntime.awrap(this.send({ + url: path, + skipAuthCheck: true, + body: body, + method: 'POST', + headers: { + 'Authorization': 'Basic ' + this._apiKey(), + 'Content-Type': 'application/x-www-form-urlencoded' + } + })); - // Create URL - url = [ - STD_ORIGIN, 'publish', - PUBLISH_KEY, SUBSCRIBE_KEY, - 0, encode(channel), - jsonp, encode(msg) - ]; + case 2: + return context$2$0.abrupt('return', context$2$0.sent); - params = { 'uuid' : UUID, 'auth' : auth_key } + case 3: + case 'end': + return context$2$0.stop(); + } + }, null, this); + }; - if (!store) params['store'] ="0" + Platform.prototype._ensureAuthentication = function _ensureAuthentication() { + return regeneratorRuntime.async(function _ensureAuthentication$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + if (!this._isAccessTokenValid()) { + context$2$0.next = 2; + break; + } - if (USE_INSTANCEID) params['instanceid'] = INSTANCEID; + return context$2$0.abrupt('return', null); - // Queue Message Send - PUB_QUEUE[add_msg]({ - callback : jsonp, - timeout : SECOND * 5, - url : url, - data : _get_url_params(params), - fail : function(response){ - _invoke_error(response, err); - publish(1); - }, - success : function(response) { - _invoke_callback(response, callback, err); - publish(1); - }, - mode : (post)?'POST':'GET' - }); + case 2: + context$2$0.next = 4; + return regeneratorRuntime.awrap(this.refresh()); - // Send Message - publish(); - }, + case 4: + return context$2$0.abrupt('return', context$2$0.sent); - /* - PUBNUB.unsubscribe({ channel : 'my_chat' }); - */ - 'unsubscribe' : function(args, callback) { - var channel = args['channel'] - , channel_group = args['channel_group'] - , auth_key = args['auth_key'] || AUTH_KEY - , callback = callback || args['callback'] || function(){} - , err = args['error'] || function(){}; + case 5: + case 'end': + return context$2$0.stop(); + } + }, null, this); + }; - TIMETOKEN = 0; - //SUB_RESTORE = 1; REVISIT !!!! + Platform.prototype._isAccessTokenValid = function _isAccessTokenValid() { - if (channel) { - // Prepare Channel(s) - channel = map( ( - channel.join ? channel.join(',') : ''+channel - ).split(','), function(channel) { - if (!CHANNELS[channel]) return; - return channel + ',' + channel + PRESENCE_SUFFIX; - } ).join(','); + return this._auth.accessTokenValid() && !this._queue.isPaused(); + }; - // Iterate over Channels - each( channel.split(','), function(ch) { - var CB_CALLED = true; - if (!ch) return; - CHANNELS[ch] = 0; - if (ch in STATE) delete STATE[ch]; - if (READY) { - CB_CALLED = SELF['LEAVE']( ch, 0 , auth_key, callback, err); - } - if (!CB_CALLED) callback({action : "leave"}); + Platform.prototype._apiKey = function _apiKey() { + var apiKey = this._appKey + ':' + this._appSecret; + return typeof btoa == 'function' ? btoa(apiKey) : new Buffer(apiKey).toString('base64'); + }; - - } ); - } + Platform.prototype._authHeader = function _authHeader() { + var token = this._auth.accessToken(); + return this._auth.tokenType() + (token ? ' ' + token : ''); + }; - if (channel_group) { - // Prepare channel group(s) - channel_group = map( ( - channel_group.join ? channel_group.join(',') : ''+channel_group - ).split(','), function(channel_group) { - if (!CHANNEL_GROUPS[channel_group]) return; - return channel_group + ',' + channel_group + PRESENCE_SUFFIX; - } ).join(','); + return Platform; +})(_coreObservable2['default']); - // Iterate over channel groups - each( channel_group.split(','), function(chg) { - var CB_CALLED = true; - if (!chg) return; - CHANNEL_GROUPS[chg] = 0; - if (chg in STATE) delete STATE[chg]; - if (READY) { - CB_CALLED = SELF['LEAVE_GROUP']( chg, 0 , auth_key, callback, err); - } - if (!CB_CALLED) callback({action : "leave"}); +exports['default'] = Platform; +module.exports = exports['default']; - } ); - } +// Perform sanity checks - // Reset Connection if Count Less - CONNECT(); - }, +/** @type {ApiResponse} */ - /* - PUBNUB.subscribe({ - channel : 'my_chat' - callback : function(message) { } - }); - */ - 'subscribe' : function( args, callback ) { - var channel = args['channel'] - , channel_group = args['channel_group'] - , callback = callback || args['callback'] - , callback = callback || args['message'] - , connect = args['connect'] || function(){} - , reconnect = args['reconnect'] || function(){} - , disconnect = args['disconnect'] || function(){} - , SUB_ERROR = args['error'] || SUB_ERROR || function(){} - , idlecb = args['idle'] || function(){} - , presence = args['presence'] || 0 - , noheresync = args['noheresync'] || 0 - , backfill = args['backfill'] || 0 - , timetoken = args['timetoken'] || 0 - , sub_timeout = args['timeout'] || SUB_TIMEOUT - , windowing = args['windowing'] || SUB_WINDOWING - , state = args['state'] - , heartbeat = args['heartbeat'] || args['pnexpires'] - , heartbeat_interval = args['heartbeat_interval'] - , restore = args['restore'] || SUB_RESTORE; +// Guard is for errors that come from polling - AUTH_KEY = args['auth_key'] || AUTH_KEY; +/***/ }, +/* 20 */ +/***/ function(module, exports, __webpack_require__) { - // Restore Enabled? - SUB_RESTORE = restore; +'use strict'; - // Always Reset the TT - TIMETOKEN = timetoken; +exports.__esModule = true; - // Make sure we have a Channel - if (!channel && !channel_group) { - return error('Missing Channel'); - } +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; }; })(); - if (!callback) return error('Missing Callback'); - if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key'); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - if (heartbeat || heartbeat === 0 || heartbeat_interval || heartbeat_interval === 0) { - SELF['set_heartbeat'](heartbeat, heartbeat_interval); - } +var _coreExternals = __webpack_require__(3); - // Setup Channel(s) - if (channel) { - each( (channel.join ? channel.join(',') : ''+channel).split(','), - function(channel) { - var settings = CHANNELS[channel] || {}; +var _coreUtils = __webpack_require__(2); - // Store Channel State - CHANNELS[SUB_CHANNEL = channel] = { - name : channel, - connected : settings.connected, - disconnected : settings.disconnected, - subscribed : 1, - callback : SUB_CALLBACK = callback, - 'cipher_key' : args['cipher_key'], - connect : connect, - disconnect : disconnect, - reconnect : reconnect - }; +var Queue = (function () { + _createClass(Queue, null, [{ + key: '_pollInterval', + value: 250, + enumerable: true + }, { + key: '_releaseTimeout', + value: 5000, + enumerable: true + }]); - if (state) { - if (channel in state) { - STATE[channel] = state[channel]; - } else { - STATE[channel] = state; - } - } + function Queue(cache, cacheId) { + _classCallCheck(this, Queue); - // Presence Enabled? - if (!presence) return; + this._cache = cache; + this._cacheId = cacheId; + this._promise = null; + } - // Subscribe Presence Channel - SELF['subscribe']({ - 'channel' : channel + PRESENCE_SUFFIX, - 'callback' : presence, - 'restore' : restore - }); + Queue.prototype.isPaused = function isPaused() { - // Presence Subscribed? - if (settings.subscribed) return; + var storage = this._cache, + cacheId = this._cacheId, + time = storage.getItem(cacheId); - // See Who's Here Now? - if (noheresync) return; - SELF['here_now']({ - 'channel' : channel, - 'data' : _get_url_params({ 'uuid' : UUID, 'auth' : AUTH_KEY }), - 'callback' : function(here) { - each( 'uuids' in here ? here['uuids'] : [], - function(uid) { presence( { - 'action' : 'join', - 'uuid' : uid, - 'timestamp' : Math.floor(rnow() / 1000), - 'occupancy' : here['occupancy'] || 1 - }, here, channel ); } ); - } - }); - } ); - } + return !!time && Date.now() - parseInt(time) < Queue._releaseTimeout; + }; - // Setup Channel Groups - if (channel_group) { - each( (channel_group.join ? channel_group.join(',') : ''+channel_group).split(','), - function(channel_group) { - var settings = CHANNEL_GROUPS[channel_group] || {}; + Queue.prototype.pause = function pause() { + this._cache.setItem(this._cacheId, Date.now()); + return this; + }; - CHANNEL_GROUPS[channel_group] = { - name : channel_group, - connected : settings.connected, - disconnected : settings.disconnected, - subscribed : 1, - callback : SUB_CALLBACK = callback, - 'cipher_key' : args['cipher_key'], - connect : connect, - disconnect : disconnect, - reconnect : reconnect - }; + Queue.prototype.resume = function resume() { + this._cache.removeItem(this._cacheId); + return this; + }; - // Presence Enabled? - if (!presence) return; + Queue.prototype.poll = function poll() { + var _this = this; - // Subscribe Presence Channel - SELF['subscribe']({ - 'channel_group' : channel_group + PRESENCE_SUFFIX, - 'callback' : presence, - 'restore' : restore, - 'auth_key' : AUTH_KEY - }); + if (this._promise) return this._promise; - // Presence Subscribed? - if (settings.subscribed) return; + this._promise = new _coreExternals.Promise(function (resolve, reject) { - // See Who's Here Now? - if (noheresync) return; - SELF['here_now']({ - 'channel_group' : channel_group, - 'data' : _get_url_params({ 'uuid' : UUID, 'auth' : AUTH_KEY }), - 'callback' : function(here) { - each( 'uuids' in here ? here['uuids'] : [], - function(uid) { presence( { - 'action' : 'join', - 'uuid' : uid, - 'timestamp' : Math.floor(rnow() / 1000), - 'occupancy' : here['occupancy'] || 1 - }, here, channel_group ); } ); - } - }); - } ); - } + _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; + }; - // Test Network Connection - function _test_connection(success) { - if (success) { - // Begin Next Socket Connection - timeout( CONNECT, windowing); - } - else { - // New Origin on Failed Connection - STD_ORIGIN = nextorigin( ORIGIN, 1 ); - SUB_ORIGIN = nextorigin( ORIGIN, 1 ); + return Queue; +})(); - // Re-test Connection - timeout( function() { - SELF['time'](_test_connection); - }, SECOND ); - } +exports['default'] = Queue; +module.exports = exports['default']; - // Disconnect & Reconnect - each_channel(function(channel){ - // Reconnect - if (success && channel.disconnected) { - channel.disconnected = 0; - return channel.reconnect(channel.name); - } +/***/ }, +/* 21 */ +/***/ function(module, exports) { - // Disconnect - if (!success && !channel.disconnected) { - channel.disconnected = 1; - channel.disconnect(channel.name); - } - }); - - // Disconnect & Reconnect for channel groups - each_channel_group(function(channel_group){ - // Reconnect - if (success && channel_group.disconnected) { - channel_group.disconnected = 0; - return channel_group.reconnect(channel_group.name); - } +'use strict'; - // Disconnect - if (!success && !channel_group.disconnected) { - channel_group.disconnected = 1; - channel_group.disconnect(channel_group.name); - } - }); - } +exports.__esModule = true; - // Evented Subscribe - function _connect() { - var jsonp = jsonp_cb() - , channels = generate_channel_list(CHANNELS).join(',') - , channel_groups = generate_channel_group_list(CHANNEL_GROUPS).join(','); +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; }; })(); - // Stop Connection - if (!channels && !channel_groups) return; +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - if (!channels) channels = ','; +var Auth = (function () { + _createClass(Auth, null, [{ + key: 'refreshHandicapMs', + value: 60 * 1000, + // 1 minute + enumerable: true + }, { + key: 'forcedTokenType', + value: 'forced', + enumerable: true + }]); - // Connect to PubNub Subscribe Servers - _reset_offline(); + function Auth(cache, cacheId) { + _classCallCheck(this, Auth); - var data = _get_url_params({ 'uuid' : UUID, 'auth' : AUTH_KEY }); + /** @type {Cache} */ + this._cache = cache; + this._cacheId = cacheId; + } - if (channel_groups) { - data['channel-group'] = channel_groups; - } + //export interface IAuthData { + // remember?:boolean; + // token_type?:string; + // access_token?:string; + // expires_in?:number; // actually it's string + // expire_time?:number; + // refresh_token?:string; + // refresh_token_expires_in?:number; // actually it's string + // refresh_token_expire_time?:number; + // scope?:string; + //} + + Auth.prototype.accessToken = function accessToken() { + return this.data().access_token; + }; + Auth.prototype.refreshToken = function refreshToken() { + return this.data().refresh_token; + }; - var st = JSON.stringify(STATE); - if (st.length > 2) data['state'] = JSON.stringify(STATE); + Auth.prototype.tokenType = function tokenType() { + return this.data().token_type; + }; - if (PRESENCE_HB) data['heartbeat'] = PRESENCE_HB; + /** + * @return {{token_type: string, access_token: string, expires_in: number, refresh_token: string, refresh_token_expires_in: number}} + */ - if (USE_INSTANCEID) data['instanceid'] = INSTANCEID; + Auth.prototype.data = function data() { - start_presence_heartbeat(); - SUB_RECEIVER = xdr({ - timeout : sub_timeout, - callback : jsonp, - fail : function(response) { - if (response && response['error'] && response['service']) { - _invoke_error(response, SUB_ERROR); - _test_connection(1); - } else { - SELF['time'](function(success){ - !success && ( _invoke_error(response, SUB_ERROR)); - _test_connection(success); - }); - } - }, - data : _get_url_params(data), - url : [ - SUB_ORIGIN, 'subscribe', - SUBSCRIBE_KEY, encode(channels), - jsonp, TIMETOKEN - ], - success : function(messages) { + return this._cache.getItem(this._cacheId) || { + token_type: '', + access_token: '', + expires_in: 0, + refresh_token: '', + refresh_token_expires_in: 0 + }; + }; - // Check for Errors - if (!messages || ( - typeof messages == 'object' && - 'error' in messages && - messages['error'] - )) { - SUB_ERROR(messages['error']); - return timeout( CONNECT, SECOND ); - } + /** + * @param {object} newData + * @return {Auth} + */ - // User Idle Callback - idlecb(messages[1]); + Auth.prototype.setData = function setData(newData) { - // Restore Previous Connection Point if Needed - TIMETOKEN = !TIMETOKEN && - SUB_RESTORE && - db['get'](SUBSCRIBE_KEY) || messages[1]; + newData = newData || {}; - /* - // Connect - each_channel_registry(function(registry){ - if (registry.connected) return; - registry.connected = 1; - registry.connect(channel.name); - }); - */ + var data = this.data(); - // Connect - each_channel(function(channel){ - if (channel.connected) return; - channel.connected = 1; - channel.connect(channel.name); - }); + Object.keys(newData).forEach(function (key) { + data[key] = newData[key]; + }); - // Connect for channel groups - each_channel_group(function(channel_group){ - if (channel_group.connected) return; - channel_group.connected = 1; - channel_group.connect(channel_group.name); - }); + data.expire_time = Date.now() + data.expires_in * 1000; + data.refresh_token_expire_time = Date.now() + data.refresh_token_expires_in * 1000; - if (RESUMED && !SUB_RESTORE) { - TIMETOKEN = 0; - RESUMED = false; - // Update Saved Timetoken - db['set']( SUBSCRIBE_KEY, 0 ); - timeout( _connect, windowing ); - return; - } + this._cache.setItem(this._cacheId, data); - // Invoke Memory Catchup and Receive Up to 100 - // Previous Messages from the Queue. - if (backfill) { - TIMETOKEN = 10000; - backfill = 0; - } + return this; + }; - // Update Saved Timetoken - db['set']( SUBSCRIBE_KEY, messages[1] ); + /** + * Check if there is a valid (not expired) access token + * @return {boolean} + */ - // Route Channel <---> Callback for Message - var next_callback = (function() { - var channels = ''; - var channels2 = ''; + Auth.prototype.accessTokenValid = function accessTokenValid() { - if (messages.length > 3) { - channels = messages[3]; - channels2 = messages[2]; - } else if (messages.length > 2) { - channels = messages[2]; - } else { - channels = map( - generate_channel_list(CHANNELS), function(chan) { return map( - Array(messages[0].length) - .join(',').split(','), - function() { return chan; } - ) }).join(',') - } + var authData = this.data(); + return authData.token_type === Auth.forcedTokenType || authData.expire_time - Auth.refreshHandicapMs > Date.now(); + }; - var list = channels.split(','); - var list2 = (channels2)?channels2.split(','):[]; + /** + * Check if there is a valid (not expired) access token + * @return {boolean} + */ - return function() { - var channel = list.shift()||SUB_CHANNEL; - var channel2 = list2.shift(); + Auth.prototype.refreshTokenValid = function refreshTokenValid() { - var chobj = {}; + return this.data().refresh_token_expire_time > Date.now(); + }; - if (channel2) { - if (channel && channel.indexOf('-pnpres') >= 0 - && channel2.indexOf('-pnpres') < 0) { - channel2 += '-pnpres'; - } - chobj = CHANNEL_GROUPS[channel2] || CHANNELS[channel2] || {'callback' : function(){}}; - } else { - chobj = CHANNELS[channel]; - } + /** + * @return {Auth} + */ - var r = [ - chobj - .callback||SUB_CALLBACK, - channel.split(PRESENCE_SUFFIX)[0] - ]; - channel2 && r.push(channel2.split(PRESENCE_SUFFIX)[0]); - return r; - }; - })(); + Auth.prototype.cancelAccessToken = function cancelAccessToken() { - var latency = detect_latency(+messages[1]); - each( messages[0], function(msg) { - var next = next_callback(); - var decrypted_msg = decrypt(msg, - (CHANNELS[next[1]])?CHANNELS[next[1]]['cipher_key']:null); - next[0] && next[0]( decrypted_msg, messages, next[2] || next[1], latency, next[1]); - }); + return this.setData({ + access_token: '', + expires_in: 0 + }); + }; - timeout( _connect, windowing ); - } - }); - } + /** + * This method sets a special authentication mode used in Service Web + * @return {Auth} + */ + + Auth.prototype.forceAuthentication = function forceAuthentication() { + + this.setData({ + token_type: Auth.forcedTokenType, + access_token: '', + expires_in: 0, + refresh_token: '', + refresh_token_expires_in: 0 + }); - CONNECT = function() { - _reset_offline(); - timeout( _connect, windowing ); - }; + return this; + }; - // Reduce Status Flicker - if (!READY) return READY_BUFFER.push(CONNECT); + /** + * @param remember + * @return {Auth} + */ - // Connect Now - CONNECT(); - }, + Auth.prototype.setRemember = function setRemember(remember) { - /* - PUBNUB.here_now({ channel : 'my_chat', callback : fun }); - */ - 'here_now' : function( args, callback ) { - var callback = args['callback'] || callback - , err = args['error'] || function(){} - , auth_key = args['auth_key'] || AUTH_KEY - , channel = args['channel'] - , channel_group = args['channel_group'] - , jsonp = jsonp_cb() - , uuids = ('uuids' in args) ? args['uuids'] : true - , state = args['state'] - , data = { 'uuid' : UUID, 'auth' : auth_key }; + return this.setData({ remember: remember }); + }; - if (!uuids) data['disable_uuids'] = 1; - if (state) data['state'] = 1; + /** + * @return {boolean} + */ - // Make sure we have a Channel - if (!callback) return error('Missing Callback'); - if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key'); + Auth.prototype.remember = function remember() { - var url = [ - STD_ORIGIN, 'v2', 'presence', - 'sub_key', SUBSCRIBE_KEY - ]; + return !!this.data().remember; + }; - channel && url.push('channel') && url.push(encode(channel)); + return Auth; +})(); - if (jsonp != '0') { data['callback'] = jsonp; } +exports['default'] = Auth; +module.exports = exports['default']; - if (channel_group) { - data['channel-group'] = channel_group; - !channel && url.push('channel') && url.push(','); - } +/***/ }, +/* 22 */ +/***/ function(module, exports, __webpack_require__) { + +'use strict'; + +exports.__esModule = true; + +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'); } } + +var _PubnubMockJs = __webpack_require__(23); + +var _PubnubMockJs2 = _interopRequireDefault(_PubnubMockJs); - if (USE_INSTANCEID) data['instanceid'] = INSTANCEID; +var _coreExternals = __webpack_require__(3); - xdr({ - callback : jsonp, - data : _get_url_params(data), - success : function(response) { - _invoke_callback(response, callback, err); - }, - fail : function(response) { - _invoke_error(response, err); - }, - url : url - }); - }, +var PubnubMockFactory = (function () { + function PubnubMockFactory() { + _classCallCheck(this, PubnubMockFactory); - /* - PUBNUB.current_channels_by_uuid({ channel : 'my_chat', callback : fun }); - */ - 'where_now' : function( args, callback ) { - var callback = args['callback'] || callback - , err = args['error'] || function(){} - , auth_key = args['auth_key'] || AUTH_KEY - , jsonp = jsonp_cb() - , uuid = args['uuid'] || UUID - , data = { 'auth' : auth_key }; + this.crypto_obj = _coreExternals.PUBNUB.crypto_obj; + } - // Make sure we have a Channel - if (!callback) return error('Missing Callback'); - if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key'); + PubnubMockFactory.prototype.init = function init(options) { + return new _PubnubMockJs2['default'](options); + }; - if (jsonp != '0') { data['callback'] = jsonp; } + return PubnubMockFactory; +})(); - if (USE_INSTANCEID) data['instanceid'] = INSTANCEID; +exports['default'] = PubnubMockFactory; +module.exports = exports['default']; - xdr({ - callback : jsonp, - data : _get_url_params(data), - success : function(response) { - _invoke_callback(response, callback, err); - }, - fail : function(response) { - _invoke_error(response, err); - }, - url : [ - STD_ORIGIN, 'v2', 'presence', - 'sub_key', SUBSCRIBE_KEY, - 'uuid', encode(uuid) - ] - }); - }, +/***/ }, +/* 23 */ +/***/ function(module, exports, __webpack_require__) { - 'state' : function(args, callback) { - var callback = args['callback'] || callback || function(r) {} - , err = args['error'] || function(){} - , auth_key = args['auth_key'] || AUTH_KEY - , jsonp = jsonp_cb() - , state = args['state'] - , uuid = args['uuid'] || UUID - , channel = args['channel'] - , channel_group = args['channel_group'] - , url - , data = _get_url_params({ 'auth' : auth_key }); +'use strict'; - // Make sure we have a Channel - if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key'); - if (!uuid) return error('Missing UUID'); - if (!channel && !channel_group) return error('Missing Channel'); +exports.__esModule = true; - if (jsonp != '0') { data['callback'] = jsonp; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - if (typeof channel != 'undefined' - && CHANNELS[channel] && CHANNELS[channel].subscribed ) { - if (state) STATE[channel] = state; - } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - if (typeof channel_group != 'undefined' - && CHANNEL_GROUPS[channel_group] - && CHANNEL_GROUPS[channel_group].subscribed - ) { - if (state) STATE[channel_group] = state; - data['channel-group'] = channel_group; +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; } - if (!channel) { - channel = ','; - } - } +var _coreObservable = __webpack_require__(12); - data['state'] = JSON.stringify(state); +var _coreObservable2 = _interopRequireDefault(_coreObservable); - if (USE_INSTANCEID) data['instanceid'] = INSTANCEID; +var _coreExternals = __webpack_require__(3); - if (state) { - url = [ - STD_ORIGIN, 'v2', 'presence', - 'sub-key', SUBSCRIBE_KEY, - 'channel', channel, - 'uuid', uuid, 'data' - ] - } else { - url = [ - STD_ORIGIN, 'v2', 'presence', - 'sub-key', SUBSCRIBE_KEY, - 'channel', channel, - 'uuid', encode(uuid) - ] - } +var PubnubMock = (function (_Observable) { + _inherits(PubnubMock, _Observable); - xdr({ - callback : jsonp, - data : _get_url_params(data), - success : function(response) { - _invoke_callback(response, callback, err); - }, - fail : function(response) { - _invoke_error(response, err); - }, - url : url + function PubnubMock(options) { + _classCallCheck(this, PubnubMock); - }); + _Observable.call(this); + this.options = options; + this.crypto_obj = _coreExternals.PUBNUB.crypto_obj; + } - }, + PubnubMock.prototype.ready = function ready() {}; - /* - PUBNUB.grant({ - channel : 'my_chat', - callback : fun, - error : fun, - ttl : 24 * 60, // Minutes - read : true, - write : true, - auth_key : '3y8uiajdklytowsj' - }); - */ - 'grant' : function( args, callback ) { - var callback = args['callback'] || callback - , err = args['error'] || function(){} - , channel = args['channel'] || args['channels'] - , channel_group = args['channel_group'] - , jsonp = jsonp_cb() - , ttl = args['ttl'] - , r = (args['read'] )?"1":"0" - , w = (args['write'])?"1":"0" - , m = (args['manage'])?"1":"0" - , auth_key = args['auth_key'] || args['auth_keys']; + PubnubMock.prototype.subscribe = function subscribe(options) { + this.on('message-' + options.channel, options.message); + }; - if (!callback) return error('Missing Callback'); - if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key'); - if (!PUBLISH_KEY) return error('Missing Publish Key'); - if (!SECRET_KEY) return error('Missing Secret Key'); + PubnubMock.prototype.unsubscribe = function unsubscribe(options) { + this.off('message-' + options.channel); + }; - var timestamp = Math.floor(new Date().getTime() / 1000) - , sign_input = SUBSCRIBE_KEY + "\n" + PUBLISH_KEY + "\n" - + "grant" + "\n"; + PubnubMock.prototype.receiveMessage = function receiveMessage(msg, channel) { + this.emit('message-' + channel, msg, 'env', channel); + }; - var data = { - 'w' : w, - 'r' : r, - 'timestamp' : timestamp - }; - if (args['manage']) { - data['m'] = m; - } - if (isArray(channel)) { - channel = channel['join'](','); - } - if (isArray(auth_key)) { - auth_key = auth_key['join'](','); - } - if (typeof channel != 'undefined' && channel != null && channel.length > 0) data['channel'] = channel; - if (typeof channel_group != 'undefined' && channel_group != null && channel_group.length > 0) { - data['channel-group'] = channel_group; - } - if (jsonp != '0') { data['callback'] = jsonp; } - if (ttl || ttl === 0) data['ttl'] = ttl; + return PubnubMock; +})(_coreObservable2['default']); - if (auth_key) data['auth'] = auth_key; +exports['default'] = PubnubMock; +module.exports = exports['default']; - data = _get_url_params(data) +/***/ }, +/* 24 */ +/***/ function(module, exports, __webpack_require__) { - if (!auth_key) delete data['auth']; +'use strict'; - sign_input += _get_pam_sign_input_from_params(data); +exports.__esModule = true; - var signature = hmac_SHA256( sign_input, SECRET_KEY ); +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; }; })(); - signature = signature.replace( /\+/g, "-" ); - signature = signature.replace( /\//g, "_" ); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - data['signature'] = signature; +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - xdr({ - callback : jsonp, - data : data, - success : function(response) { - _invoke_callback(response, callback, err); - }, - fail : function(response) { - _invoke_error(response, err); - }, - url : [ - STD_ORIGIN, 'v1', 'auth', 'grant' , - 'sub-key', SUBSCRIBE_KEY - ] - }); - }, +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; } - /* - PUBNUB.mobile_gw_provision ({ - device_id: 'A655FBA9931AB', - op : 'add' | 'remove', - gw_type : 'apns' | 'gcm', - channel : 'my_chat', - callback : fun, - error : fun, - }); - */ +var _coreObservable = __webpack_require__(12); - 'mobile_gw_provision' : function( args ) { +var _coreObservable2 = _interopRequireDefault(_coreObservable); - var callback = args['callback'] || function(){} - , auth_key = args['auth_key'] || AUTH_KEY - , err = args['error'] || function() {} - , jsonp = jsonp_cb() - , channel = args['channel'] - , op = args['op'] - , gw_type = args['gw_type'] - , device_id = args['device_id'] - , params - , url; +var _httpClient = __webpack_require__(13); - if (!device_id) return error('Missing Device ID (device_id)'); - if (!gw_type) return error('Missing GW Type (gw_type: gcm or apns)'); - if (!op) return error('Missing GW Operation (op: add or remove)'); - if (!channel) return error('Missing gw destination Channel (channel)'); - if (!PUBLISH_KEY) return error('Missing Publish Key'); - if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key'); +var _httpClient2 = _interopRequireDefault(_httpClient); - // Create URL - url = [ - STD_ORIGIN, 'v1/push/sub-key', - SUBSCRIBE_KEY, 'devices', device_id - ]; +var _coreUtils = __webpack_require__(2); - params = { 'uuid' : UUID, 'auth' : auth_key, 'type': gw_type}; +var Subscription = (function (_Observable) { + _inherits(Subscription, _Observable); - if (op == "add") { - params['add'] = channel; - } else if (op == "remove") { - params['remove'] = channel; - } + _createClass(Subscription, null, [{ + key: '_renewHandicapMs', + value: 2 * 60 * 1000, + enumerable: true + }, { + key: '_pollInterval', + value: 10 * 1000, + enumerable: true + }]); - if (USE_INSTANCEID) data['instanceid'] = INSTANCEID; + function Subscription(pubnubFactory, platform, cache) { + _classCallCheck(this, Subscription); - xdr({ - callback : jsonp, - data : params, - success : function(response) { - _invoke_callback(response, callback, err); - }, - fail : function(response) { - _invoke_error(response, err); - }, - url : url - }); + _Observable.call(this); - }, + this.events = { + notification: 'notification', + removeSuccess: 'removeSuccess', + removeError: 'removeError', + renewSuccess: 'renewSuccess', + renewError: 'renewError', + subscribeSuccess: 'subscribeSuccess', + subscribeError: 'subscribeError' + }; + this._pubnubFactory = pubnubFactory; + this._platform = platform; + this._cache = cache; + this._pubnub = null; + this._timeout = null; + this._subscription = {}; + } - /* - PUBNUB.audit({ - channel : 'my_chat', - callback : fun, - error : fun, - read : true, - write : true, - auth_key : '3y8uiajdklytowsj' - }); - */ - 'audit' : function( args, callback ) { - var callback = args['callback'] || callback - , err = args['error'] || function(){} - , channel = args['channel'] - , channel_group = args['channel_group'] - , auth_key = args['auth_key'] - , jsonp = jsonp_cb(); + //export interface ISubscription { + // id?:string; + // uri?: string; + // eventFilters?:string[]; + // expirationTime?:string; // 2014-03-12T19:54:35.613Z + // expiresIn?:number; + // deliveryMode?: { + // transportType?:string; + // encryption?:boolean; + // address?:string; + // subscriberKey?:string; + // encryptionKey?:string; + // secretKey?:string; + // }; + // creationTime?:string; // 2014-03-12T19:54:35.613Z + // status?:string; // Active + //} + + /** + * @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()); + }; - // Make sure we have a Channel - if (!callback) return error('Missing Callback'); - if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key'); - if (!PUBLISH_KEY) return error('Missing Publish Key'); - if (!SECRET_KEY) return error('Missing Secret Key'); + Subscription.prototype.expirationTime = function expirationTime() { + return new Date(this._subscription.expirationTime || 0).getTime() - Subscription._renewHandicapMs; + }; - var timestamp = Math.floor(new Date().getTime() / 1000) - , sign_input = SUBSCRIBE_KEY + "\n" - + PUBLISH_KEY + "\n" - + "audit" + "\n"; + Subscription.prototype.setSubscription = function setSubscription(subscription) { - var data = {'timestamp' : timestamp }; - if (jsonp != '0') { data['callback'] = jsonp; } - if (typeof channel != 'undefined' && channel != null && channel.length > 0) data['channel'] = channel; - if (typeof channel_group != 'undefined' && channel_group != null && channel_group.length > 0) { - data['channel-group'] = channel_group; - } - if (auth_key) data['auth'] = auth_key; + subscription = subscription || {}; - data = _get_url_params(data); + this._clearTimeout(); - if (!auth_key) delete data['auth']; + this._subscription = subscription; - sign_input += _get_pam_sign_input_from_params(data); + if (!this._pubnub) this._subscribeAtPubnub(); - var signature = hmac_SHA256( sign_input, SECRET_KEY ); + this._setTimeout(); - signature = signature.replace( /\+/g, "-" ); - signature = signature.replace( /\//g, "_" ); + return this; + }; - data['signature'] = signature; - xdr({ - callback : jsonp, - data : data, - success : function(response) { - _invoke_callback(response, callback, err); - }, - fail : function(response) { - _invoke_error(response, err); - }, - url : [ - STD_ORIGIN, 'v1', 'auth', 'audit' , - 'sub-key', SUBSCRIBE_KEY - ] - }); - }, + Subscription.prototype.subscription = function subscription() { + return this._subscription; + }; - /* - PUBNUB.revoke({ - channel : 'my_chat', - callback : fun, - error : fun, - auth_key : '3y8uiajdklytowsj' - }); - */ - 'revoke' : function( args, callback ) { - args['read'] = false; - args['write'] = false; - SELF['grant']( args, callback ); - }, - 'set_uuid' : function(uuid) { - UUID = uuid; - CONNECT(); - }, - 'get_uuid' : function() { - return UUID; - }, - 'isArray' : function(arg) { - return isArray(arg); - }, - 'get_subscibed_channels' : function() { - return generate_channel_list(CHANNELS, true); - }, - 'presence_heartbeat' : function(args) { - var callback = args['callback'] || function() {} - var err = args['error'] || function() {} - var jsonp = jsonp_cb(); - var data = { 'uuid' : UUID, 'auth' : AUTH_KEY }; + /** + * 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) { + return regeneratorRuntime.async(function register$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + if (!this.alive()) { + context$2$0.next = 6; + break; + } - var st = JSON['stringify'](STATE); - if (st.length > 2) data['state'] = JSON['stringify'](STATE); + context$2$0.next = 3; + return regeneratorRuntime.awrap(this.renew(options)); - if (PRESENCE_HB > 0 && PRESENCE_HB < 320) data['heartbeat'] = PRESENCE_HB; + case 3: + return context$2$0.abrupt('return', context$2$0.sent); - if (jsonp != '0') { data['callback'] = jsonp; } + case 6: + context$2$0.next = 8; + return regeneratorRuntime.awrap(this.subscribe(options)); - var channels = encode(generate_channel_list(CHANNELS, true)['join'](',')); - var channel_groups = generate_channel_group_list(CHANNEL_GROUPS, true)['join'](','); + case 8: + return context$2$0.abrupt('return', context$2$0.sent); - if (!channels) channels = ','; - if (channel_groups) data['channel-group'] = channel_groups; + case 9: + case 'end': + return context$2$0.stop(); + } + }, null, this); + }; - if (USE_INSTANCEID) data['instanceid'] = INSTANCEID; + Subscription.prototype.eventFilters = function eventFilters() { + return this._subscription.eventFilters || []; + }; - xdr({ - callback : jsonp, - data : _get_url_params(data), - timeout : SECOND * 5, - url : [ - STD_ORIGIN, 'v2', 'presence', - 'sub-key', SUBSCRIBE_KEY, - 'channel' , channels, - 'heartbeat' - ], - success : function(response) { - _invoke_callback(response, callback, err); - }, - fail : function(response) { _invoke_error(response, err); } - }); - }, - 'stop_timers': function () { - clearTimeout(_poll_timer); - clearTimeout(_poll_timer2); - }, + /** + * @param {string[]} events + * @return {Subscription} + */ - // Expose PUBNUB Functions - 'xdr' : xdr, - 'ready' : ready, - 'db' : db, - 'uuid' : generate_uuid, - 'map' : map, - 'each' : each, - 'each-channel' : each_channel, - 'grep' : grep, - 'offline' : function(){ _reset_offline( - 1, { "message" : "Offline. Please check your network settings." }) - }, - 'supplant' : supplant, - 'now' : rnow, - 'unique' : unique, - 'updater' : updater + Subscription.prototype.addEventFilters = function addEventFilters(events) { + this.setEventFilters(this.eventFilters().concat(events)); + return this; }; - function _poll_online() { - _is_online() || _reset_offline( 1, { - "error" : "Offline. Please check your network settings. " - }); - _poll_timer && clearTimeout(_poll_timer); - _poll_timer = timeout( _poll_online, SECOND ); - } + /** + * @param {string[]} events + * @return {Subscription} + */ - function _poll_online2() { - if (!TIME_CHECK) return; - SELF['time'](function(success){ - detect_time_detla( function(){}, success ); - success || _reset_offline( 1, { - "error" : "Heartbeat failed to connect to Pubnub Servers." + - "Please check your network settings." - }); - _poll_timer2 && clearTimeout(_poll_timer2); - _poll_timer2 = timeout( _poll_online2, KEEPALIVE ); - }); - } + Subscription.prototype.setEventFilters = function setEventFilters(events) { + this._subscription.eventFilters = events; + return this; + }; - function _reset_offline(err, msg) { - SUB_RECEIVER && SUB_RECEIVER(err, msg); - SUB_RECEIVER = null; + /** + * @param {{events?:string[]}} [options] New array of events + * @returns {Promise} + */ - clearTimeout(_poll_timer); - clearTimeout(_poll_timer2); - } - - if (!UUID) UUID = SELF['uuid'](); - if (!INSTANCEID) INSTANCEID = SELF['uuid'](); - db['set']( SUBSCRIBE_KEY + 'uuid', UUID ); + Subscription.prototype.subscribe = function subscribe(options) { + 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; - _poll_timer = timeout( _poll_online, SECOND ); - _poll_timer2 = timeout( _poll_online2, KEEPALIVE ); - PRESENCE_HB_TIMEOUT = timeout( - start_presence_heartbeat, - ( PRESENCE_HB_INTERVAL - 3 ) * SECOND - ); + options = options || {}; - // Detect Age of Message - function detect_latency(tt) { - var adjusted_time = rnow() - TIME_DRIFT; - return adjusted_time - tt / 10000; - } + if (options.events) this.setEventFilters(options.events); - detect_time_detla(); - function detect_time_detla( cb, time ) { - var stime = rnow(); + this._clearTimeout(); - time && calculate(time) || SELF['time'](calculate); + if (this.eventFilters().length) { + context$2$0.next = 6; + break; + } - function calculate(time) { - if (!time) return; - var ptime = time / 10000 - , latency = (rnow() - stime) / 2; - TIME_DRIFT = rnow() - (ptime + latency); - cb && cb(TIME_DRIFT); - } - } + throw new Error('Events are undefined'); - return SELF; -} -function crypto_obj() { + case 6: + context$2$0.next = 8; + return regeneratorRuntime.awrap(this._platform.post('/restapi/v1.0/subscription', { + eventFilters: this._getFullEventFilters(), + deliveryMode: { + transportType: 'PubNub' + } + })); - function SHA256(s) { - return CryptoJS['SHA256'](s)['toString'](CryptoJS['enc']['Hex']); - } + case 8: + response = context$2$0.sent; + json = response.json(); - var iv = "0123456789012345"; + this.setSubscription(json).emit(this.events.subscribeSuccess, response); - var allowedKeyEncodings = ['hex', 'utf8', 'base64', 'binary']; - var allowedKeyLengths = [128, 256]; - var allowedModes = ['ecb', 'cbc']; + return context$2$0.abrupt('return', response); - var defaultOptions = { - 'encryptKey': true, - 'keyEncoding': 'utf8', - 'keyLength': 256, - 'mode': 'cbc' + 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); + + this.reset().emit(this.events.subscribeError, context$2$0.t0); + + throw context$2$0.t0; + + case 19: + case 'end': + return context$2$0.stop(); + } + }, null, this, [[0, 14]]); }; - function parse_options(options) { + /** + * @param {{events?:string[]}} [options] New array of events + * @returns {Promise} + */ - // Defaults - options = options || {}; - if (!options['hasOwnProperty']('encryptKey')) options['encryptKey'] = defaultOptions['encryptKey']; - if (!options['hasOwnProperty']('keyEncoding')) options['keyEncoding'] = defaultOptions['keyEncoding']; - if (!options['hasOwnProperty']('keyLength')) options['keyLength'] = defaultOptions['keyLength']; - if (!options['hasOwnProperty']('mode')) options['mode'] = defaultOptions['mode']; + Subscription.prototype.renew = function renew(options) { + 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; - // Validation - if (allowedKeyEncodings['indexOf'](options['keyEncoding']['toLowerCase']()) == -1) options['keyEncoding'] = defaultOptions['keyEncoding']; - if (allowedKeyLengths['indexOf'](parseInt(options['keyLength'], 10)) == -1) options['keyLength'] = defaultOptions['keyLength']; - if (allowedModes['indexOf'](options['mode']['toLowerCase']()) == -1) options['mode'] = defaultOptions['mode']; + options = options || {}; - return options; + if (options.events) this.setEventFilters(options.events); - } + this._clearTimeout(); - function decode_key(key, options) { - if (options['keyEncoding'] == 'base64') { - return CryptoJS['enc']['Base64']['parse'](key); - } else if (options['keyEncoding'] == 'hex') { - return CryptoJS['enc']['Hex']['parse'](key); - } else { - return key; - } - } + if (this.alive()) { + context$2$0.next = 6; + break; + } - function get_padded_key(key, options) { - key = decode_key(key, options); - if (options['encryptKey']) { - return CryptoJS['enc']['Utf8']['parse'](SHA256(key)['slice'](0, 32)); - } else { - return key; - } - } + throw new Error('Subscription is not alive'); - function get_mode(options) { - if (options['mode'] == 'ecb') { - return CryptoJS['mode']['ECB']; - } else { - return CryptoJS['mode']['CBC']; - } - } + case 6: + if (this.eventFilters().length) { + context$2$0.next = 8; + break; + } + + throw new Error('Events are undefined'); + + case 8: + context$2$0.next = 10; + return regeneratorRuntime.awrap(this._platform.put('/restapi/v1.0/subscription/' + this._subscription.id, { + eventFilters: this._getFullEventFilters() + })); + + case 10: + response = context$2$0.sent; + json = response.json(); + + this.setSubscription(json).emit(this.events.renewSuccess, response); + + return context$2$0.abrupt('return', response); + + case 16: + context$2$0.prev = 16; + context$2$0.t0 = context$2$0['catch'](0); - function get_iv(options) { - return (options['mode'] == 'cbc') ? CryptoJS['enc']['Utf8']['parse'](iv) : null; - } + context$2$0.t0 = this._platform.client().makeError(context$2$0.t0); - return { + this.reset().emit(this.events.renewError, context$2$0.t0); - 'encrypt': function(data, key, options) { - if (!key) return data; - options = parse_options(options); - var iv = get_iv(options); - var mode = get_mode(options); - var cipher_key = get_padded_key(key, options); - var hex_message = JSON['stringify'](data); - var encryptedHexArray = CryptoJS['AES']['encrypt'](hex_message, cipher_key, {'iv': iv, 'mode': mode})['ciphertext']; - var base_64_encrypted = encryptedHexArray['toString'](CryptoJS['enc']['Base64']); - return base_64_encrypted || data; - }, + throw context$2$0.t0; - 'decrypt': function(data, key, options) { - if (!key) return data; - options = parse_options(options); - var iv = get_iv(options); - var mode = get_mode(options); - var cipher_key = get_padded_key(key, options); - try { - var binary_enc = CryptoJS['enc']['Base64']['parse'](data); - var json_plain = CryptoJS['AES']['decrypt']({'ciphertext': binary_enc}, cipher_key, {'iv': iv, 'mode': mode})['toString'](CryptoJS['enc']['Utf8']); - var plaintext = JSON['parse'](json_plain); - return plaintext; - } - catch (e) { - return undefined; + case 21: + case 'end': + return context$2$0.stop(); } - } + }, null, this, [[0, 16]]); }; -} -/* =-====================================================================-= */ -/* =-====================================================================-= */ -/* =-========================= UTIL =============================-= */ -/* =-====================================================================-= */ -/* =-====================================================================-= */ -window['PUBNUB'] || (function() { + /** + * @returns {Promise} + */ -/** - * UTIL LOCALS - */ + Subscription.prototype.remove = function remove() { + var response; + return regeneratorRuntime.async(function remove$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + context$2$0.prev = 0; -var SWF = 'https://pubnub.a.ssl.fastly.net/pubnub.swf' -, ASYNC = 'async' -, UA = navigator.userAgent -, PNSDK = 'PubNub-JS-' + 'Web' + '/' + '3.7.13' -, XORIGN = UA.indexOf('MSIE 6') == -1; + if (this.alive()) { + context$2$0.next = 3; + break; + } -/** - * CONSOLE COMPATIBILITY - */ -window.console || (window.console=window.console||{}); -console.log || ( - console.log = - console.error = - ((window.opera||{}).postError||function(){}) -); + throw new Error('Subscription is not alive'); -/** - * LOCAL STORAGE OR COOKIE - */ -var db = (function(){ - var store = {}; - var ls = false; - try { - ls = window['localStorage']; - } catch (e) { } - var cookieGet = function(key) { - if (document.cookie.indexOf(key) == -1) return null; - return ((document.cookie||'').match( - RegExp(key+'=([^;]+)') - )||[])[1] || null; + case 3: + context$2$0.next = 5; + return regeneratorRuntime.awrap(this._platform['delete']('/restapi/v1.0/subscription/' + this._subscription.id)); + + case 5: + response = context$2$0.sent; + + this.reset().emit(this.events.removeSuccess, response); + + return context$2$0.abrupt('return', response); + + case 10: + context$2$0.prev = 10; + context$2$0.t0 = context$2$0['catch'](0); + + context$2$0.t0 = this._platform.client().makeError(context$2$0.t0); + + this.emit(this.events.removeError, context$2$0.t0); + + throw context$2$0.t0; + + case 15: + case 'end': + return context$2$0.stop(); + } + }, null, this, [[0, 10]]); }; - var cookieSet = function( key, value ) { - document.cookie = key + '=' + value + - '; expires=Thu, 1 Aug 2030 20:00:00 UTC; path=/'; + + /** + * Remove subscription and disconnect from PUBNUB + * This method resets subscription at client side but backend is not notified + */ + + Subscription.prototype.reset = function reset() { + this._clearTimeout(); + if (this.alive() && this._pubnub) this._pubnub.unsubscribe({ channel: this._subscription.deliveryMode.address }); + this._subscription = {}; + return this; }; - var cookieTest = (function() { - try { - cookieSet('pnctest', '1'); - return cookieGet('pnctest') === '1'; - } catch (e) { - return false; - } - }()); - return { - 'get' : function(key) { - try { - if (ls) return ls.getItem(key); - if (cookieTest) return cookieGet(key); - return store[key]; - } catch(e) { - return store[key]; - } - }, - 'set' : function( key, value ) { + + /** + * + * @param {string} cacheKey + * @param {string[]} events + * @return {Subscription} + */ + + 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 { - if (ls) return ls.setItem( key, value ) && 0; - if (cookieTest) cookieSet( key, value ); - store[key] = value; - } catch(e) { - store[key] = value; - } + this.setSubscription(cachedSubscriptionData); + } catch (e) {} + } else { + this.setEventFilters(events); } - }; -})(); -function get_hmac_SHA256(data,key) { - var hash = CryptoJS['HmacSHA256'](data, key); - return hash.toString(CryptoJS['enc']['Base64']); -} + return this; + }; -/** - * $ - * = - * var div = $('divid'); - */ -function $(id) { return document.getElementById(id) } + Subscription.prototype._getFullEventFilters = function _getFullEventFilters() { + var _this2 = this; -/** - * ERROR - * ===== - * error('message'); - */ -function error(message) { console['error'](message) } + return this.eventFilters().map(function (event) { + return _this2._platform.createUrl(event); + }); + }; -/** - * SEARCH - * ====== - * var elements = search('a div span'); - */ -function search( elements, start) { - var list = []; - each( elements.split(/\s+/), function(el) { - each( (start || document).getElementsByTagName(el), function(node) { - list.push(node); - } ); - }); - return list; -} + Subscription.prototype._setTimeout = function _setTimeout() { + var _this3 = this; -/** - * BIND - * ==== - * bind( 'keydown', search('a')[0], function(element) { - * ... - * } ); - */ -function bind( type, el, fun ) { - each( type.split(','), function(etype) { - var rapfun = function(e) { - if (!e) e = window.event; - if (!fun(e)) { - e.cancelBubble = true; - e.preventDefault && e.preventDefault(); - e.stopPropagation && e.stopPropagation(); - } - }; + this._clearTimeout(); - if ( el.addEventListener ) el.addEventListener( etype, rapfun, false ); - else if ( el.attachEvent ) el.attachEvent( 'on' + etype, rapfun ); - else el[ 'on' + etype ] = rapfun; - } ); -} + if (!this.alive()) throw new Error('Subscription is not alive'); -/** - * UNBIND - * ====== - * unbind( 'keydown', search('a')[0] ); - */ -function unbind( type, el, fun ) { - if ( el.removeEventListener ) el.removeEventListener( type, false ); - else if ( el.detachEvent ) el.detachEvent( 'on' + type, false ); - else el[ 'on' + type ] = null; -} + _coreUtils.poll(function (next) { -/** - * HEAD - * ==== - * head().appendChild(elm); - */ -function head() { return search('head')[0] } + if (_this3.alive()) return next(); -/** - * ATTR - * ==== - * var attribute = attr( node, 'attribute' ); - */ -function attr( node, attribute, value ) { - if (value) node.setAttribute( attribute, value ); - else return node && node.getAttribute && node.getAttribute(attribute); -} + _this3.renew(); + }, Subscription._pollInterval, this._timeout); -/** - * CSS - * === - * var obj = create('div'); - */ -function css( element, styles ) { - for (var style in styles) if (styles.hasOwnProperty(style)) - try {element.style[style] = styles[style] + ( - '|width|height|top|left|'.indexOf(style) > 0 && - typeof styles[style] == 'number' - ? 'px' : '' - )}catch(e){} -} + return this; + }; -/** - * CREATE - * ====== - * var obj = create('div'); - */ -function create(element) { return document.createElement(element) } + Subscription.prototype._clearTimeout = function _clearTimeout() { + _coreUtils.stopPolling(this._timeout); -/** - * jsonp_cb - * ======== - * var callback = jsonp_cb(); - */ -function jsonp_cb() { return XORIGN || FDomainRequest() ? 0 : unique() } + return this; + }; + Subscription.prototype._decrypt = function _decrypt(message) { + if (!this.alive()) throw new Error('Subscription is not alive'); -/** - * EVENTS - * ====== - * PUBNUB.events.bind( 'you-stepped-on-flower', function(message) { - * // Do Stuff with message - * } ); - * - * PUBNUB.events.fire( 'you-stepped-on-flower', "message-data" ); - * PUBNUB.events.fire( 'you-stepped-on-flower', {message:"data"} ); - * PUBNUB.events.fire( 'you-stepped-on-flower', [1,2,3] ); - * - */ -var events = { - 'list' : {}, - 'unbind' : function( name ) { events.list[name] = [] }, - 'bind' : function( name, fun ) { - (events.list[name] = events.list[name] || []).push(fun); - }, - 'fire' : function( name, data ) { - each( - events.list[name] || [], - function(fun) { fun(data) } - ); - } -}; + if (this._subscription.deliveryMode.encryptionKey) { -/** - * XDR Cross Domain Request - * ======================== - * xdr({ - * url : ['http://www.blah.com/url'], - * success : function(response) {}, - * fail : function() {} - * }); - */ -function xdr( setup ) { - if (XORIGN || FDomainRequest()) return ajax(setup); + var PUBNUB = this._pubnubFactory; - var script = create('script') - , callback = setup.callback - , id = unique() - , finished = 0 - , xhrtme = setup.timeout || DEF_TIMEOUT - , timer = timeout( function(){done(1, {"message" : "timeout"})}, xhrtme ) - , fail = setup.fail || function(){} - , data = setup.data || {} - , success = setup.success || function(){} - , append = function() { head().appendChild(script) } - , done = function( failed, response ) { - if (finished) return; - finished = 1; + message = PUBNUB.crypto_obj.decrypt(message, this._subscription.deliveryMode.encryptionKey, { + encryptKey: false, + keyEncoding: 'base64', + keyLength: 128, + mode: 'ecb' + }); + } - script.onerror = null; - clearTimeout(timer); + return message; + }; - (failed || !response) || success(response); + Subscription.prototype._notify = function _notify(message) { - timeout( function() { - failed && fail(); - var s = $(id) - , p = s && s.parentNode; - p && p.removeChild(s); - }, SECOND ); - }; + this.emit(this.events.notification, this._decrypt(message)); - window[callback] = function(response) { - done( 0, response ); + return this; }; - if (!setup.blocking) script[ASYNC] = ASYNC; + Subscription.prototype._subscribeAtPubnub = function _subscribeAtPubnub() { - script.onerror = function() { done(1) }; - script.src = build_url( setup.url, data ); + if (!this.alive()) throw new Error('Subscription is not alive'); - attr( script, 'id', id ); + var PUBNUB = this._pubnubFactory; - append(); - return done; -} + this._pubnub = PUBNUB.init({ + ssl: true, + subscribe_key: this._subscription.deliveryMode.subscriberKey + }); -/** - * CORS XHR Request - * ================ - * xdr({ - * url : ['http://www.blah.com/url'], - * success : function(response) {}, - * fail : function() {} - * }); - */ -function ajax( setup ) { - var xhr, response - , finished = function() { - if (loaded) return; - loaded = 1; + this._pubnub.ready(); - clearTimeout(timer); + this._pubnub.subscribe({ + channel: this._subscription.deliveryMode.address, + message: this._notify.bind(this), + connect: function connect() {} + }); - try { response = JSON['parse'](xhr.responseText); } - catch (r) { return done(1); } + return this; + }; - complete = 1; - success(response); - } - , complete = 0 - , loaded = 0 - , xhrtme = setup.timeout || DEF_TIMEOUT - , timer = timeout( function(){done(1, {"message" : "timeout"})}, xhrtme ) - , fail = setup.fail || function(){} - , data = setup.data || {} - , success = setup.success || function(){} - , async = !(setup.blocking) - , done = function(failed,response) { - if (complete) return; - complete = 1; + return Subscription; +})(_coreObservable2['default']); - clearTimeout(timer); +exports['default'] = Subscription; +module.exports = exports['default']; - if (xhr) { - xhr.onerror = xhr.onload = null; - xhr.abort && xhr.abort(); - xhr = null; - } +/***/ }, +/* 25 */ +/***/ function(module, exports) { - failed && fail(response); - }; +/* WEBPACK VAR INJECTION */(function(global) {/** + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * https://raw.github.com/facebook/regenerator/master/LICENSE file. An + * additional grant of patent rights can be found in the PATENTS file in + * the same directory. + */ - // Send - try { - xhr = FDomainRequest() || - window.XDomainRequest && - new XDomainRequest() || - new XMLHttpRequest(); +!(function(global) { + "use strict"; + + var hasOwn = Object.prototype.hasOwnProperty; + var undefined; // More compressible than void 0. + var iteratorSymbol = + typeof Symbol === "function" && Symbol.iterator || "@@iterator"; + + var inModule = typeof module === "object"; + var runtime = global.regeneratorRuntime; + if (runtime) { + if (inModule) { + // If regeneratorRuntime is defined globally and we're in a module, + // make the exports object identical to regeneratorRuntime. + module.exports = runtime; + } + // Don't bother evaluating the rest of this file if the runtime was + // already defined globally. + return; + } - xhr.onerror = xhr.onabort = function(e){ done( - 1, e || (xhr && xhr.responseText) || { "error" : "Network Connection Error"} - ) }; - xhr.onload = xhr.onloadend = finished; - xhr.onreadystatechange = function() { - if (xhr && xhr.readyState == 4) { - switch(xhr.status) { - case 200: - break; - default: - try { - response = JSON['parse'](xhr.responseText); - done(1,response); - } - catch (r) { return done(1, {status : xhr.status, payload : null, message : xhr.responseText}); } - return; - } - } - } + // Define the runtime globally (as expected by generated code) as either + // module.exports (if we're in a module) or a new, empty object. + runtime = global.regeneratorRuntime = inModule ? module.exports : {}; - var url = build_url(setup.url,data); + function wrap(innerFn, outerFn, self, tryLocsList) { + // If outerFn provided, then outerFn.prototype instanceof Generator. + var generator = Object.create((outerFn || Generator).prototype); + var context = new Context(tryLocsList || []); - xhr.open( 'GET', url, async ); - if (async) xhr.timeout = xhrtme; - xhr.send(); + // The ._invoke method unifies the implementations of the .next, + // .throw, and .return methods. + generator._invoke = makeInvokeMethod(innerFn, self, context); + + return generator; + } + runtime.wrap = wrap; + + // Try/catch helper to minimize deoptimizations. Returns a completion + // record like context.tryEntries[i].completion. This interface could + // have been (and was previously) designed to take a closure to be + // invoked without arguments, but in all the cases we care about we + // already have an existing method we want to call, so there's no need + // to create a new function object. We can even get away with assuming + // the method takes exactly one argument, since that happens to be true + // in every case, so we don't have to touch the arguments object. The + // only additional allocation required is the completion record, which + // has a stable shape and so hopefully should be cheap to allocate. + function tryCatch(fn, obj, arg) { + try { + return { type: "normal", arg: fn.call(obj, arg) }; + } catch (err) { + return { type: "throw", arg: err }; } - catch(eee) { - done(0); - XORIGN = 0; - return xdr(setup); + } + + var GenStateSuspendedStart = "suspendedStart"; + var GenStateSuspendedYield = "suspendedYield"; + var GenStateExecuting = "executing"; + var GenStateCompleted = "completed"; + + // Returning this object from the innerFn has the same effect as + // breaking out of the dispatch switch statement. + var ContinueSentinel = {}; + + // Dummy constructor functions that we use as the .constructor and + // .constructor.prototype properties for functions that return Generator + // objects. For full spec compliance, you may wish to configure your + // minifier not to mangle the names of these two functions. + function Generator() {} + function GeneratorFunction() {} + function GeneratorFunctionPrototype() {} + + var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype; + GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype; + GeneratorFunctionPrototype.constructor = GeneratorFunction; + GeneratorFunction.displayName = "GeneratorFunction"; + + // Helper for defining the .next, .throw, and .return methods of the + // Iterator interface in terms of a single ._invoke method. + function defineIteratorMethods(prototype) { + ["next", "throw", "return"].forEach(function(method) { + prototype[method] = function(arg) { + return this._invoke(method, arg); + }; + }); + } + + runtime.isGeneratorFunction = function(genFun) { + var ctor = typeof genFun === "function" && genFun.constructor; + return ctor + ? ctor === GeneratorFunction || + // For the native GeneratorFunction constructor, the best we can + // do is to check its .name property. + (ctor.displayName || ctor.name) === "GeneratorFunction" + : false; + }; + + runtime.mark = function(genFun) { + if (Object.setPrototypeOf) { + Object.setPrototypeOf(genFun, GeneratorFunctionPrototype); + } else { + genFun.__proto__ = GeneratorFunctionPrototype; } + genFun.prototype = Object.create(Gp); + return genFun; + }; + + // Within the body of any async function, `await x` is transformed to + // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test + // `value instanceof AwaitArgument` to determine if the yielded value is + // meant to be awaited. Some may consider the name of this method too + // cutesy, but they are curmudgeons. + runtime.awrap = function(arg) { + return new AwaitArgument(arg); + }; + + function AwaitArgument(arg) { + this.arg = arg; + } - // Return 'done' - return done; -} + function AsyncIterator(generator) { + // This invoke function is written in a style that assumes some + // calling function (or Promise) will handle exceptions. + function invoke(method, arg) { + var result = generator[method](arg); + var value = result.value; + return value instanceof AwaitArgument + ? Promise.resolve(value.arg).then(invokeNext, invokeThrow) + : Promise.resolve(value).then(function(unwrapped) { + // When a yielded Promise is resolved, its final value becomes + // the .value of the Promise<{value,done}> result for the + // current iteration. If the Promise is rejected, however, the + // result for this iteration will be rejected with the same + // reason. Note that rejections of yielded Promises are not + // thrown back into the generator function, as is the case + // when an awaited Promise is rejected. This difference in + // behavior between yield and await is important, because it + // allows the consumer to decide what to do with the yielded + // rejection (swallow it and continue, manually .throw it back + // into the generator, abandon iteration, whatever). With + // await, by contrast, there is no opportunity to examine the + // rejection reason outside the generator function, so the + // only option is to throw it from the await expression, and + // let the generator function handle the exception. + result.value = unwrapped; + return result; + }); + } -// Test Connection State -function _is_online() { - if (!('onLine' in navigator)) return 1; - try { return navigator['onLine'] } - catch (e) { return true } -} + if (typeof process === "object" && process.domain) { + invoke = process.domain.bind(invoke); + } -/* =-====================================================================-= */ -/* =-====================================================================-= */ -/* =-========================= PUBNUB ===========================-= */ -/* =-====================================================================-= */ -/* =-====================================================================-= */ + var invokeNext = invoke.bind(generator, "next"); + var invokeThrow = invoke.bind(generator, "throw"); + var invokeReturn = invoke.bind(generator, "return"); + var previousPromise; -var PDIV = $('pubnub') || 0 -, CREATE_PUBNUB = function(setup) { + function enqueue(method, arg) { + function callInvokeWithMethodAndArg() { + return invoke(method, arg); + } - // Force JSONP if requested from user. - if (setup['jsonp']) XORIGN = 0; - else XORIGN = UA.indexOf('MSIE 6') == -1; + return previousPromise = + // If enqueue has been called before, then we want to wait until + // all previous Promises have been resolved before calling invoke, + // so that results are always delivered in the correct order. If + // enqueue has not been called before, then it is important to + // call invoke immediately, without waiting on a callback to fire, + // so that the async generator function has the opportunity to do + // any necessary setup in a predictable way. This predictability + // is why the Promise constructor synchronously invokes its + // executor callback, and why async functions synchronously + // execute code before the first await. Since we implement simple + // async functions in terms of async generators, it is especially + // important to get this right, even though it requires care. + previousPromise ? previousPromise.then( + callInvokeWithMethodAndArg, + // Avoid propagating failures to Promises returned by later + // invocations of the iterator. + callInvokeWithMethodAndArg + ) : new Promise(function (resolve) { + resolve(callInvokeWithMethodAndArg()); + }); + } - var SUBSCRIBE_KEY = setup['subscribe_key'] || '' - , KEEPALIVE = (+setup['keepalive'] || DEF_KEEPALIVE) * SECOND - , UUID = setup['uuid'] || db['get'](SUBSCRIBE_KEY+'uuid')||''; + // Define the unified helper method that is used to implement .next, + // .throw, and .return (see defineIteratorMethods). + this._invoke = enqueue; + } - var leave_on_unload = setup['leave_on_unload'] || 0; + defineIteratorMethods(AsyncIterator.prototype); - setup['xdr'] = xdr; - setup['db'] = db; - setup['error'] = setup['error'] || error; - setup['_is_online'] = _is_online; - setup['jsonp_cb'] = jsonp_cb; - setup['hmac_SHA256']= get_hmac_SHA256; - setup['crypto_obj'] = crypto_obj(); - setup['params'] = { 'pnsdk' : PNSDK } + // Note that simple async functions are implemented on top of + // AsyncIterator objects; they just return a Promise for the value of + // the final result produced by the iterator. + runtime.async = function(innerFn, outerFn, self, tryLocsList) { + var iter = new AsyncIterator( + wrap(innerFn, outerFn, self, tryLocsList) + ); - var SELF = function(setup) { - return CREATE_PUBNUB(setup); - }; + return runtime.isGeneratorFunction(outerFn) + ? iter // If outerFn is a generator, return the full iterator. + : iter.next().then(function(result) { + return result.done ? result.value : iter.next(); + }); + }; - var PN = PN_API(setup); + function makeInvokeMethod(innerFn, self, context) { + var state = GenStateSuspendedStart; - for (var prop in PN) { - if (PN.hasOwnProperty(prop)) { - SELF[prop] = PN[prop]; + return function invoke(method, arg) { + if (state === GenStateExecuting) { + throw new Error("Generator is already running"); + } + + if (state === GenStateCompleted) { + if (method === "throw") { + throw arg; } - } - SELF['css'] = css; - SELF['$'] = $; - SELF['create'] = create; - SELF['bind'] = bind; - SELF['head'] = head; - SELF['search'] = search; - SELF['attr'] = attr; - SELF['events'] = events; - SELF['init'] = SELF; - SELF['secure'] = SELF; - SELF['crypto_obj'] = crypto_obj(); // export to instance + // Be forgiving, per 25.3.3.3.3 of the spec: + // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume + return doneResult(); + } - // Add Leave Functions - bind( 'beforeunload', window, function() { - if (leave_on_unload) SELF['each-channel'](function(ch){ SELF['LEAVE']( ch.name, 0 ) }); - return true; - } ); + while (true) { + var delegate = context.delegate; + if (delegate) { + if (method === "return" || + (method === "throw" && delegate.iterator[method] === undefined)) { + // A return or throw (when the delegate iterator has no throw + // method) always terminates the yield* loop. + context.delegate = null; + + // If the delegate iterator has a return method, give it a + // chance to clean up. + var returnMethod = delegate.iterator["return"]; + if (returnMethod) { + var record = tryCatch(returnMethod, delegate.iterator, arg); + if (record.type === "throw") { + // If the return method threw an exception, let that + // exception prevail over the original return or throw. + method = "throw"; + arg = record.arg; + continue; + } + } - // Return without Testing - if (setup['notest']) return SELF; + if (method === "return") { + // Continue with the outer return, now that the delegate + // iterator has been terminated. + continue; + } + } - bind( 'offline', window, SELF['offline'] ); - bind( 'offline', document, SELF['offline'] ); + var record = tryCatch( + delegate.iterator[method], + delegate.iterator, + arg + ); - // Return PUBNUB Socket Object - return SELF; -}; -CREATE_PUBNUB['init'] = CREATE_PUBNUB; -CREATE_PUBNUB['secure'] = CREATE_PUBNUB; -CREATE_PUBNUB['crypto_obj'] = crypto_obj(); // export to constructor + if (record.type === "throw") { + context.delegate = null; -// Bind for PUBNUB Readiness to Subscribe -if (document.readyState === 'complete') { - timeout( ready, 0 ); -} -else { - bind( 'load', window, function(){ timeout( ready, 0 ) } ); -} + // Like returning generator.throw(uncaught), but without the + // overhead of an extra function call. + method = "throw"; + arg = record.arg; + continue; + } -var pdiv = PDIV || {}; + // Delegate generator ran and handled its own exceptions so + // regardless of what the method was, we continue as if it is + // "next" with an undefined arg. + method = "next"; + arg = undefined; -// CREATE A PUBNUB GLOBAL OBJECT -PUBNUB = CREATE_PUBNUB({ - 'notest' : 1, - 'publish_key' : attr( pdiv, 'pub-key' ), - 'subscribe_key' : attr( pdiv, 'sub-key' ), - 'ssl' : !document.location.href.indexOf('https') || - attr( pdiv, 'ssl' ) == 'on', - 'origin' : attr( pdiv, 'origin' ), - 'uuid' : attr( pdiv, 'uuid' ) -}); + var info = record.arg; + if (info.done) { + context[delegate.resultName] = info.value; + context.next = delegate.nextLoc; + } else { + state = GenStateSuspendedYield; + return info; + } -// jQuery Interface -window['jQuery'] && (window['jQuery']['PUBNUB'] = CREATE_PUBNUB); + context.delegate = null; + } + + if (method === "next") { + if (state === GenStateSuspendedYield) { + context.sent = arg; + } else { + context.sent = undefined; + } + + } else if (method === "throw") { + if (state === GenStateSuspendedStart) { + state = GenStateCompleted; + throw arg; + } + + if (context.dispatchException(arg)) { + // If the dispatched exception was caught by a catch block, + // then let that catch block handle the exception normally. + method = "next"; + arg = undefined; + } + + } else if (method === "return") { + context.abrupt("return", arg); + } + + state = GenStateExecuting; + + var record = tryCatch(innerFn, self, context); + if (record.type === "normal") { + // If an exception is thrown from innerFn, we leave state === + // GenStateExecuting and loop back for another invocation. + state = context.done + ? GenStateCompleted + : GenStateSuspendedYield; + + var info = { + value: record.arg, + done: context.done + }; + + if (record.arg === ContinueSentinel) { + if (context.delegate && method === "next") { + // Deliberately forget the last sent value so that we don't + // accidentally pass it on to the delegate. + arg = undefined; + } + } else { + return info; + } -// For Modern JS + Testling.js - http://testling.com/ -typeof(module) !== 'undefined' && (module['exports'] = PUBNUB) && ready(); + } else if (record.type === "throw") { + state = GenStateCompleted; + // Dispatch the exception by looping back around to the + // context.dispatchException(arg) call above. + method = "throw"; + arg = record.arg; + } + } + }; + } -var pubnubs = $('pubnubs') || 0; + // Define Generator.prototype.{next,throw,return} in terms of the + // unified ._invoke helper method. + defineIteratorMethods(Gp); -// LEAVE NOW IF NO PDIV. -if (!PDIV) return; + Gp[iteratorSymbol] = function() { + return this; + }; -// PUBNUB Flash Socket -css( PDIV, { 'position' : 'absolute', 'top' : -SECOND } ); + Gp.toString = function() { + return "[object Generator]"; + }; -if ('opera' in window || attr( PDIV, 'flash' )) PDIV['innerHTML'] = - ''; + function pushTryEntry(locs) { + var entry = { tryLoc: locs[0] }; -// Create Interface for Opera Flash -PUBNUB['rdx'] = function( id, data ) { - if (!data) return FDomainRequest[id]['onerror'](); - FDomainRequest[id]['responseText'] = unescape(data); - FDomainRequest[id]['onload'](); -}; + if (1 in locs) { + entry.catchLoc = locs[1]; + } -function FDomainRequest() { - if (!pubnubs || !pubnubs['get']) return 0; + if (2 in locs) { + entry.finallyLoc = locs[2]; + entry.afterLoc = locs[3]; + } - var fdomainrequest = { - 'id' : FDomainRequest['id']++, - 'send' : function() {}, - 'abort' : function() { fdomainrequest['id'] = {} }, - 'open' : function( method, url ) { - FDomainRequest[fdomainrequest['id']] = fdomainrequest; - pubnubs['get']( fdomainrequest['id'], url ); - } - }; + this.tryEntries.push(entry); + } - return fdomainrequest; -} -FDomainRequest['id'] = SECOND; + function resetTryEntry(entry) { + var record = entry.completion || {}; + record.type = "normal"; + delete record.arg; + entry.completion = record; + } -})(); -(function(){ + function Context(tryLocsList) { + // The root entry object (effectively a try statement without a catch + // or a finally block) gives us a place to store values thrown from + // locations where there is no enclosing try statement. + this.tryEntries = [{ tryLoc: "root" }]; + tryLocsList.forEach(pushTryEntry, this); + this.reset(true); + } -// --------------------------------------------------------------------------- -// WEBSOCKET INTERFACE -// --------------------------------------------------------------------------- -var WS = PUBNUB['ws'] = function( url, protocols ) { - if (!(this instanceof WS)) return new WS( url, protocols ); + runtime.keys = function(object) { + var keys = []; + for (var key in object) { + keys.push(key); + } + keys.reverse(); + + // Rather than returning an object with a next method, we keep + // things simple and return the next function itself. + return function next() { + while (keys.length) { + var key = keys.pop(); + if (key in object) { + next.value = key; + next.done = false; + return next; + } + } - var self = this - , url = self.url = url || '' - , protocol = self.protocol = protocols || 'Sec-WebSocket-Protocol' - , bits = url.split('/') - , setup = { - 'ssl' : bits[0] === 'wss:' - ,'origin' : bits[2] - ,'publish_key' : bits[3] - ,'subscribe_key' : bits[4] - ,'channel' : bits[5] + // To avoid creating an additional object, we just hang the .value + // and .done properties off the next function object itself. This + // also ensures that the minifier will not anonymize the function. + next.done = true; + return next; }; + }; - // READY STATES - self['CONNECTING'] = 0; // The connection is not yet open. - self['OPEN'] = 1; // The connection is open and ready to communicate. - self['CLOSING'] = 2; // The connection is in the process of closing. - self['CLOSED'] = 3; // The connection is closed or couldn't be opened. + function values(iterable) { + if (iterable) { + var iteratorMethod = iterable[iteratorSymbol]; + if (iteratorMethod) { + return iteratorMethod.call(iterable); + } - // CLOSE STATES - self['CLOSE_NORMAL'] = 1000; // Normal Intended Close; completed. - self['CLOSE_GOING_AWAY'] = 1001; // Closed Unexpecttedly. - self['CLOSE_PROTOCOL_ERROR'] = 1002; // Server: Not Supported. - self['CLOSE_UNSUPPORTED'] = 1003; // Server: Unsupported Protocol. - self['CLOSE_TOO_LARGE'] = 1004; // Server: Too Much Data. - self['CLOSE_NO_STATUS'] = 1005; // Server: No reason. - self['CLOSE_ABNORMAL'] = 1006; // Abnormal Disconnect. + if (typeof iterable.next === "function") { + return iterable; + } - // Events Default - self['onclose'] = self['onerror'] = - self['onmessage'] = self['onopen'] = - self['onsend'] = function(){}; + if (!isNaN(iterable.length)) { + var i = -1, next = function next() { + while (++i < iterable.length) { + if (hasOwn.call(iterable, i)) { + next.value = iterable[i]; + next.done = false; + return next; + } + } - // Attributes - self['binaryType'] = ''; - self['extensions'] = ''; - self['bufferedAmount'] = 0; - self['trasnmitting'] = false; - self['buffer'] = []; - self['readyState'] = self['CONNECTING']; + next.value = undefined; + next.done = true; - // Close if no setup. - if (!url) { - self['readyState'] = self['CLOSED']; - self['onclose']({ - 'code' : self['CLOSE_ABNORMAL'], - 'reason' : 'Missing URL', - 'wasClean' : true - }); - return self; + return next; + }; + + return next.next = next; + } } - // PubNub WebSocket Emulation - self.pubnub = PUBNUB['init'](setup); - self.pubnub.setup = setup; - self.setup = setup; + // Return an iterator with no values. + return { next: doneResult }; + } + runtime.values = values; - self.pubnub['subscribe']({ - 'restore' : false, - 'channel' : setup['channel'], - 'disconnect' : self['onerror'], - 'reconnect' : self['onopen'], - 'error' : function() { - self['onclose']({ - 'code' : self['CLOSE_ABNORMAL'], - 'reason' : 'Missing URL', - 'wasClean' : false - }); - }, - 'callback' : function(message) { - self['onmessage']({ 'data' : message }); - }, - 'connect' : function() { - self['readyState'] = self['OPEN']; - self['onopen'](); + function doneResult() { + return { value: undefined, done: true }; + } + + Context.prototype = { + constructor: Context, + + reset: function(skipTempReset) { + this.prev = 0; + this.next = 0; + this.sent = undefined; + this.done = false; + this.delegate = null; + + this.tryEntries.forEach(resetTryEntry); + + if (!skipTempReset) { + for (var name in this) { + // Not sure about the optimal order of these conditions: + if (name.charAt(0) === "t" && + hasOwn.call(this, name) && + !isNaN(+name.slice(1))) { + this[name] = undefined; + } } - }); -}; + } + }, -// --------------------------------------------------------------------------- -// WEBSOCKET SEND -// --------------------------------------------------------------------------- -WS.prototype.send = function(data) { - var self = this; - self.pubnub['publish']({ - 'channel' : self.pubnub.setup['channel'], - 'message' : data, - 'callback' : function(response) { - self['onsend']({ 'data' : response }); + stop: function() { + this.done = true; + + var rootEntry = this.tryEntries[0]; + var rootRecord = rootEntry.completion; + if (rootRecord.type === "throw") { + throw rootRecord.arg; + } + + return this.rval; + }, + + dispatchException: function(exception) { + if (this.done) { + throw exception; + } + + var context = this; + function handle(loc, caught) { + record.type = "throw"; + record.arg = exception; + context.next = loc; + return !!caught; + } + + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + var record = entry.completion; + + if (entry.tryLoc === "root") { + // Exception thrown outside of any try block that could handle + // it, so set the completion value of the entire function to + // throw the exception. + return handle("end"); } - }); -}; -// --------------------------------------------------------------------------- -// WEBSOCKET CLOSE -// --------------------------------------------------------------------------- -WS.prototype.close = function() { - var self = this; - self.pubnub['unsubscribe']({ 'channel' : self.pubnub.setup['channel'] }); - self['readyState'] = self['CLOSED']; - self['onclose']({}); -}; + if (entry.tryLoc <= this.prev) { + var hasCatch = hasOwn.call(entry, "catchLoc"); + var hasFinally = hasOwn.call(entry, "finallyLoc"); -})(); -/* -CryptoJS v3.1.2 -code.google.com/p/crypto-js -(c) 2009-2013 by Jeff Mott. All rights reserved. -code.google.com/p/crypto-js/wiki/License -*/ -var 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)}}, -r=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<< -32-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, -2),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)))}}, -u=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]= -c[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; -d[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); + } else if (hasCatch) { + if (this.prev < entry.catchLoc) { + return handle(entry.catchLoc, true); + } -// HMAC SHA256 -(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< -l;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+/="}})(); + } else { + throw new Error("try statement without catch or finally"); + } + } + } + }, -// BlockCipher -(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])}, -_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]), -f=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, -m,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, -E,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/ -4294967296);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); -(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= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.tryLoc <= this.prev && + hasOwn.call(entry, "finallyLoc") && + this.prev < entry.finallyLoc) { + var finallyEntry = entry; + break; + } + } -// Cipher -CryptoJS.lib.Cipher||function(u){var p=CryptoJS,d=p.lib,l=d.Base,s=d.WordArray,t=d.BufferedBlockAlgorithm,r=p.enc.Base64,w=p.algo.EvpKDF,v=d.Cipher=t.extend({cfg:l.extend(),createEncryptor:function(e,a){return this.create(this._ENC_XFORM_MODE,e,a)},createDecryptor:function(e,a){return this.create(this._DEC_XFORM_MODE,e,a)},init:function(e,a,b){this.cfg=this.cfg.extend(b);this._xformMode=e;this._key=a;this.reset()},reset:function(){t.reset.call(this);this._doReset()},process:function(e){this._append(e);return this._process()}, -finalize:function(e){e&&this._append(e);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(e){return{encrypt:function(b,k,d){return("string"==typeof k?c:a).encrypt(e,b,k,d)},decrypt:function(b,k,d){return("string"==typeof k?c:a).decrypt(e,b,k,d)}}}});d.StreamCipher=v.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var b=p.mode={},x=function(e,a,b){var c=this._iv;c?this._iv=u:c=this._prevBlock;for(var d=0;d>>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, -this,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, -1701076831]).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})}, -decrypt: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, -b.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)}})}(); + if (finallyEntry && + (type === "break" || + type === "continue") && + finallyEntry.tryLoc <= arg && + arg <= finallyEntry.finallyLoc) { + // Ignore the finally entry if control is not jumping to a + // location outside the try/catch block. + finallyEntry = null; + } -// AES -(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, -16,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>>> -8&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= -d[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)})(); + var record = finallyEntry ? finallyEntry.completion : {}; + record.type = type; + record.arg = arg; -// Mode ECB -CryptoJS.mode.ECB = (function () { - var ECB = CryptoJS.lib.BlockCipherMode.extend(); + if (finallyEntry) { + this.next = finallyEntry.finallyLoc; + } else { + this.complete(record); + } - ECB.Encryptor = ECB.extend({ - processBlock: function (words, offset) { - this._cipher.encryptBlock(words, offset); + return ContinueSentinel; + }, + + complete: function(record, afterLoc) { + if (record.type === "throw") { + throw record.arg; + } + + if (record.type === "break" || + record.type === "continue") { + this.next = record.arg; + } else if (record.type === "return") { + this.rval = record.arg; + this.next = "end"; + } else if (record.type === "normal" && afterLoc) { + this.next = afterLoc; + } + }, + + finish: function(finallyLoc) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.finallyLoc === finallyLoc) { + this.complete(entry.completion, entry.afterLoc); + resetTryEntry(entry); + return ContinueSentinel; } - }); + } + }, - ECB.Decryptor = ECB.extend({ - processBlock: function (words, offset) { - this._cipher.decryptBlock(words, offset); + "catch": function(tryLoc) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.tryLoc === tryLoc) { + var record = entry.completion; + if (record.type === "throw") { + var thrown = record.arg; + resetTryEntry(entry); + } + return thrown; } - }); + } - return ECB; -}());// Moved to hmac-sha-256.js + // The context.catch method must only be called with a location + // argument that corresponds to a known catch block. + throw new Error("illegal catch attempt"); + }, + + delegateYield: function(iterable, resultName, nextLoc) { + this.delegate = { + iterator: values(iterable), + resultName: resultName, + nextLoc: nextLoc + }; + + return ContinueSentinel; + } + }; +})( + // Among the various tricks for obtaining a reference to the global + // object, this seems to be the most reliable technique that does not + // use indirect eval (which violates Content Security Policy). + typeof global === "object" ? global : + typeof window === "object" ? window : + typeof self === "object" ? self : this +); + +/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) + +/***/ } +/******/ ]) +}); +; //# sourceMappingURL=ringcentral-bundle.js.map \ No newline at end of file diff --git a/build/ringcentral-bundle.js.map b/build/ringcentral-bundle.js.map index e000b7ca..4d0abcde 100644 --- a/build/ringcentral-bundle.js.map +++ b/build/ringcentral-bundle.js.map @@ -1 +1 @@ -{"version":3,"sources":["core/Cache.ts","core/Log.ts","core/Utils.ts","core/Observable.ts","core/PageVisibility.ts","mocks/Mock.ts","mocks/Registry.ts","externals/Externals.ts","http/ApiResponse.ts","http/Client.ts","platform/Queue.ts","platform/Platform.ts","subscription/Subscription.ts","pubnub/PubnubMock.ts","pubnub/PubnubFactory.ts","SDK.ts","http/ClientMock.ts","platform/Auth.ts","bower_components/es6-promise/promise.js","bower_components/fetch/fetch.js","bower_components/pubnub/web/pubnub.js"],"names":["RingCentral","RingCentral.sdk","RingCentral.sdk.core","RingCentral.sdk.core.Cache","RingCentral.sdk.core.Cache.constructor","RingCentral.sdk.core.Cache.setPrefix","RingCentral.sdk.core.Cache.setItem","RingCentral.sdk.core.Cache.removeItem","RingCentral.sdk.core.Cache.getItem","RingCentral.sdk.core.Cache.clean","RingCentral.sdk.core.Cache._prefixKey","RingCentral.sdk.core.Log","RingCentral.sdk.core.Log.constructor","RingCentral.sdk.core.Log.disableAll","RingCentral.sdk.core.Log.enableAll","RingCentral.sdk.core.Log.debug","RingCentral.sdk.core.Log.info","RingCentral.sdk.core.Log.warn","RingCentral.sdk.core.Log.error","RingCentral.sdk.core.Log.stack","RingCentral.sdk.core.Log._parseArguments","RingCentral.sdk.core.utils","RingCentral.sdk.core.utils.extend","RingCentral.sdk.core.utils.forEach","RingCentral.sdk.core.utils.queryStringify","RingCentral.sdk.core.utils.parseQueryString","RingCentral.sdk.core.utils.isEmail","RingCentral.sdk.core.utils.isPhoneNumber","RingCentral.sdk.core.utils.argumentsToArray","RingCentral.sdk.core.utils.isDate","RingCentral.sdk.core.utils.isFunction","RingCentral.sdk.core.utils.isArray","RingCentral.sdk.core.utils.isWindow","RingCentral.sdk.core.utils.isNan","RingCentral.sdk.core.utils.type","RingCentral.sdk.core.utils.isPlainObject","RingCentral.sdk.core.utils.getProperty","RingCentral.sdk.core.utils.poll","RingCentral.sdk.core.utils.stopPolling","RingCentral.sdk.core.utils.parseString","RingCentral.sdk.core.utils.parseNumber","RingCentral.sdk.core.utils.isNodeJS","RingCentral.sdk.core.utils.isBrowser","RingCentral.sdk.core.Observable","RingCentral.sdk.core.Observable.constructor","RingCentral.sdk.core.Observable.hasListeners","RingCentral.sdk.core.Observable.on","RingCentral.sdk.core.Observable.emit","RingCentral.sdk.core.Observable.off","RingCentral.sdk.core.Observable.destroy","RingCentral.sdk.core.PageVisibility","RingCentral.sdk.core.PageVisibility.constructor","RingCentral.sdk.core.PageVisibility.visible","RingCentral.sdk.mocks","RingCentral.sdk.mocks.Mock","RingCentral.sdk.mocks.Mock.constructor","RingCentral.sdk.mocks.Mock.path","RingCentral.sdk.mocks.Mock.method","RingCentral.sdk.mocks.Mock.test","RingCentral.sdk.mocks.Mock.getResponse","RingCentral.sdk.mocks.Mock.createResponse","RingCentral.sdk.mocks.Registry","RingCentral.sdk.mocks.Registry.constructor","RingCentral.sdk.mocks.Registry.add","RingCentral.sdk.mocks.Registry.clear","RingCentral.sdk.mocks.Registry.find","RingCentral.sdk.mocks.Registry.apiCall","RingCentral.sdk.mocks.Registry.authentication","RingCentral.sdk.mocks.Registry.logout","RingCentral.sdk.mocks.Registry.presenceLoad","RingCentral.sdk.mocks.Registry.subscribeGeneric","RingCentral.sdk.mocks.Registry.subscribeOnPresence","RingCentral.sdk.mocks.Registry.tokenRefresh","RingCentral.sdk.externals","RingCentral.sdk.externals.get","RingCentral.sdk.http","RingCentral.sdk.http.ApiResponse","RingCentral.sdk.http.ApiResponse.constructor","RingCentral.sdk.http.ApiResponse.response","RingCentral.sdk.http.ApiResponse.request","RingCentral.sdk.http.ApiResponse.ok","RingCentral.sdk.http.ApiResponse.text","RingCentral.sdk.http.ApiResponse.json","RingCentral.sdk.http.ApiResponse.error","RingCentral.sdk.http.ApiResponse.multipart","RingCentral.sdk.http.ApiResponse.multipartJson","RingCentral.sdk.http.ApiResponse._isContentType","RingCentral.sdk.http.ApiResponse._getContentType","RingCentral.sdk.http.ApiResponse._isMultipart","RingCentral.sdk.http.ApiResponse._isUrlEncoded","RingCentral.sdk.http.ApiResponse._isJson","RingCentral.sdk.http.ApiResponse.create","RingCentral.sdk.http.Client","RingCentral.sdk.http.Client.constructor","RingCentral.sdk.http.Client.sendRequest","RingCentral.sdk.http.Client._loadResponse","RingCentral.sdk.http.Client.makeError","RingCentral.sdk.http.Client.cloneResponse","RingCentral.sdk.http.Client.createResponse","RingCentral.sdk.http.Client.createRequest","RingCentral.sdk.platform","RingCentral.sdk.platform.Queue","RingCentral.sdk.platform.Queue.constructor","RingCentral.sdk.platform.Queue.isPaused","RingCentral.sdk.platform.Queue.pause","RingCentral.sdk.platform.Queue.resume","RingCentral.sdk.platform.Queue.poll","RingCentral.sdk.platform.Queue.releaseTimeout","RingCentral.sdk.platform.Queue.pollInterval","RingCentral.sdk.platform.Queue.setReleaseTimeout","RingCentral.sdk.platform.Queue.setPollInterval","RingCentral.sdk.platform.Platform","RingCentral.sdk.platform.Platform.constructor","RingCentral.sdk.platform.Platform.auth","RingCentral.sdk.platform.Platform.createUrl","RingCentral.sdk.platform.Platform.authUrl","RingCentral.sdk.platform.Platform.parseAuthRedirectUrl","RingCentral.sdk.platform.Platform.loggedIn","RingCentral.sdk.platform.Platform.login","RingCentral.sdk.platform.Platform.refresh","RingCentral.sdk.platform.Platform.logout","RingCentral.sdk.platform.Platform.inflateRequest","RingCentral.sdk.platform.Platform.sendRequest","RingCentral.sdk.platform.Platform.send","RingCentral.sdk.platform.Platform.get","RingCentral.sdk.platform.Platform.post","RingCentral.sdk.platform.Platform.put","RingCentral.sdk.platform.Platform.delete","RingCentral.sdk.platform.Platform._tokenRequest","RingCentral.sdk.platform.Platform._ensureAuthentication","RingCentral.sdk.platform.Platform._isAccessTokenValid","RingCentral.sdk.platform.Platform._refreshPolling","RingCentral.sdk.platform.Platform._apiKey","RingCentral.sdk.platform.Platform._authHeader","RingCentral.sdk.subscription","RingCentral.sdk.subscription.Subscription","RingCentral.sdk.subscription.Subscription.constructor","RingCentral.sdk.subscription.Subscription.alive","RingCentral.sdk.subscription.Subscription.setSubscription","RingCentral.sdk.subscription.Subscription.subscription","RingCentral.sdk.subscription.Subscription.register","RingCentral.sdk.subscription.Subscription.addEvents","RingCentral.sdk.subscription.Subscription.setEvents","RingCentral.sdk.subscription.Subscription.subscribe","RingCentral.sdk.subscription.Subscription.renew","RingCentral.sdk.subscription.Subscription.remove","RingCentral.sdk.subscription.Subscription.reset","RingCentral.sdk.subscription.Subscription.destroy","RingCentral.sdk.subscription.Subscription._getFullEventFilters","RingCentral.sdk.subscription.Subscription._setTimeout","RingCentral.sdk.subscription.Subscription._clearTimeout","RingCentral.sdk.subscription.Subscription._decrypt","RingCentral.sdk.subscription.Subscription._notify","RingCentral.sdk.subscription.Subscription._subscribeAtPubnub","RingCentral.sdk.pubnub","RingCentral.sdk.pubnub.PubnubMock","RingCentral.sdk.pubnub.PubnubMock.constructor","RingCentral.sdk.pubnub.PubnubMock.ready","RingCentral.sdk.pubnub.PubnubMock.subscribe","RingCentral.sdk.pubnub.PubnubMock.unsubscribe","RingCentral.sdk.pubnub.PubnubMock.receiveMessage","RingCentral.sdk.pubnub.PubnubMockFactory","RingCentral.sdk.pubnub.PubnubMockFactory.constructor","RingCentral.sdk.pubnub.PubnubMockFactory.init","RingCentral.sdk.pubnub.PubnubFactory","RingCentral.sdk.pubnub.PubnubFactory.constructor","RingCentral.sdk.pubnub.PubnubFactory.getPubnub","RingCentral.sdk.SDK","RingCentral.sdk.SDK.constructor","RingCentral.sdk.SDK.platform","RingCentral.sdk.SDK.cache","RingCentral.sdk.SDK.createSubscription","RingCentral.sdk.SDK.createPageVisibility","RingCentral.sdk.SDK.createObservable","RingCentral.sdk.SDK.log","RingCentral.sdk.SDK.utils","RingCentral.sdk.SDK.mockRegistry","RingCentral.sdk.http.ClientMock","RingCentral.sdk.http.ClientMock.constructor","RingCentral.sdk.http.ClientMock._loadResponse","RingCentral.sdk.platform.Auth","RingCentral.sdk.platform.Auth.constructor","RingCentral.sdk.platform.Auth.accessToken","RingCentral.sdk.platform.Auth.refreshToken","RingCentral.sdk.platform.Auth.tokenType","RingCentral.sdk.platform.Auth.data","RingCentral.sdk.platform.Auth.setData","RingCentral.sdk.platform.Auth.accessTokenValid","RingCentral.sdk.platform.Auth.refreshTokenValid","RingCentral.sdk.platform.Auth.cancelAccessToken","RingCentral.sdk.platform.Auth.forceAuthentication","RingCentral.sdk.platform.Auth.setRemember","RingCentral.sdk.platform.Auth.remember"],"mappings":"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QA,EAAEA,QAAQA,EAACA,CAACA,CAACA;gBAE9CA,CAACA;gBAEDX,uBAAQA,GAARA;oBAEIY,MAAMA,CAACA,CAACA,CAACA,IAAIA,CAACA,IAAIA,EAAEA,CAACA,QAAQA,CAACA;gBAElCA,CAACA;gBA9GMZ,sBAAiBA,GAAUA,EAAEA,GAAGA,IAAIA,CAACA,CAACA,WAAWA;gBACjDA,oBAAeA,GAAGA,QAAQA,CAACA;gBA+GtCA,WAACA;YAADA,CAlHAhF,AAkHCgF,IAAAhF;YAlHYA,aAAIA,OAkHhBA,CAAAA;QAeLA,CAACA,EAnIsBnG,CAiIlBmG,OAjI0BnG,GAARA,YAAQA,KAARA,YAAQA,QAmI9BA;IAADA,CAACA,EAnIkBD,GAAGA,GAAHA,eAAGA,KAAHA,eAAGA,QAmIrBA;AAADA,CAACA,EAnIM,WAAW,KAAX,WAAW,QAmIjB;;AC7ID;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;ACx8BA;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;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;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;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;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;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;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;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC7VA;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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","file":"ringcentral-bundle.js","sourcesContent":["module RingCentral.sdk.core {\n\n export class Cache {\n\n private _storage:Storage;\n private _prefix:string;\n\n constructor(storage:Storage|any, prefix?:string) {\n this.setPrefix(prefix);\n this._storage = storage;\n }\n\n setPrefix(prefix?:string) {\n this._prefix = prefix || 'rc-';\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 protected _prefixKey(key) {\n return this._prefix + key;\n }\n\n }\n\n}\n\n","module RingCentral.sdk.core {\n\n /**\n * TODO Fix public vars\n */\n export class Log {\n\n public _console:Console;\n public logDebug:boolean;\n public logInfo:boolean;\n public logWarnings:boolean;\n public logErrors:boolean;\n public addTimestamps:boolean;\n\n constructor(console?:Console) {\n\n if (!console) {\n console = { // safety\n log: () => {},\n warn: () => {},\n info: () => {},\n error: () => {}\n };\n }\n\n this._console = console;\n\n this.logDebug = false;\n this.logInfo = false;\n this.logWarnings = false;\n this.logErrors = false;\n\n this.addTimestamps = false;\n\n }\n\n disableAll() {\n this.logDebug = false;\n this.logInfo = false;\n this.logWarnings = false;\n this.logErrors = false;\n }\n\n enableAll() {\n this.logDebug = true;\n this.logInfo = true;\n this.logWarnings = true;\n this.logErrors = true;\n }\n\n debug(...args) {\n if (this.logDebug) this._console.log.apply(this._console, this._parseArguments(arguments));\n }\n\n info(...args) {\n if (this.logInfo) this._console.info.apply(this._console, this._parseArguments(arguments));\n }\n\n warn(...args) {\n if (this.logWarnings) this._console.warn.apply(this._console, this._parseArguments(arguments));\n }\n\n error(...args) {\n if (this.logErrors) this._console.error.apply(this._console, this._parseArguments(arguments));\n }\n\n stack() {\n var e = new Error();\n if (e.hasOwnProperty('stack')) {\n return e.stack.replace('Error\\n', 'Stack Trace\\n');\n }\n }\n\n protected _parseArguments(args) {\n args = utils.argumentsToArray(args);\n if (this.addTimestamps) args.unshift(new Date().toLocaleString(), '-');\n return args;\n }\n\n }\n\n export var log = new Log();\n\n}","module RingCentral.sdk.core.utils {\n\n var hasOwn = Object.prototype.hasOwnProperty,\n toString = Object.prototype.toString,\n rdigit = /\\d/,\n class2type = {};\n\n // Populate the class2type map\n 'Boolean Number String Function Array Date RegExp Object'.split(' ').forEach((name) => {\n class2type[\"[object \" + name + \"]\"] = name.toLowerCase();\n });\n\n /**\n * Ported from jQuery.fn.extend\n * Optional first parameter makes deep copy\n */\n export function extend(targetObject:any, sourceObject:any, ...args) {\n\n var options, name, src, copy, copyIsArray, clone,\n target = arguments[0] || {},\n i = 1,\n length = arguments.length,\n deep = false;\n\n // Handle a deep copy situation\n if (typeof target === \"boolean\") {\n deep = target;\n\n // skip the boolean and the target\n target = arguments[i] || {};\n i++;\n }\n\n // Handle case when target is a string or something (possible in deep copy)\n if (typeof target !== \"object\" && !isFunction(target)) {\n target = {};\n }\n\n for (; i < length; i++) {\n\n // Only deal with non-null/undefined values\n if ((options = arguments[i]) !== null) {\n\n // Extend the base object\n for (name in options) {\n\n src = target[name];\n copy = options[name];\n\n // Prevent never-ending loop\n if (target === copy) {\n continue;\n }\n\n // Recurse if we're merging plain objects or arrays\n if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {\n\n if (copyIsArray) {\n copyIsArray = false;\n clone = src && isArray(src) ? src : [];\n } else {\n clone = src && isPlainObject(src) ? src : {};\n }\n\n // Never move original objects, clone them\n target[name] = extend(deep, clone, copy);\n\n // Don't bring in undefined values\n } else if (copy !== undefined) {\n\n target[name] = copy;\n\n }\n }\n }\n }\n\n // Return the modified object\n return target;\n\n }\n\n export function forEach(object, cb) {\n\n for (var i in object) {\n\n if (!object.hasOwnProperty(i)) continue;\n\n var res = cb(object[i], i);\n\n if (res === false) break;\n\n }\n\n }\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 export function queryStringify(parameters) {\n\n var array = [];\n\n forEach(parameters, (v, i) => {\n\n if (isArray(v)) {\n v.forEach((vv) => {\n array.push(encodeURIComponent(i) + '=' + encodeURIComponent(vv));\n });\n } else {\n array.push(encodeURIComponent(i) + '=' + 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 */\n export function parseQueryString(queryString:string):any {\n\n var argsParsed = {},\n self = this;\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 && !self.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 * Returns true if the passed value is valid email address.\n * Checks multiple comma separated emails according to RFC 2822 if parameter `multiple` is `true`\n */\n export function isEmail(v:string, multiple:boolean):boolean {\n if (!!multiple) {\n //this Regexp is also suitable for multiple emails (comma separated)\n return /^(?:[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?[ ,;]*)+$/i.test(v);\n } else {\n return /^[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i.test(v);\n }\n\n }\n\n export function isPhoneNumber(v:string):boolean {\n return (/\\+?1[0-9]{3}[0-9a-z]{7}/im.test(v.toString().split(/[^0-9a-z\\+]/im).join('')));\n }\n\n /**\n * @param args\n * @returns {Array}\n */\n export function argumentsToArray(args:any) {\n return Array.prototype.slice.call(args || [], 0);\n }\n\n export function isDate(obj:any):boolean {\n return type(obj) === \"date\";\n }\n\n export function isFunction(obj:any):boolean {\n return type(obj) === \"function\";\n }\n\n export function isArray(obj:any):boolean {\n return Array.isArray ? Array.isArray(obj) : type(obj) === \"array\";\n }\n\n // A crude way of determining if an object is a window\n export function isWindow(obj:any):boolean {\n return obj && typeof obj === \"object\" && \"setInterval\" in obj;\n }\n\n export function isNan(obj:any):boolean {\n return obj === null || !rdigit.test(obj) || isNaN(obj);\n }\n\n export function type(obj:any):string {\n return obj === null\n ? String(obj)\n : class2type[toString.call(obj)] || \"object\";\n }\n\n export function isPlainObject(obj:any):boolean {\n\n // Must be an Object.\n // Because of IE, we also have to check the presence of the constructor property.\n // Make sure that DOM nodes and window objects don't pass through, as well\n if (!obj || type(obj) !== \"object\" || obj.nodeType || isWindow(obj)) {\n return false;\n }\n\n // Not own constructor property must be Object\n if (obj.constructor && !hasOwn.call(obj, \"constructor\") && !hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\")) {\n return false;\n }\n\n // Own properties are enumerated firstly, so to speed up,\n // if last one is own, then all properties are own.\n\n var key;\n for (key in obj) {}\n\n return key === undefined || hasOwn.call(obj, key);\n\n }\n\n export function getProperty(obj:any, property:string):any {\n\n return property\n .split(/[.[\\]]/)\n .reduce((res, part) => {\n if (!res) return undefined;\n return part ? res[part] : res;\n }, obj);\n\n }\n\n export function poll(fn, interval?:number, timeout?:any):any { //NodeJS.Timer|number\n\n stopPolling(timeout);\n\n interval = interval || 1000;\n\n var next = (delay?:number):any => {\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\n export function stopPolling(timeout) {\n if (timeout) clearTimeout(timeout);\n }\n\n export function parseString(s:any):string {\n return s ? s.toString() : '';\n }\n\n export function parseNumber(n:any):number {\n if (!n) return 0;\n n = parseFloat(n);\n return isNan(n) ? 0 : n;\n }\n\n export function isNodeJS():boolean {\n return (typeof process !== 'undefined');\n }\n\n export function isBrowser():boolean {\n return (typeof window !== 'undefined');\n }\n\n}","/// \n/// \n\nmodule RingCentral.sdk.core {\n\n /**\n * @see https://github.com/Microsoft/TypeScript/issues/275\n */\n export class Observable> {\n\n private _listeners:any;\n\n constructor() {\n if (!(this instanceof Observable)) throw new Error('Observable(): New operator was omitted');\n this.off();\n }\n\n hasListeners(event) {\n return (event in this._listeners);\n }\n\n on(events:any, callback:(...args)=>any):T {\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:string) => {\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:string, ...args):any {\n\n var result = null;\n\n if (!this.hasListeners(event)) return null;\n\n this._listeners[event].some((callback:()=>any) => {\n\n result = callback.apply(this, args);\n return (result === false);\n\n });\n\n return result;\n\n }\n\n off(event?:string, callback?):T {\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 destroy():T {\n this.off();\n log.debug('Observable.destroy(): Listeners were destroyed');\n return this;\n }\n\n }\n\n}\n\n\n","/// \n\nmodule RingCentral.sdk.core {\n\n export class PageVisibility extends Observable {\n\n public events = {\n change: 'change'\n };\n\n protected _visible:boolean;\n\n constructor() {\n\n super();\n\n var hidden = \"hidden\",\n onchange = (evt) => {\n\n evt = evt || window.event;\n\n var v = 'visible',\n h = 'hidden',\n evtMap = {\n focus: v, focusin: v, pageshow: v, blur: h, focusout: h, pagehide: h\n };\n\n this._visible = (evt.type in evtMap) ? evtMap[evt.type] == v : !document[hidden];\n\n this.emit(this.events.change, this._visible);\n\n };\n\n this._visible = true;\n\n if (typeof document == 'undefined' || typeof window == 'undefined') return;\n\n // Standards:\n\n if (hidden in document)\n document.addEventListener(\"visibilitychange\", onchange);\n else if ((hidden = \"mozHidden\") in document)\n document.addEventListener(\"mozvisibilitychange\", onchange);\n else if ((hidden = \"webkitHidden\") in document)\n document.addEventListener(\"webkitvisibilitychange\", onchange);\n else if ((hidden = \"msHidden\") in document)\n document.addEventListener(\"msvisibilitychange\", onchange);\n // IE 9 and lower:\n else if ('onfocusin' in document)\n (document).onfocusin = (document).onfocusout = onchange;\n // All others:\n else\n window.onpageshow = window.onpagehide = window.onfocus = window.onblur = onchange;\n\n }\n\n visible() {\n return this._visible;\n }\n\n }\n\n}","/// \n/// \n\nmodule RingCentral.sdk.mocks {\n\n export class Mock {\n\n protected _method:string;\n protected _path:string;\n protected _delay:number;\n protected _json:any;\n protected _status:number;\n protected _statusText:string;\n\n constructor(method:string, path:string, json?:any, status?:number, statusText?:string, delay?:number) {\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 getResponse(request:Request):Response|Promise {\n\n return new externals._Promise((resolve, reject) => {\n\n setTimeout(() => {\n\n resolve(this.createResponse(this._json));\n\n }, this._delay);\n\n });\n\n }\n\n createResponse(json?:any, init?:ResponseInit|any) {\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 = http.Client.createResponse(str, init);\n\n res.headers.set(http.ApiResponse.contentType, http.ApiResponse.jsonContentType);\n\n return res;\n\n }\n\n }\n\n}","/// \n\nmodule RingCentral.sdk.mocks {\n\n export class Registry {\n\n protected _mocks:Mock[];\n\n constructor() {\n this._mocks = [];\n }\n\n add(mock:Mock) {\n this._mocks.push(mock);\n return this;\n }\n\n clear() {\n this._mocks = [];\n return this;\n }\n\n find(request:Request):Mock {\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?:number, statusText?:string) {\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?:number) {\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?:string, detailed?:boolean) {\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?:boolean) {\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\nmodule RingCentral.sdk.externals {\n\n export var _Promise:typeof Promise;\n export var _fetch:Fetch;\n export var _Response:typeof Response;\n export var _Request:typeof Request;\n export var _Headers:typeof Headers;\n export var _PUBNUB:PUBNUB;\n\n export function get() {\n\n var root = Function('return this')();\n\n if (!_PUBNUB) _PUBNUB = root.PUBNUB;\n if (!_Promise) _Promise = root.Promise;\n if (!_fetch) _fetch = root.fetch;\n if (!_Headers) _Headers = root.Headers;\n if (!_Request) _Request = root.Request;\n if (!_Response) _Response = root.Response;\n\n return externals;\n\n }\n\n}\n\n","/// \n/// \n/// \n\nmodule RingCentral.sdk.http {\n\n /**\n * @TODO Bring back tests\n */\n export 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 protected _json:any;\n protected _text:string;\n protected _request:Request;\n protected _response:Response;\n protected _multipartTransactions:ApiResponse[];\n\n constructor(request?:Request, response?:Response, responseText?:string) {\n\n this._text = responseText;\n this._request = request;\n this._response = response;\n this._json = null;\n this._multipartTransactions = null;\n\n }\n\n response() {\n return this._response;\n }\n\n request() {\n return this._request;\n }\n\n ok() {\n return this._response && this._response.ok;\n }\n\n text() {\n return this._text;\n }\n\n json() {\n\n if (!this._isJson()) throw new Error('Response is not JSON');\n\n if (!this._json) {\n this._json = this._text ? JSON.parse(this._text) : null;\n }\n\n return this._json;\n\n }\n\n error(skipOKCheck?:boolean) {\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 var json = this.json();\n\n if (json.message) message = json.message;\n if (json.error_description) message = json.error_description;\n if (json.description) message = json.description;\n\n } catch (ex) {}\n\n return message;\n\n }\n\n multipart():ApiResponse[] {\n\n if (!this._isMultipart()) throw new Error('Response is not multipart');\n\n if (null === this._multipartTransactions) {\n\n // Step 1. Split multipart response\n\n if (!this._text) throw new Error('No response body');\n\n var boundary = this._response.headers.get('Content-Type').match(/boundary=([^;]+)/i)[1];\n\n if (!boundary) throw new Error('Cannot find boundary');\n\n var parts = this._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);\n\n // Step 3. Parse all other parts\n\n this._multipartTransactions = parts.map((part:string, i) => { //FIXME It will not work since parts contain both headers and body\n\n var status = statusInfo.json().response[i].status;\n\n return ApiResponse.create(part, status);\n\n });\n\n }\n\n return this._multipartTransactions;\n\n }\n\n /**\n * Short-hand method to get only JSON content of responses\n */\n multipartJson():any[] {\n\n return this.multipart().map((res)=> {\n return res.json();\n });\n\n }\n\n protected _isContentType(contentType:string):boolean {\n return this._getContentType().indexOf(contentType) > -1;\n }\n\n protected _getContentType():string {\n return this._response.headers.get(ApiResponse.contentType) || '';\n }\n\n protected _isMultipart():boolean {\n return this._isContentType(ApiResponse.multipartContentType);\n }\n\n protected _isUrlEncoded():boolean {\n return this._isContentType(ApiResponse.urlencodedContentType);\n }\n\n protected _isJson():boolean {\n return this._isContentType(ApiResponse.jsonContentType);\n }\n\n /**\n * Method is used to create Transaction objects from string parts of multipart/mixed response\n * @param text\n * @param status\n * @param statusText\n * @return {ApiResponse}\n */\n static create(text?:string, status?:number, statusText?:string):ApiResponse {\n\n status = status || 200;\n statusText = statusText || 'OK';\n\n text = text.replace(/\\r/g, '');\n\n var headers = new externals._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, Client.createResponse(text, {\n headers: headers,\n status: status,\n statusText: statusText\n }), text);\n\n }\n\n }\n\n}","/// \n/// \n/// \n/// \n/// \n/// \n\nmodule RingCentral.sdk.http {\n\n var allowedMethods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'];\n\n export class Client extends core.Observable {\n\n public events = {\n beforeRequest: 'beforeRequest', // parameters: ajax\n requestSuccess: 'requestSuccess', // means that response was successfully fetched from server\n requestError: 'requestError' // means that request failed completely\n };\n\n sendRequest(request:Request):Promise {\n\n var res = new ApiResponse(request); //FIXME Potential leak\n\n return new externals._Promise((resolve) => {\n\n //TODO Stop request if listeners return false\n this.emit(this.events.beforeRequest, res);\n\n resolve(this._loadResponse(request));\n\n })\n .then((response:Response) => {\n\n res['_response'] = Client.cloneResponse(response);\n\n return response.text();\n\n })\n .then((text:string) => {\n\n res['_text'] = text;\n\n if (!res.ok()) throw Client.makeError(new Error('Response has unsuccessful status'), res);\n\n this.emit(this.events.requestSuccess, res);\n\n return res;\n\n })\n .catch((e:IApiError):any=> {\n\n if (!e.apiResponse) {\n // we don't pass response since most likely it's parsing caused an error\n e = Client.makeError(e, res);\n }\n\n this.emit(this.events.requestError, e);\n\n throw e;\n\n });\n\n }\n\n protected _loadResponse(request:Request):Promise {\n return externals._fetch.call(null, request);\n }\n\n /**\n * Wraps the JS Error object with transaction information\n * @param {Error} e\n * @param {ApiResponse} apiResponse\n * @return {IApiError}\n */\n static makeError(e:Error, apiResponse?:ApiResponse) {\n\n var error = e;\n\n // Wrap only if regular error\n if (!error.hasOwnProperty('apiResponse') && !error.hasOwnProperty('originalMessage')) {\n\n error.apiResponse = apiResponse;\n error.originalMessage = error.message;\n error.message = (apiResponse && apiResponse.error(true)) || error.originalMessage;\n\n }\n\n return error;\n\n }\n\n /**\n * TODO Wait for\n * - https://github.com/github/fetch/issues/185\n * - https://github.com/bitinn/node-fetch/issues/34\n * @param {Response} response\n * @return {Response}\n */\n static cloneResponse(response:Response):Response {\n\n if (core.utils.isFunction(response.clone)) return response.clone();\n\n var body = '';\n\n if (response.hasOwnProperty('_bodyInit')) body = response['_bodyInit'];\n if (response.hasOwnProperty('_bodyText')) body = response['_bodyText'];\n if (response.hasOwnProperty('_bodyBlob')) body = response['_bodyBlob'].slice();\n if (response.hasOwnProperty('_bodyFormData')) body = response['_bodyFormData'];\n\n if (response.hasOwnProperty('_raw')) body = response['_raw'].join('');\n\n var clone = new externals._Response(body, response);\n\n if (response.hasOwnProperty('body')) clone['body'] = response['body']; // accessing non-standard properties\n\n return clone;\n\n }\n\n /**\n * Creates a response\n * @param stringBody\n * @param init\n * @return {Response}\n */\n static createResponse(stringBody?:string, init?:ResponseInit):Response {\n\n init = init || {};\n\n return new externals._Response(stringBody, init);\n\n }\n\n static createRequest(input:string|Request, init?:IClientRequestInit) {\n\n init = init || {};\n\n var body = init.body;\n\n // Assign request with empty body, Github's fetch throws errors if it cannot recognize the body type\n var req = new externals._Request(input, core.utils.extend({}, init, {body: null}));\n\n if (!req.url) throw new Error('Url is not defined');\n if (!req.method) req.method = 'GET';\n if (req.method && allowedMethods.indexOf(req.method) < 0) throw new Error('Method has wrong value: ' + req.method);\n\n if (!req.headers.has('Accept')) req.headers.set('Accept', 'application/json');\n\n // Serialize body\n if (core.utils.isPlainObject(init.body) || !init.body) {\n\n if (!req.headers.has('Content-Type')) req.headers.set('Content-Type', 'application/json');\n\n var contentType = req.headers.get('Content-Type');\n\n if (contentType.indexOf('application/json') > -1) {\n\n body = JSON.stringify(init.body);\n\n } else if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n\n body = core.utils.queryStringify(init.body);\n\n }\n\n }\n\n req.credentials = 'include';\n req.mode = 'cors';\n\n if (init.query) {\n req.url = req.url + (req.url.indexOf('?') > -1 ? '&' : '?') + core.utils.queryStringify(init.query);\n }\n\n // Create another request with encoded body\n req = new externals._Request(req.url, core.utils.extend(req, {body: body}));\n\n // Keep the original body accessible directly (for mocks)\n req.body = init.body;\n\n return req;\n\n }\n\n }\n\n export interface IApiError extends Error {\n stack?:string;\n originalMessage:string;\n apiResponse:ApiResponse;\n }\n\n export interface IClientRequestInit extends RequestInit {\n query?: string;\n }\n\n}","/// \n/// \n/// \n/// \n\nmodule RingCentral.sdk.platform {\n\n export class Queue {\n\n protected _cacheId:string;\n protected _pollInterval:number;\n protected _releaseTimeout:number;\n\n protected _cache:core.Cache;\n protected _promise:Promise;\n\n constructor(cache:core.Cache, cacheId:string) {\n\n this._cache = cache;\n this._cacheId = cacheId;\n\n this.setPollInterval(250);\n this.setReleaseTimeout(5000); // If queue was not released then force it to do so after some timeout\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) < this._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 externals._Promise((resolve, reject) => {\n\n core.utils.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 }, this._pollInterval);\n\n });\n\n return this._promise;\n\n }\n\n releaseTimeout() {\n return this._releaseTimeout;\n }\n\n pollInterval() {\n return this._pollInterval;\n }\n\n setReleaseTimeout(releaseTimeout:number) {\n this._releaseTimeout = releaseTimeout;\n return this;\n }\n\n setPollInterval(pollInterval:number) {\n this._pollInterval = pollInterval;\n return this;\n }\n\n }\n\n}","/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n\nmodule RingCentral.sdk.platform {\n\n export class Platform extends core.Observable {\n\n protected static _urlPrefix:string = '/restapi';\n protected static _apiVersion:string = 'v1.0';\n protected static _accessTokenTtl:number = null; // Platform server by default sets it to 60 * 60 = 1 hour\n protected static _refreshTokenTtl:number = 10 * 60 * 60; // 10 hours\n protected static _refreshTokenTtlRemember:number = 7 * 24 * 60 * 60; // 1 week\n protected static _tokenEndpoint:string = '/restapi/oauth/token';\n protected static _revokeEndpoint:string = '/restapi/oauth/revoke';\n protected static _authorizeEndpoint:string = '/restapi/oauth/authorize';\n\n protected _server:string;\n protected _appKey:string;\n protected _appSecret:string;\n\n protected _refreshDelayMs:number = 100;\n protected _clearCacheOnRefreshError:boolean = true;\n protected _cacheId:string = 'platform';\n\n protected _queue:Queue;\n protected _cache:core.Cache;\n protected _client:http.Client;\n protected _auth:Auth;\n\n public events = {\n accessViolation: 'accessViolation',\n logoutSuccess: 'logoutSuccess',\n logoutError: 'logoutError',\n authorizeSuccess: 'authorizeSuccess',\n authorizeError: 'authorizeError',\n refreshSuccess: 'refreshSuccess',\n refreshError: 'refreshError'\n };\n\n constructor(client:http.Client,\n cache:core.Cache,\n server:string,\n appKey:string,\n appSecret:string) {\n\n super();\n\n this._server = server;\n this._appKey = appKey;\n this._appSecret = appSecret;\n\n this._cache = cache;\n this._client = client;\n this._queue = new Queue(this._cache, this._cacheId + '-refresh');\n this._auth = new Auth(this._cache, this._cacheId);\n\n }\n\n auth():Auth {\n return this._auth;\n }\n\n createUrl(path, options?:{addMethod?: string; addToken?: boolean; addServer?: boolean}):string {\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 authUrl(options:{\n redirectUri:string;\n display?:string; // page|popup|touch|mobile, default 'page'\n prompt?:string; // sso|login|consent, default is 'login sso consent'\n state?:string;\n brandId?:string|number;\n }) {\n\n options = options || {};\n\n return this.createUrl(Platform._authorizeEndpoint + '?' + core.utils.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 parseAuthRedirectUrl(url:string) {\n\n var qs = core.utils.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 loggedIn():Promise {\n\n return this._ensureAuthentication()\n .then(()=> {\n return true;\n })\n .catch(()=> {\n return false;\n });\n\n }\n\n login(options?:{\n username?:string;\n password?: string;\n extension?:string;\n endpointId?:string;\n code?:string;\n redirectUri?:string;\n clientId?:string;\n remember?:boolean\n }):Promise {\n\n options = options || {};\n\n options.remember = options.remember || false;\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 return this._tokenRequest(Platform._tokenEndpoint, body).then((res:http.ApiResponse) => {\n\n this._auth\n .setData(res.json())\n .setRemember(options.remember);\n\n this.emit(this.events.authorizeSuccess, res);\n\n return res;\n\n }).catch((e:http.IApiError):any => {\n\n this._cache.clean();\n\n this.emit(this.events.authorizeError, e);\n\n throw e;\n\n });\n\n }\n\n refresh():Promise {\n\n var refresh = >new externals._Promise((resolve, reject) => {\n\n if (this._queue.isPaused()) {\n return resolve(this._refreshPolling());\n }\n\n this._queue.pause();\n\n // Make sure all existing AJAX calls had a chance to reach the server\n setTimeout(() => {\n\n core.log.debug('Platform.refresh(): Performing token refresh (access token', this._auth.accessToken(), ', refresh token', this._auth.refreshToken(), ')');\n\n // Perform sanity checks\n if (!this._auth.refreshToken()) return reject(new Error('Refresh token is missing'));\n if (!this._auth.refreshTokenValid()) return reject(new Error('Refresh token has expired'));\n if (!this._queue.isPaused()) return reject(new Error('Queue was resumed before refresh call'));\n\n resolve(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 }, this._refreshDelayMs);\n\n });\n\n return refresh.then((res:http.ApiResponse) => {\n\n // This means refresh has happened elsewhere and we are here because of timeout\n if (res && res.json && res.json()) {\n\n var json = res.json();\n\n core.log.info('Platform.refresh(): Token was refreshed', res);\n\n if (!json.refresh_token || !json.access_token) {\n throw http.Client.makeError(new Error('Malformed OAuth response'), res);\n }\n\n this._auth.setData(json);\n this._queue.resume();\n\n }\n\n this.emit(this.events.refreshSuccess, res);\n\n return res;\n\n }).catch((e:http.IApiError):any => {\n\n e = http.Client.makeError(e);\n\n if (this._clearCacheOnRefreshError) {\n this._cache.clean();\n }\n\n this.emit(this.events.accessViolation, e);\n this.emit(this.events.refreshError, e);\n\n throw e;\n\n });\n\n }\n\n /**\n * @returns {Promise}\n */\n logout():Promise {\n\n this._queue.pause();\n\n return this._tokenRequest(Platform._revokeEndpoint, {\n token: this._auth.accessToken()\n }).then((res) => {\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:http.IApiError):any => {\n\n this._queue.resume();\n\n this.emit(this.events.accessViolation, e);\n this.emit(this.events.logoutError, e);\n\n throw e;\n\n });\n\n }\n\n inflateRequest(request:Request, options?:IPlatformOptions):Promise {\n\n options = options || {};\n\n if (options.skipAuthCheck) return externals._Promise.resolve(request);\n\n return this\n ._ensureAuthentication()\n .then(() => {\n\n request.headers.set('Authorization', this._authHeader());\n request.url = this.createUrl(request.url, {addServer: true});\n\n //TODO Add User-Agent here\n\n return request;\n\n });\n\n }\n\n sendRequest(request:Request, options?:IPlatformOptions):Promise {\n\n return this\n .inflateRequest(request, options)\n .then((req) => {\n return this._client.sendRequest(req);\n })\n .catch((e:http.IApiError) => {\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 this.sendRequest(request, options);\n\n });\n\n }\n\n /**\n * General purpose function to send anything to server\n */\n send(url:string, options?:IPlatformCombinedOptions):Promise {\n\n try {\n\n //FIXME https://github.com/bitinn/node-fetch/issues/43\n url = this.createUrl(url, {addServer: true});\n\n return this.sendRequest(http.Client.createRequest(url, options), options);\n\n } catch (e) {\n return externals._Promise.reject(e);\n }\n\n }\n\n get(url:string, options?:IPlatformCombinedOptions) {\n options = options || {};\n options.method = 'GET';\n return this.send(url, options);\n }\n\n post(url:string, options:IPlatformCombinedOptions) {\n options = options || {};\n options.method = 'POST';\n return this.send(url, options);\n }\n\n put(url:string, options:IPlatformCombinedOptions) {\n options = options || {};\n options.method = 'PUT';\n return this.send(url, options);\n }\n\n 'delete'(url:string, options?:IPlatformCombinedOptions) {\n options = options || {};\n options.method = 'DELETE';\n return this.send(url, options);\n }\n\n protected _tokenRequest(path:string, body:any):Promise {\n\n return this.send(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 protected _ensureAuthentication() {\n\n if (this._isAccessTokenValid()) return externals._Promise.resolve(null);\n return this.refresh();\n\n }\n\n protected _isAccessTokenValid():boolean {\n\n return (this._auth.accessTokenValid() && !this._queue.isPaused());\n\n }\n\n protected _refreshPolling():Promise {\n\n core.log.warn('Platform.refresh(): Refresh is already in progress, polling started');\n\n return this._queue.poll().then(()=> {\n\n if (!this._isAccessTokenValid()) {\n throw new Error('Automatic authentification timeout');\n }\n\n return null;\n\n });\n\n }\n\n protected _apiKey() {\n var apiKey = this._appKey + ':' + this._appSecret;\n return (typeof btoa == 'function') ? btoa(apiKey) : new Buffer(apiKey).toString('base64');\n }\n\n protected _authHeader() {\n var token = this._auth.accessToken();\n return this._auth.tokenType() + (token ? ' ' + token : '');\n }\n\n }\n\n export interface IAuthError extends Error {\n error?:string;\n }\n\n export interface IPlatformOptions {\n skipAuthCheck?:boolean;\n }\n\n export interface IPlatformCombinedOptions extends IPlatformOptions, http.IClientRequestInit {}\n\n}","/// \n/// \n/// \n/// \n/// \n/// \n\nmodule RingCentral.sdk.subscription {\n\n\n export class Subscription extends core.Observable {\n\n protected _renewHandicapMs = 2 * 60 * 1000;\n\n protected _subscription:ISubscription|any;\n protected _timeout;\n protected _eventFilters:string[];\n protected _pubnub:PUBNUBInstance;\n\n protected _platform:platform.Platform;\n protected _pubnubFactory:pubnub.PubnubFactory;\n\n public 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:pubnub.PubnubFactory, platform:platform.Platform) {\n\n super();\n\n this._pubnubFactory = pubnubFactory;\n this._platform = platform;\n\n this._pubnub = null;\n this._eventFilters = [];\n this._timeout = null;\n this._subscription = null;\n\n }\n\n alive() {\n\n return this._subscription &&\n this._subscription.id &&\n this._subscription.deliveryMode &&\n this._subscription.deliveryMode.subscriberKey &&\n this._subscription.deliveryMode.address;\n\n }\n\n setSubscription(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():ISubscription {\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 register(options?:{events?:string[]}):Promise {\n\n if (this.alive()) {\n return this.renew(options);\n } else {\n return this.subscribe(options);\n }\n\n }\n\n addEvents(events:string[]) {\n this._eventFilters = this._eventFilters.concat(events);\n return this;\n }\n\n setEvents(events:string[]) {\n this._eventFilters = events;\n return this;\n }\n\n subscribe(options?:{events?:string[]}):Promise {\n\n options = options || {};\n\n if (options.events) this.setEvents(options.events);\n\n this._clearTimeout();\n\n return >new externals._Promise((resolve, reject) => {\n\n if (!this._eventFilters || !this._eventFilters.length) throw new Error('Events are undefined');\n\n resolve(this._platform.post('/restapi/v1.0/subscription', {\n body: {\n eventFilters: this._getFullEventFilters(),\n deliveryMode: {\n transportType: 'PubNub'\n }\n }\n }));\n\n }).then((ajax:http.ApiResponse) => {\n\n this.setSubscription(ajax.json())\n .emit(this.events.subscribeSuccess, ajax);\n\n return ajax;\n\n }).catch((e):any => {\n\n e = http.Client.makeError(e);\n\n this.reset()\n .emit(this.events.subscribeError, e);\n\n throw e;\n\n });\n\n }\n\n renew(options?:{events?:string[]}):Promise {\n\n options = options || {};\n\n if (options.events) this.setEvents(options.events);\n\n this._clearTimeout();\n\n return >new externals._Promise((resolve, reject) => {\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n if (!this._eventFilters || !this._eventFilters.length) throw new Error('Events are undefined');\n\n return this._platform.put('/restapi/v1.0/subscription/' + this._subscription.id, {\n body: {\n eventFilters: this._getFullEventFilters()\n }\n });\n\n })\n .then((ajax:http.ApiResponse) => {\n\n this.setSubscription(ajax.json())\n .emit(this.events.renewSuccess, ajax.json());\n\n return ajax;\n\n })\n .catch((e):any => {\n\n e = http.Client.makeError(e);\n\n this.reset()\n .emit(this.events.renewError, e);\n\n throw e;\n\n });\n\n }\n\n remove():Promise {\n\n return >new externals._Promise((resolve, reject) => {\n\n if (!this._subscription || !this._subscription.id) throw new Error('Subscription ID is required');\n\n resolve(this._platform.delete('/restapi/v1.0/subscription/' + this._subscription.id));\n\n }).then((ajax:http.ApiResponse) => {\n\n this.reset()\n .emit(this.events.removeSuccess, ajax);\n\n return ajax;\n\n }).catch((e):any => {\n\n e = http.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 = null;\n return this;\n }\n\n destroy():Subscription {\n\n this.reset();\n\n core.log.info('RC.subscription.Subscription: Destroyed');\n\n return super.destroy();\n\n }\n\n protected _getFullEventFilters() {\n\n return this._eventFilters.map((event) => {\n return this._platform.createUrl(event);\n });\n\n }\n\n protected _setTimeout() {\n\n this._clearTimeout();\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n var timeToExpiration = (this._subscription.expiresIn * 1000) - this._renewHandicapMs;\n\n this._timeout = setTimeout(() => {\n\n this.renew({});\n\n }, timeToExpiration);\n\n return this;\n\n }\n\n protected _clearTimeout() {\n\n clearTimeout(this._timeout);\n\n return this;\n\n }\n\n protected _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.getPubnub();\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 protected _notify(message:any) {\n\n this.emit(this.events.notification, this._decrypt(message));\n\n return this;\n\n }\n\n protected _subscribeAtPubnub():Subscription {\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n var PUBNUB = this._pubnubFactory.getPubnub();\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: (message, env, channel) => {\n\n core.log.info('RC.core.Subscription: Incoming message', message);\n this._notify(message);\n\n },\n connect: () => {\n core.log.info('RC.core.Subscription: PUBNUB connected');\n }\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/// \n\nmodule RingCentral.sdk.pubnub {\n\n export class PubnubMock extends core.Observable implements PUBNUBInstance {\n\n private options:PUBNUBInitOptions;\n crypto_obj:PUBNUBCryptoObj;\n\n constructor(options:PUBNUBInitOptions) {\n super();\n this.options = options;\n this.crypto_obj = externals._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 export class PubnubMockFactory implements PUBNUB {\n\n crypto_obj:PUBNUBCryptoObj;\n\n constructor() {\n this.crypto_obj = externals._PUBNUB.crypto_obj;\n }\n\n init(options:PUBNUBInitOptions) {\n return new PubnubMock(options);\n }\n\n }\n\n}","/// \n/// \n\nmodule RingCentral.sdk.pubnub {\n\n export class PubnubFactory {\n\n private _useMock:boolean = false;\n private _mock:PubnubMockFactory;\n\n constructor(flag:boolean) {\n this._useMock = !!flag;\n this._mock = new PubnubMockFactory();\n }\n\n getPubnub():PUBNUB {\n return this._useMock ? this._mock : externals._PUBNUB;\n }\n\n }\n\n}","/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n\nmodule RingCentral.sdk {\n\n export 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 private _platform:platform.Platform;\n private _cache:core.Cache;\n private _queue:platform.Queue;\n private _client:http.Client;\n private _pubnubFactory:pubnub.PubnubFactory;\n private _mockRegistry:mocks.Registry;\n\n constructor(options?:{\n server:string;\n appKey:string;\n appSecret:string;\n appName?:string;\n appVersion?:string;\n cachePrefix?:string;\n useHttpMock?:boolean;\n usePubnubMock?:boolean;\n }) {\n\n options = options || {};\n\n externals.get();\n\n this._mockRegistry = new mocks.Registry();\n\n this._cache = new core.Cache(typeof localStorage !== 'undefined' ? localStorage : {}, options.cachePrefix);\n\n this._client = options.useHttpMock ? new http.ClientMock(this._mockRegistry) : new http.Client();\n\n this._platform = new platform.Platform(this._client, this._cache, options.server, options.appKey, options.appSecret);\n\n this._pubnubFactory = new pubnub.PubnubFactory(options.usePubnubMock);\n\n //TODO Link Platform events with Subscriptions and the rest\n\n }\n\n platform():platform.Platform {\n return this._platform;\n }\n\n cache():core.Cache {\n return this._cache;\n }\n\n createSubscription():subscription.Subscription {\n return new subscription.Subscription(this._pubnubFactory, this._platform);\n }\n\n createPageVisibility() {\n return new core.PageVisibility();\n }\n\n createObservable() {\n return new core.Observable();\n }\n\n log() {\n return core.log;\n }\n\n utils() {\n return core.utils;\n }\n\n mockRegistry() { return this._mockRegistry; }\n\n }\n\n}\n\nvar e = RingCentral.sdk.externals.get();\n\nif (typeof define === 'function' && define.amd) {\n\n define(['pubnub'], function(PUBNUB) {\n e._PUBNUB = PUBNUB;\n return RingCentral.sdk;\n });\n\n} else if (typeof module === 'object' && module.exports) {\n\n e._PUBNUB = require('pubnub');\n e._Promise = typeof (Promise) !== 'undefined' ? Promise : require('es6-promise').Promise;\n e._fetch = require('node-fetch');\n e._Request = e._fetch['Request'];\n e._Response = e._fetch['Response'];\n e._Headers = e._fetch['Headers'];\n\n module.exports = RingCentral.sdk;\n\n} else {\n\n //TODO noConflict\n\n}\n","/// \n/// \n/// \n/// \n/// \n/// \n\nmodule RingCentral.sdk.http {\n\n export class ClientMock extends Client {\n\n private _registry:mocks.Registry;\n\n constructor(registry:mocks.Registry) {\n super();\n this._registry = registry;\n }\n\n protected _loadResponse(request:Request):Promise {\n\n return new externals._Promise((resolve) => {\n\n core.log.debug('API REQUEST', request.method, request.url);\n\n var mock = this._registry.find(request);\n\n resolve(mock.getResponse(request));\n\n });\n\n }\n\n }\n\n}","/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n\nmodule RingCentral.sdk.platform {\n\n export class Auth {\n\n static refreshHandicapMs:number = 60 * 1000; // 1 minute\n static forcedTokenType = 'forced';\n\n protected _cacheId:string;\n protected _cache:core.Cache;\n\n constructor(cache:core.Cache, cacheId:string) {\n\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 data():IAuthData {\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 setData(authData:IAuthData) {\n\n var oldAuthData = this.data();\n\n authData = core.utils.extend({}, oldAuthData, authData);\n\n authData.expire_time = Date.now() + (authData.expires_in * 1000);\n authData.refresh_token_expire_time = Date.now() + (authData.refresh_token_expires_in * 1000);\n\n core.log.info('Auth.setData(): Tokens were updated, new:', authData, ', old:', oldAuthData);\n\n this._cache.setItem(this._cacheId, authData);\n\n return this;\n\n }\n\n /**\n * Check if there is a valid (not expired) access token\n */\n accessTokenValid():boolean {\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 */\n refreshTokenValid():boolean {\n\n return (this.data().refresh_token_expire_time > Date.now());\n\n }\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 {Platform}\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 setRemember(remember?:boolean):Auth {\n\n return this.setData({remember: remember});\n\n }\n\n remember():boolean {\n\n return !!this.data().remember;\n\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 * @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","(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","// Version: 3.7.13\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.13'\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'] || 'demo'\n , SUBSCRIBE_KEY = setup['subscribe_key'] || 'demo'\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 , _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 , jsonp = jsonp_cb();\n\n // Prevent Leaving a Presence Channel\n if (channel.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 (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n blocking : blocking || SSL,\n timeout : 2000,\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(channel), 'leave'\n ]\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 , 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\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 },\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.13'\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/* =-====================================================================-= */\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['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"],"sourceRoot":"/source/"} \ No newline at end of file +{"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 diff --git a/build/ringcentral-bundle.min.js b/build/ringcentral-bundle.min.js index 4343049c..ad4d5c87 100644 --- a/build/ringcentral-bundle.min.js +++ b/build/ringcentral-bundle.min.js @@ -1,4 +1,5 @@ -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 de.encrypt(e,t||pe)||e}function u(e,t){return de.decrypt(e,t||pe)||de.decrypt(e,pe)||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 _e.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 p(){!te&&c()}function l(e){if(ne){if(!H.length)return}else{if(e&&(H.sending=0),H.sending||!H.length)return;H.sending=1}oe(H.shift())}function f(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 _(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 y(e,n,r,o){var n=e.callback||n,i=e.error||se,s=ue();o=o||{},o.auth||(o.auth=e.auth_key||B);var a=[U,"v1","channel-registration","sub-key",A];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){_(e,i)},url:a})}function g(){ae()||m(1,{error:"Offline. Please check your network settings. "}),E&&clearTimeout(E),E=timeout(g,SECOND)}function b(){T&&_e.time(function(e){w(function(){},e),e||m(1,{error:"Heartbeat failed to connect to Pubnub Servers.Please check your network settings."}),S&&clearTimeout(S),S=timeout(b,R)})}function m(e,t){K&&K(e,t),K=null,clearTimeout(E),clearTimeout(S)}function v(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)||_e.time(n)}var E,S,x=+e.windowing||DEF_WINDOWING,C=(+e.timeout||DEF_SUB_TIMEOUT)*SECOND,R=(+e.keepalive||DEF_KEEPALIVE)*SECOND,T=e.timecheck||0,O=e.noleave||0,P=e.publish_key||"demo",A=e.subscribe_key||"demo",B=e.auth_key||"",M=e.secret_key||"",D=e.hmac_SHA256,N=e.ssl?"s":"",j="http"+N+"://"+(e.origin||"pubsub.pubnub.com"),U=nextorigin(j),I=nextorigin(j),F=function(){},H=[],L=!0,q=0,z=0,J=0,K=0,V=e.restore||0,G=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(){}},pe=e.cipher_key,le=e.uuid||!e.unique_uuid&&ce&&ce.get(A+"uuid")||"",fe=e.instance_id||!1,he="";2===Z&&(ee=1);var de=e.crypto_obj||{encrypt:function(e,t){return e},decrypt:function(e,t){return e}},_e={LEAVE:function(e,n,r,o,i){var s={uuid:le,auth:r||B},a=nextorigin(j),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 O?!1:("0"!=c&&(s.callback=c),fe&&(s.instanceid=he),oe({blocking:n||N,timeout:2e3,callback:c,data:t(s),success:function(e){d(e,o,u)},fail:function(e){_(e,u)},url:[a,"v2","presence","sub_key",A,"channel",encode(e),"leave"]}),!0)},LEAVE_GROUP:function(e,n,r,o,i){var s={uuid:le,auth:r||B},a=nextorigin(j),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 O?!1:("0"!=c&&(s.callback=c),e&&e.length>0&&(s["channel-group"]=e),fe&&(s.instanceid=he),oe({blocking:n||N,timeout:5e3,callback:c,data:t(s),success:function(e){d(e,o,u)},fail:function(e){_(e,u)},url:[a,"v2","presence","sub_key",A,"channel",encode(","),"leave"]}),!0)},set_resumed:function(e){W=e},get_cipher_key:function(){return pe},set_cipher_key:function(e){pe=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),F(),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 p=o.split(":");p.length>1?(n="*"===p[0]?null:p[0],r=p[1]):r=p[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=L?"true":"false"):"remove"===c&&a.push("remove"),"undefined"!=typeof s&&(u.cloak=s?"true":"false"),y(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+":*"),_e.channel_group(e,t)},channel_group_list_channels:function(e,t){return e.channel_group?void _e.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 _e.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 _e.channel_group(e,t)):se("Missing Channel Group")},channel_group_add_channel:function(e,t){return e.channel_group?e.channel||e.channels?void _e.channel_group(e,t):se("Missing Channel"):se("Missing Channel Group")},channel_group_cloak:function(e,t){return"undefined"==typeof e.cloak?void t(L):(L=e.cloak,void _e.channel_group(e,t))},channel_group_list_namespaces:function(e,t){var n=["namespace"];y(e,t,n)},channel_group_remove_namespace:function(e,t){var n=["namespace",e.namespace,"remove"];y(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||B,a=e.cipher_key,c=e.channel,p=e.channel_group,l=e.start,f=e.end,h=e.include_token,d={},y=ue();return c||p?n?A?(d.stringtoken="true",d.count=r,d.reverse=o,d.auth=s,p&&(d["channel-group"]=p,c||(c=",")),y&&(d.callback=y),l&&(d.start=l),f&&(d.end=f),h&&(d.include_token="true"),void oe({callback:y,data:t(d),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),fe&&(s.instanceid=he),p(),K=oe({timeout:E,callback:e,fail:function(e){e&&e.error&&e.service?(_(e,d),r(1)):_e.time(function(t){!t&&_(e,d),r(t)})},data:t(s),url:[I,"subscribe",A,encode(n),e,G],success:function(e){if(!e||"object"==typeof e&&"error"in e&&e.error)return d(e.error),timeout(F,SECOND);if(y(e[1]),G=!G&&V&&ce.get(A)||e[1],h(function(e){e.connected||(e.connected=1,e.connect(e.name))}),f(function(e){e.connected||(e.connected=1,e.connect(e.name))}),W&&!V)return G=0,W=!1,ce.set(A,0),void timeout(o,S);k&&(G=1e4,k=0),ce.set(A,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||z,e.split(PRESENCE_SUFFIX)[0]];return t&&i.push(t.split(PRESENCE_SUFFIX)[0]),i}}(),n=v(+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,S)}})}}var i=e.channel,s=e.channel_group,n=n||e.callback,n=n||e.message,a=e.connect||function(){},c=e.reconnect||function(){},l=e.disconnect||function(){},d=e.error||d||function(){},y=e.idle||function(){},g=e.presence||0,b=e.noheresync||0,k=e.backfill||0,w=e.timetoken||0,E=e.timeout||C,S=e.windowing||x,R=e.state,T=e.heartbeat||e.pnexpires,O=e.heartbeat_interval,P=e.restore||V;return B=e.auth_key||B,V=P,G=w,i||s?n?A?((T||0===T||O||0===O)&&_e.set_heartbeat(T,O),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:z=n,cipher_key:e.cipher_key,connect:a,disconnect:l,reconnect:c},R&&(Q[r]=r in R?R[r]:R),g&&(_e.subscribe({channel:r+PRESENCE_SUFFIX,callback:g,restore:P}),o.subscribed||b||_e.here_now({channel:r,data:t({uuid:le,auth:B}),callback:function(e){each("uuids"in e?e.uuids:[],function(t){g({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:z=n,cipher_key:e.cipher_key,connect:a,disconnect:l,reconnect:c},g&&(_e.subscribe({channel_group:r+PRESENCE_SUFFIX,callback:g,restore:P,auth_key:B}),o.subscribed||b||_e.here_now({channel_group:r,data:t({uuid:le,auth:B}),callback:function(e){each("uuids"in e?e.uuids:[],function(t){g({action:"join",uuid:t,timestamp:Math.floor(rnow()/1e3),occupancy:e.occupancy||1},e,r)})}}))}),F=function(){m(),timeout(o,S)},READY?void F():READY_BUFFER.push(F)):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||B,i=e.channel,s=e.channel_group,a=ue(),u="uuids"in e?e.uuids:!0,c=e.state,p={uuid:le,auth:o};if(u||(p.disable_uuids=1),c&&(p.state=1),!n)return se("Missing Callback");if(!A)return se("Missing Subscribe Key");var l=[U,"v2","presence","sub_key",A];i&&l.push("channel")&&l.push(encode(i)),"0"!=a&&(p.callback=a),s&&(p["channel-group"]=s,!i&&l.push("channel")&&l.push(",")),fe&&(p.instanceid=he),oe({callback:a,data:t(p),success:function(e){d(e,n,r)},fail:function(e){_(e,r)},url:l})},where_now:function(e,n){var n=e.callback||n,r=e.error||function(){},o=e.auth_key||B,i=ue(),s=e.uuid||le,a={auth:o};return n?A?("0"!=i&&(a.callback=i),fe&&(a.instanceid=he),void oe({callback:i,data:t(a),success:function(e){d(e,n,r)},fail:function(e){_(e,r)},url:[U,"v2","presence","sub_key",A,"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||B,s=ue(),a=e.state,u=e.uuid||le,c=e.channel,p=e.channel_group,l=t({auth:i});return A?u?c||p?("0"!=s&&(l.callback=s),"undefined"!=typeof c&&X[c]&&X[c].subscribed&&a&&(Q[c]=a),"undefined"!=typeof p&&Y[p]&&Y[p].subscribed&&(a&&(Q[p]=a),l["channel-group"]=p,c||(c=",")),l.state=JSON.stringify(a),fe&&(l.instanceid=he),r=a?[U,"v2","presence","sub-key",A,"channel",c,"uuid",u,"data"]:[U,"v2","presence","sub-key",A,"channel",c,"uuid",encode(u)],void oe({callback:s,data:t(l),success:function(e){d(e,n,o)},fail:function(e){_(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",p=e.write?"1":"0",l=e.manage?"1":"0",f=e.auth_key||e.auth_keys;if(!n)return se("Missing Callback");if(!A)return se("Missing Subscribe Key");if(!P)return se("Missing Publish Key");if(!M)return se("Missing Secret Key");var h=Math.floor((new Date).getTime()/1e3),y=A+"\n"+P+"\ngrant\n",g={w:p,r:c,timestamp:h};e.manage&&(g.m=l),isArray(o)&&(o=o.join(",")),isArray(f)&&(f=f.join(",")),"undefined"!=typeof o&&null!=o&&o.length>0&&(g.channel=o),"undefined"!=typeof s&&null!=s&&s.length>0&&(g["channel-group"]=s),"0"!=a&&(g.callback=a),(u||0===u)&&(g.ttl=u),f&&(g.auth=f),g=t(g),f||delete g.auth,y+=i(g);var b=D(y,M);b=b.replace(/\+/g,"-"),b=b.replace(/\//g,"_"),g.signature=b,oe({callback:a,data:g,success:function(e){d(e,n,r)},fail:function(e){_(e,r)},url:[U,"v1","auth","grant","sub-key",A]})},mobile_gw_provision:function(e){var t,n,r=e.callback||function(){},o=e.auth_key||B,i=e.error||function(){},s=ue(),a=e.channel,u=e.op,c=e.gw_type,p=e.device_id;return p?c?u?a?P?A?(n=[U,"v1/push/sub-key",A,"devices",p],t={uuid:le,auth:o,type:c},"add"==u?t.add=a:"remove"==u&&(t.remove=a),fe&&(data.instanceid=he),void oe({callback:s,data:t,success:function(e){d(e,r,i)},fail:function(e){_(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(!A)return se("Missing Subscribe Key");if(!P)return se("Missing Publish Key");if(!M)return se("Missing Secret Key");var c=Math.floor((new Date).getTime()/1e3),p=A+"\n"+P+"\naudit\n",l={timestamp:c};"0"!=u&&(l.callback=u),"undefined"!=typeof o&&null!=o&&o.length>0&&(l.channel=o),"undefined"!=typeof s&&null!=s&&s.length>0&&(l["channel-group"]=s),a&&(l.auth=a),l=t(l),a||delete l.auth,p+=i(l);var f=D(p,M);f=f.replace(/\+/g,"-"),f=f.replace(/\//g,"_"),l.signature=f,oe({callback:u,data:l,success:function(e){d(e,n,r)},fail:function(e){_(e,r)},url:[U,"v1","auth","audit","sub-key",A]})},revoke:function(e,t){e.read=!1,e.write=!1,_e.grant(e,t)},set_uuid:function(e){le=e,F()},get_uuid:function(){return le},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:le,auth:B},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),fe&&(i.instanceid=he),oe({callback:o,data:t(i),timeout:5*SECOND,url:[U,"v2","presence","sub-key",A,"channel",a,"heartbeat"],success:function(e){d(e,n,r)},fail:function(e){_(e,r)}})},stop_timers:function(){clearTimeout(E),clearTimeout(S)},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 le||(le=_e.uuid()),he||(he=_e.uuid()),ce.set(A+"uuid",le),E=timeout(g,SECOND),S=timeout(b,R),$=timeout(p,(ee-3)*SECOND),w(),_e}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=p.encryptKey),e.hasOwnProperty("keyEncoding")||(e.keyEncoding=p.keyEncoding),e.hasOwnProperty("keyLength")||(e.keyLength=p.keyLength),e.hasOwnProperty("mode")||(e.mode=p.mode),-1==a.indexOf(e.keyEncoding.toLowerCase())&&(e.keyEncoding=p.keyEncoding),-1==u.indexOf(parseInt(e.keyLength,10))&&(e.keyLength=p.keyLength),-1==c.indexOf(e.mode.toLowerCase())&&(e.mode=p.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"],p={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),p=JSON.stringify(e),l=CryptoJS.AES.encrypt(p,c,{iv:a,mode:u}).ciphertext,f=l.toString(CryptoJS.enc.Base64);return f||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 p=CryptoJS.enc.Base64.parse(e),l=CryptoJS.AES.decrypt({ciphertext:p},c,{iv:a,mode:u}).toString(CryptoJS.enc.Utf8),f=JSON.parse(l);return f}catch(h){return void 0}}}}var RingCentral;!function(e){var t;!function(e){var t;!function(e){var t=function(){function e(e,t){this.setPrefix(t),this._storage=e}return e.prototype.setPrefix=function(e){return this._prefix=e||"rc-",this},e.prototype.setItem=function(e,t){return this._storage[this._prefixKey(e)]=JSON.stringify(t),this},e.prototype.removeItem=function(e){return delete this._storage[this._prefixKey(e)],this},e.prototype.getItem=function(e){var t=this._storage[this._prefixKey(e)];return t?JSON.parse(t):null},e.prototype.clean=function(){for(var e in this._storage)this._storage.hasOwnProperty(e)&&0===e.indexOf(this._prefix)&&delete this._storage[e];return this},e.prototype._prefixKey=function(e){return this._prefix+e},e}();e.Cache=t}(t=e.core||(e.core={}))}(t=e.sdk||(e.sdk={}))}(RingCentral||(RingCentral={}));var RingCentral;!function(e){var t;!function(e){var t;!function(e){var t=function(){function t(e){e||(e={log:function(){},warn:function(){},info:function(){},error:function(){}}),this._console=e,this.logDebug=!1,this.logInfo=!1,this.logWarnings=!1,this.logErrors=!1,this.addTimestamps=!1}return t.prototype.disableAll=function(){this.logDebug=!1,this.logInfo=!1,this.logWarnings=!1,this.logErrors=!1},t.prototype.enableAll=function(){this.logDebug=!0,this.logInfo=!0,this.logWarnings=!0,this.logErrors=!0},t.prototype.debug=function(){for(var e=[],t=0;t_;_++)if(null!==(i=arguments[_]))for(s in i)a=h[s],u=i[s],h!==u&&(g&&u&&(d(u)||(l=p(u)))?(l?(l=!1,f=a&&p(a)?a:[]):f=a&&d(a)?a:{},h[s]=t(g,f,u)):void 0!==u&&(h[s]=u));return h}function n(e,t){for(var n in e)if(e.hasOwnProperty(n)){var r=t(e[n],n);if(r===!1)break}}function r(e){var t=[];return n(e,function(e,n){p(e)?e.forEach(function(e){t.push(encodeURIComponent(n)+"="+encodeURIComponent(e))}):t.push(encodeURIComponent(n)+"="+encodeURIComponent(e))}),t.join("&")}function o(e){var t={},n=this;return e.split("&").forEach(function(e){if(e=decodeURIComponent(e),-1==e.indexOf("="))t[e.trim()]=!0;else{var r=e.split("="),o=r[0].trim(),i=r[1].trim();o in t?(o in t&&!n.isArray(t[o])&&(t[o]=[t[o]]),t[o].push(i)):t[o]=i}}),t}function i(e,t){return t?/^(?:[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?[ ,;]*)+$/i.test(e):/^[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i.test(e)}function s(e){return/\+?1[0-9]{3}[0-9a-z]{7}/im.test(e.toString().split(/[^0-9a-z\+]/im).join(""))}function a(e){return Array.prototype.slice.call(e||[],0)}function u(e){return"date"===h(e)}function c(e){return"function"===h(e)}function p(e){return Array.isArray?Array.isArray(e):"array"===h(e)}function l(e){return e&&"object"==typeof e&&"setInterval"in e}function f(e){return null===e||!S.test(e)||isNaN(e)}function h(e){return null===e?String(e):x[E.call(e)]||"object"}function d(e){if(!e||"object"!==h(e)||e.nodeType||l(e))return!1;if(e.constructor&&!w.call(e,"constructor")&&!w.call(e.constructor.prototype,"isPrototypeOf"))return!1;var t;for(t in e);return void 0===t||w.call(e,t)}function _(e,t){return t.split(/[.[\]]/).reduce(function(e,t){return e?t?e[t]:e:void 0},e)}function y(e,t,n){g(n),t=t||1e3;var r=function(n){return n=n||t,t=n,setTimeout(function(){e(r,n)},n)};return r()}function g(e){e&&clearTimeout(e)}function b(e){return e?e.toString():""}function m(e){return e?(e=parseFloat(e),f(e)?0:e):0}function v(){return"undefined"!=typeof process}function k(){return"undefined"!=typeof window}var w=Object.prototype.hasOwnProperty,E=Object.prototype.toString,S=/\d/,x={};"Boolean Number String Function Array Date RegExp Object".split(" ").forEach(function(e){x["[object "+e+"]"]=e.toLowerCase()}),e.extend=t,e.forEach=n,e.queryStringify=r,e.parseQueryString=o,e.isEmail=i,e.isPhoneNumber=s,e.argumentsToArray=a,e.isDate=u,e.isFunction=c,e.isArray=p,e.isWindow=l,e.isNan=f,e.type=h,e.isPlainObject=d,e.getProperty=_,e.poll=y,e.stopPolling=g,e.parseString=b,e.parseNumber=m,e.isNodeJS=v,e.isBrowser=k}(t=e.utils||(e.utils={}))}(t=e.core||(e.core={}))}(t=e.sdk||(e.sdk={}))}(RingCentral||(RingCentral={}));var RingCentral;!function(e){var t;!function(e){var t;!function(e){var t=function(){function t(){if(!(this instanceof t))throw new Error("Observable(): New operator was omitted");this.off()}return t.prototype.hasListeners=function(e){return e in this._listeners},t.prototype.on=function(e,t){var n=this;if("string"==typeof e&&(e=[e]),!e)throw new Error("No events to subscribe to");if("function"!=typeof t)throw new Error("Callback must be a function");return e.forEach(function(e){n.hasListeners(e)||(n._listeners[e]=[]),n._listeners[e].push(t)}),this},t.prototype.emit=function(e){for(var t=this,n=[],r=1;r-1&&e.method.toUpperCase()==this._method},t.prototype.getResponse=function(t){var n=this;return new e.externals._Promise(function(e,t){setTimeout(function(){e(n.createResponse(n._json))},n._delay)})},t.prototype.createResponse=function(t,n){n=n||{},n.status=n.status||this._status,n.statusText=n.statusText||this._statusText;var r=JSON.stringify(t),o=e.http.Client.createResponse(r,n);return o.headers.set(e.http.ApiResponse.contentType,e.http.ApiResponse.jsonContentType),o},t}();t.Mock=n}(t=e.mocks||(e.mocks={}))}(t=e.sdk||(e.sdk={}))}(RingCentral||(RingCentral={}));var RingCentral;!function(e){var t;!function(e){var t;!function(e){var t=function(){function t(){this._mocks=[]}return t.prototype.add=function(e){return this._mocks.push(e),this},t.prototype.clear=function(){return this._mocks=[],this},t.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},t.prototype.apiCall=function(t,n,r,o,i){return this.add(new e.Mock(t,n,r,o,i)),this},t.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},t.prototype.logout=function(){return this.apiCall("POST","/restapi/oauth/revoke",{}),this},t.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},t.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},t.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},t.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},t}();e.Registry=t}(t=e.mocks||(e.mocks={}))}(t=e.sdk||(e.sdk={}))}(RingCentral||(RingCentral={}));var RingCentral;!function(e){var t;!function(e){var t;!function(e){function t(){var t=Function("return this")();return e._PUBNUB||(e._PUBNUB=t.PUBNUB),e._Promise||(e._Promise=t.Promise),e._fetch||(e._fetch=t.fetch),e._Headers||(e._Headers=t.Headers),e._Request||(e._Request=t.Request),e._Response||(e._Response=t.Response),e}e._Promise,e._fetch,e._Response,e._Request,e._Headers,e._PUBNUB,e.get=t}(t=e.externals||(e.externals={}))}(t=e.sdk||(e.sdk={}))}(RingCentral||(RingCentral={}));var RingCentral;!function(e){var t;!function(e){var t;!function(t){var n=function(){function n(e,t,n){this._text=n,this._request=e,this._response=t,this._json=null,this._multipartTransactions=null}return n.prototype.response=function(){return this._response},n.prototype.request=function(){return this._request},n.prototype.ok=function(){return this._response&&this._response.ok},n.prototype.text=function(){return this._text},n.prototype.json=function(){if(!this._isJson())throw new Error("Response is not JSON");return this._json||(this._json=this._text?JSON.parse(this._text):null),this._json},n.prototype.error=function(e){if(this.ok()&&!e)return null;var t=(this._response&&this._response.status?this._response.status+" ":"")+(this._response&&this._response.statusText?this._response.statusText:"");try{var n=this.json();n.message&&(t=n.message),n.error_description&&(t=n.error_description),n.description&&(t=n.description)}catch(r){}return t},n.prototype.multipart=function(){if(!this._isMultipart())throw new Error("Response is not multipart");if(null===this._multipartTransactions){if(!this._text)throw new Error("No response body");var e=this._response.headers.get("Content-Type").match(/boundary=([^;]+)/i)[1];if(!e)throw new Error("Cannot find boundary");var t=this._text.toString().split(n.boundarySeparator+e);if(""===t[0].trim()&&t.shift(),t[t.length-1].trim()==n.boundarySeparator&&t.pop(),t.length<1)throw new Error("No parts in body");var r=n.create(t.shift(),this._response.status,this._response.statusText);this._multipartTransactions=t.map(function(e,t){var o=r.json().response[t].status;return n.create(e,o)})}return this._multipartTransactions},n.prototype.multipartJson=function(){return this.multipart().map(function(e){return e.json()})},n.prototype._isContentType=function(e){return this._getContentType().indexOf(e)>-1},n.prototype._getContentType=function(){return this._response.headers.get(n.contentType)||""},n.prototype._isMultipart=function(){return this._isContentType(n.multipartContentType)},n.prototype._isUrlEncoded=function(){return this._isContentType(n.urlencodedContentType)},n.prototype._isJson=function(){return this._isContentType(n.jsonContentType)},n.create=function(r,o,i){o=o||200,i=i||"OK",r=r.replace(/\r/g,"");var s=new e.externals._Headers,a=r.split(n.bodySeparator),u=a.length>1?a.shift():"";return r=a.join(n.bodySeparator),(u||"").split("\n").forEach(function(e){var t=e.trim().split(n.headerSeparator),r=t.shift().trim(),o=t.join(n.headerSeparator).trim();r&&s.append(r,o)}),new n(null,t.Client.createResponse(r,{headers:s,status:o,statusText:i}),r)},n.contentType="Content-Type",n.jsonContentType="application/json",n.multipartContentType="multipart/mixed",n.urlencodedContentType="application/x-www-form-urlencoded",n.headerSeparator=":",n.bodySeparator="\n\n",n.boundarySeparator="--",n}();t.ApiResponse=n}(t=e.http||(e.http={}))}(t=e.sdk||(e.sdk={}))}(RingCentral||(RingCentral={}));var RingCentral;!function(e){var t;!function(e){var t;!function(t){var n=["GET","POST","PUT","DELETE","PATCH","OPTIONS","HEAD"],r=function(r){function o(){r.apply(this,arguments),this.events={beforeRequest:"beforeRequest",requestSuccess:"requestSuccess",requestError:"requestError"}}return __extends(o,r),o.prototype.sendRequest=function(n){var r=this,i=new t.ApiResponse(n);return new e.externals._Promise(function(e){r.emit(r.events.beforeRequest,i),e(r._loadResponse(n))}).then(function(e){return i._response=o.cloneResponse(e),e.text()}).then(function(e){if(i._text=e,!i.ok())throw o.makeError(new Error("Response has unsuccessful status"),i);return r.emit(r.events.requestSuccess,i),i})["catch"](function(e){throw e.apiResponse||(e=o.makeError(e,i)),r.emit(r.events.requestError,e),e})},o.prototype._loadResponse=function(t){return e.externals._fetch.call(null,t)},o.makeError=function(e,t){var n=e;return n.hasOwnProperty("apiResponse")||n.hasOwnProperty("originalMessage")||(n.apiResponse=t,n.originalMessage=n.message,n.message=t&&t.error(!0)||n.originalMessage),n},o.cloneResponse=function(t){if(e.core.utils.isFunction(t.clone))return t.clone();var n="";t.hasOwnProperty("_bodyInit")&&(n=t._bodyInit),t.hasOwnProperty("_bodyText")&&(n=t._bodyText),t.hasOwnProperty("_bodyBlob")&&(n=t._bodyBlob.slice()),t.hasOwnProperty("_bodyFormData")&&(n=t._bodyFormData),t.hasOwnProperty("_raw")&&(n=t._raw.join(""));var r=new e.externals._Response(n,t);return t.hasOwnProperty("body")&&(r.body=t.body),r},o.createResponse=function(t,n){return n=n||{},new e.externals._Response(t,n)},o.createRequest=function(t,r){r=r||{};var o=r.body,i=new e.externals._Request(t,e.core.utils.extend({},r,{body:null}));if(!i.url)throw new Error("Url is not defined");if(i.method||(i.method="GET"),i.method&&n.indexOf(i.method)<0)throw new Error("Method has wrong value: "+i.method);if(i.headers.has("Accept")||i.headers.set("Accept","application/json"),e.core.utils.isPlainObject(r.body)||!r.body){i.headers.has("Content-Type")||i.headers.set("Content-Type","application/json");var s=i.headers.get("Content-Type");s.indexOf("application/json")>-1?o=JSON.stringify(r.body):s.indexOf("application/x-www-form-urlencoded")>-1&&(o=e.core.utils.queryStringify(r.body))}return i.credentials="include",i.mode="cors",r.query&&(i.url=i.url+(i.url.indexOf("?")>-1?"&":"?")+e.core.utils.queryStringify(r.query)),i=new e.externals._Request(i.url,e.core.utils.extend(i,{body:o})),i.body=r.body,i},o}(e.core.Observable);t.Client=r}(t=e.http||(e.http={}))}(t=e.sdk||(e.sdk={}))}(RingCentral||(RingCentral={}));var RingCentral;!function(e){var t;!function(e){var t;!function(t){var n=function(){function t(e,t){this._cache=e,this._cacheId=t,this.setPollInterval(250),this.setReleaseTimeout(5e3)}return t.prototype.isPaused=function(){var e=this._cache,t=this._cacheId,n=e.getItem(t);return!!n&&Date.now()-parseInt(n)-1?"&":"?"),t.addMethod&&(n+="_method="+t.addMethod),t.addToken&&(n+=(t.addMethod?"&":"")+"access_token="+this._auth.accessToken()),n},r.prototype.authUrl=function(t){return t=t||{},this.createUrl(r._authorizeEndpoint+"?"+e.core.utils.queryStringify({response_type:"code",redirect_uri:t.redirectUri||"",client_id:this._appKey,state:t.state||"",brand_id:t.brandId||"",display:t.display||"",prompt:t.prompt||""}),{addServer:!0})},r.prototype.parseAuthRedirectUrl=function(t){var n=e.core.utils.parseQueryString(t.split("?").reverse()[0]),r=n.error_description||n.error;if(r){var o=new Error(r);throw o.error=n.error,o}return n},r.prototype.loggedIn=function(){return this._ensureAuthentication().then(function(){return!0})["catch"](function(){return!1})},r.prototype.login=function(e){var t=this;e=e||{},e.remember=e.remember||!1;var n={access_token_ttl:r._accessTokenTtl,refresh_token_ttl:e.remember?r._refreshTokenTtlRemember:r._refreshTokenTtl};return 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),this._tokenRequest(r._tokenEndpoint,n).then(function(n){return t._auth.setData(n.json()).setRemember(e.remember),t.emit(t.events.authorizeSuccess,n),n})["catch"](function(e){throw t._cache.clean(),t.emit(t.events.authorizeError,e),e})},r.prototype.refresh=function(){var t=this,n=new e.externals._Promise(function(n,o){return t._queue.isPaused()?n(t._refreshPolling()):(t._queue.pause(),void setTimeout(function(){return e.core.log.debug("Platform.refresh(): Performing token refresh (access token",t._auth.accessToken(),", refresh token",t._auth.refreshToken(),")"),t._auth.refreshToken()?t._auth.refreshTokenValid()?t._queue.isPaused()?void n(t._tokenRequest(r._tokenEndpoint,{grant_type:"refresh_token",refresh_token:t._auth.refreshToken(),access_token_ttl:r._accessTokenTtl,refresh_token_ttl:t._auth.remember()?r._refreshTokenTtlRemember:r._refreshTokenTtl})):o(new Error("Queue was resumed before refresh call")):o(new Error("Refresh token has expired")):o(new Error("Refresh token is missing"))},t._refreshDelayMs))});return n.then(function(n){if(n&&n.json&&n.json()){var r=n.json();if(e.core.log.info("Platform.refresh(): Token was refreshed",n),!r.refresh_token||!r.access_token)throw e.http.Client.makeError(new Error("Malformed OAuth response"),n);t._auth.setData(r),t._queue.resume()}return t.emit(t.events.refreshSuccess,n),n})["catch"](function(n){throw n=e.http.Client.makeError(n),t._clearCacheOnRefreshError&&t._cache.clean(),t.emit(t.events.accessViolation,n),t.emit(t.events.refreshError,n),n})},r.prototype.logout=function(){var e=this;return this._queue.pause(),this._tokenRequest(r._revokeEndpoint,{token:this._auth.accessToken()}).then(function(t){return e._queue.resume(),e._cache.clean(),e.emit(e.events.logoutSuccess,t),t})["catch"](function(t){throw e._queue.resume(),e.emit(e.events.accessViolation,t),e.emit(e.events.logoutError,t),t})},r.prototype.inflateRequest=function(t,n){var r=this;return n=n||{},n.skipAuthCheck?e.externals._Promise.resolve(t):this._ensureAuthentication().then(function(){return t.headers.set("Authorization",r._authHeader()),t.url=r.createUrl(t.url,{addServer:!0}),t})},r.prototype.sendRequest=function(e,t){var n=this;return this.inflateRequest(e,t).then(function(e){return n._client.sendRequest(e)})["catch"](function(r){if(!r.apiResponse||!r.apiResponse.response()||401!=r.apiResponse.response().status)throw r;return n._auth.cancelAccessToken(),n.sendRequest(e,t)})},r.prototype.send=function(t,n){try{return t=this.createUrl(t,{addServer:!0}),this.sendRequest(e.http.Client.createRequest(t,n),n)}catch(r){return e.externals._Promise.reject(r)}},r.prototype.get=function(e,t){return t=t||{},t.method="GET",this.send(e,t)},r.prototype.post=function(e,t){return t=t||{},t.method="POST",this.send(e,t)},r.prototype.put=function(e,t){return t=t||{},t.method="PUT",this.send(e,t)},r.prototype["delete"]=function(e,t){return t=t||{},t.method="DELETE",this.send(e,t)},r.prototype._tokenRequest=function(e,t){return this.send(e,{skipAuthCheck:!0,body:t,method:"POST",headers:{Authorization:"Basic "+this._apiKey(),"Content-Type":"application/x-www-form-urlencoded"}})},r.prototype._ensureAuthentication=function(){return this._isAccessTokenValid()?e.externals._Promise.resolve(null):this.refresh()},r.prototype._isAccessTokenValid=function(){return this._auth.accessTokenValid()&&!this._queue.isPaused()},r.prototype._refreshPolling=function(){var t=this;return e.core.log.warn("Platform.refresh(): Refresh is already in progress, polling started"),this._queue.poll().then(function(){if(!t._isAccessTokenValid())throw new Error("Automatic authentification timeout");return null})},r.prototype._apiKey=function(){var e=this._appKey+":"+this._appSecret;return"function"==typeof btoa?btoa(e):new Buffer(e).toString("base64")},r.prototype._authHeader=function(){var e=this._auth.accessToken();return this._auth.tokenType()+(e?" "+e:"")},r._urlPrefix="/restapi",r._apiVersion="v1.0",r._accessTokenTtl=null,r._refreshTokenTtl=36e3,r._refreshTokenTtlRemember=604800,r._tokenEndpoint="/restapi/oauth/token",r._revokeEndpoint="/restapi/oauth/revoke",r._authorizeEndpoint="/restapi/oauth/authorize",r}(e.core.Observable);t.Platform=n}(t=e.platform||(e.platform={}))}(t=e.sdk||(e.sdk={}))}(RingCentral||(RingCentral={}));var RingCentral;!function(e){var t;!function(e){var t;!function(t){var n=function(t){function n(e,n){t.call(this),this._renewHandicapMs=12e4,this.events={notification:"notification",removeSuccess:"removeSuccess",removeError:"removeError",renewSuccess:"renewSuccess",renewError:"renewError",subscribeSuccess:"subscribeSuccess",subscribeError:"subscribeError"},this._pubnubFactory=e,this._platform=n,this._pubnub=null,this._eventFilters=[],this._timeout=null,this._subscription=null}return __extends(n,t),n.prototype.alive=function(){return this._subscription&&this._subscription.id&&this._subscription.deliveryMode&&this._subscription.deliveryMode.subscriberKey&&this._subscription.deliveryMode.address},n.prototype.setSubscription=function(e){return this._clearTimeout(),this._subscription=e,this._pubnub||this._subscribeAtPubnub(),this._setTimeout(),this},n.prototype.subscription=function(){return this._subscription},n.prototype.register=function(e){return this.alive()?this.renew(e):this.subscribe(e)},n.prototype.addEvents=function(e){return this._eventFilters=this._eventFilters.concat(e),this},n.prototype.setEvents=function(e){return this._eventFilters=e,this},n.prototype.subscribe=function(t){var n=this;return t=t||{},t.events&&this.setEvents(t.events),this._clearTimeout(),new e.externals._Promise(function(e,t){if(!n._eventFilters||!n._eventFilters.length)throw new Error("Events are undefined");e(n._platform.post("/restapi/v1.0/subscription",{body:{eventFilters:n._getFullEventFilters(),deliveryMode:{transportType:"PubNub"}}}))}).then(function(e){return n.setSubscription(e.json()).emit(n.events.subscribeSuccess,e),e})["catch"](function(t){throw t=e.http.Client.makeError(t),n.reset().emit(n.events.subscribeError,t),t})},n.prototype.renew=function(t){var n=this;return t=t||{},t.events&&this.setEvents(t.events),this._clearTimeout(),new e.externals._Promise(function(e,t){if(!n.alive())throw new Error("Subscription is not alive");if(!n._eventFilters||!n._eventFilters.length)throw new Error("Events are undefined");return n._platform.put("/restapi/v1.0/subscription/"+n._subscription.id,{body:{eventFilters:n._getFullEventFilters()}})}).then(function(e){return n.setSubscription(e.json()).emit(n.events.renewSuccess,e.json()),e})["catch"](function(t){throw t=e.http.Client.makeError(t),n.reset().emit(n.events.renewError,t),t})},n.prototype.remove=function(){var t=this;return new e.externals._Promise(function(e,n){if(!t._subscription||!t._subscription.id)throw new Error("Subscription ID is required");e(t._platform["delete"]("/restapi/v1.0/subscription/"+t._subscription.id))}).then(function(e){return t.reset().emit(t.events.removeSuccess,e),e})["catch"](function(n){throw n=e.http.Client.makeError(n),t.emit(t.events.removeError,n),n})},n.prototype.reset=function(){return this._clearTimeout(),this.alive()&&this._pubnub&&this._pubnub.unsubscribe({channel:this._subscription.deliveryMode.address}),this._subscription=null,this},n.prototype.destroy=function(){return this.reset(),e.core.log.info("RC.subscription.Subscription: Destroyed"),t.prototype.destroy.call(this)},n.prototype._getFullEventFilters=function(){var e=this;return this._eventFilters.map(function(t){return e._platform.createUrl(t)})},n.prototype._setTimeout=function(){var e=this;if(this._clearTimeout(),!this.alive())throw new Error("Subscription is not alive");var t=1e3*this._subscription.expiresIn-this._renewHandicapMs;return this._timeout=setTimeout(function(){e.renew({})},t),this},n.prototype._clearTimeout=function(){return clearTimeout(this._timeout),this},n.prototype._decrypt=function(e){if(!this.alive())throw new Error("Subscription is not alive");if(this._subscription.deliveryMode.encryptionKey){var t=this._pubnubFactory.getPubnub();e=t.crypto_obj.decrypt(e,this._subscription.deliveryMode.encryptionKey,{encryptKey:!1,keyEncoding:"base64",keyLength:128,mode:"ecb"})}return e},n.prototype._notify=function(e){return this.emit(this.events.notification,this._decrypt(e)),this},n.prototype._subscribeAtPubnub=function(){var t=this;if(!this.alive())throw new Error("Subscription is not alive");var n=this._pubnubFactory.getPubnub();return this._pubnub=n.init({ssl:!0,subscribe_key:this._subscription.deliveryMode.subscriberKey}),this._pubnub.ready(),this._pubnub.subscribe({channel:this._subscription.deliveryMode.address,message:function(n,r,o){e.core.log.info("RC.core.Subscription: Incoming message",n),t._notify(n)},connect:function(){e.core.log.info("RC.core.Subscription: PUBNUB connected")}}),this},n}(e.core.Observable);t.Subscription=n}(t=e.subscription||(e.subscription={}))}(t=e.sdk||(e.sdk={}))}(RingCentral||(RingCentral={}));var RingCentral;!function(e){var t;!function(e){var t;!function(t){var n=function(t){function n(n){t.call(this),this.options=n,this.crypto_obj=e.externals._PUBNUB.crypto_obj}return __extends(n,t),n.prototype.ready=function(){},n.prototype.subscribe=function(e){this.on("message-"+e.channel,e.message)},n.prototype.unsubscribe=function(e){this.off("message-"+e.channel)},n.prototype.receiveMessage=function(e,t){this.emit("message-"+t,e,"env",t)},n}(e.core.Observable);t.PubnubMock=n;var r=function(){function t(){this.crypto_obj=e.externals._PUBNUB.crypto_obj}return t.prototype.init=function(e){return new n(e)},t}();t.PubnubMockFactory=r}(t=e.pubnub||(e.pubnub={}))}(t=e.sdk||(e.sdk={}))}(RingCentral||(RingCentral={}));var RingCentral;!function(e){var t;!function(e){var t;!function(t){var n=function(){function n(e){this._useMock=!1,this._useMock=!!e,this._mock=new t.PubnubMockFactory}return n.prototype.getPubnub=function(){return this._useMock?this._mock:e.externals._PUBNUB},n}();t.PubnubFactory=n}(t=e.pubnub||(e.pubnub={}))}(t=e.sdk||(e.sdk={}))}(RingCentral||(RingCentral={}));var RingCentral;!function(e){var t;!function(e){var t=function(){function t(t){t=t||{},e.externals.get(),this._mockRegistry=new e.mocks.Registry,this._cache=new e.core.Cache("undefined"!=typeof localStorage?localStorage:{},t.cachePrefix),this._queue=new e.platform.Queue(this._cache,"platform-refresh"),this._client=t.useHttpMock?new e.http.ClientMock(this._mockRegistry):new e.http.Client,this._platform=new e.platform.Platform(this._client,this._cache,this._queue,t.server,t.appKey,t.appSecret),this._pubnubFactory=new e.pubnub.PubnubFactory(t.usePubnubMock)}return t.prototype.platform=function(){return this._platform},t.prototype.cache=function(){return this._cache},t.prototype.createSubscription=function(){return new e.subscription.Subscription(this._pubnubFactory,this._platform)},t.prototype.createPageVisibility=function(){return new e.core.PageVisibility},t.prototype.createObservable=function(){return new e.core.Observable},t.prototype.log=function(){return e.core.log},t.prototype.utils=function(){return e.core.utils},t.prototype.mockRegistry=function(){return this._mockRegistry},t.version="2.0.0",t.server={sandbox:"https://platform.devtest.ringcentral.com",production:"https://platform.ringcentral.com"},t}();e.SDK=t}(t=e.sdk||(e.sdk={}))}(RingCentral||(RingCentral={}));var e=RingCentral.sdk.externals.get();"function"==typeof define&&define.amd?define(["pubnub"],function(t){return e._PUBNUB=t,RingCentral.sdk}):"object"==typeof module&&module.exports&&(e._PUBNUB=require("pubnub"),e._Promise="undefined"!=typeof Promise?Promise:require("es6-promise").Promise,e._fetch=require("node-fetch"),e._Request=e._fetch.Request,e._Response=e._fetch.Response,e._Headers=e._fetch.Headers,module.exports=RingCentral.sdk);var RingCentral;!function(e){var t;!function(e){var t;!function(t){var n=function(t){function n(e){t.call(this),this._registry=e}return __extends(n,t),n.prototype._loadResponse=function(t){var n=this;return new e.externals._Promise(function(r){e.core.log.debug("API REQUEST",t.method,t.url);var o=n._registry.find(t);r(o.getResponse(t))})},n}(t.Client);t.ClientMock=n}(t=e.http||(e.http={}))}(t=e.sdk||(e.sdk={}))}(RingCentral||(RingCentral={}));var RingCentral;!function(e){var t;!function(e){var t;!function(t){var n=function(){function t(e,t){this._cache=e,this._cacheId=t}return t.prototype.accessToken=function(){return this.data().access_token},t.prototype.refreshToken=function(){return this.data().refresh_token},t.prototype.tokenType=function(){return this.data().token_type},t.prototype.data=function(){return this._cache.getItem(this._cacheId)||{token_type:"",access_token:"",expires_in:0,refresh_token:"",refresh_token_expires_in:0}},t.prototype.setData=function(t){var n=this.data();return t=e.core.utils.extend({},n,t),t.expire_time=Date.now()+1e3*t.expires_in,t.refresh_token_expire_time=Date.now()+1e3*t.refresh_token_expires_in,e.core.log.info("Auth.setData(): Tokens were updated, new:",t,", old:",n),this._cache.setItem(this._cacheId,t),this},t.prototype.accessTokenValid=function(){var e=this.data();return e.token_type===t.forcedTokenType||e.expire_time-t.refreshHandicapMs>Date.now()},t.prototype.refreshTokenValid=function(){return this.data().refresh_token_expire_time>Date.now()},t.prototype.cancelAccessToken=function(){return this.setData({access_token:"",expires_in:0})},t.prototype.forceAuthentication=function(){return this.setData({token_type:t.forcedTokenType,access_token:"",expires_in:0,refresh_token:"",refresh_token_expires_in:0}),this},t.prototype.setRemember=function(e){return this.setData({remember:e})},t.prototype.remember=function(){return!!this.data().remember},t.refreshHandicapMs=6e4,t.forcedTokenType="forced",t}();t.Auth=n}(t=e.platform||(e.platform={}))}(t=e.sdk||(e.sdk={}))}(RingCentral||(RingCentral={})),function(){"use strict";function e(e){return"function"==typeof e||"object"==typeof e&&null!==e}function t(e){return"function"==typeof e}function n(e){return"object"==typeof e&&null!==e}function r(e,t){Q[J]=e,Q[J+1]=t,J+=2,2===J&&(L?L(p):q())}function o(e){L=e}function i(){var e=process.nextTick,t=process.versions.node.match(/^(?:(\d+)\.)?(?:(\d+)\.)?(\*|\d+)$/);return Array.isArray(t)&&"0"===t[1]&&"10"===t[2]&&(e=setImmediate),function(){e(p)}}function s(){return function(){H(p)}}function a(){var e=0,t=new W(p),n=document.createTextNode("");return t.observe(n,{characterData:!0}),function(){n.data=e=++e%2}}function u(){var e=new MessageChannel;return e.port1.onmessage=p,function(){e.port2.postMessage(0)}}function c(){return function(){setTimeout(p,1)}}function p(){for(var e=0;J>e;e+=2){var t=Q[e],n=Q[e+1];t(n),Q[e]=void 0,Q[e+1]=void 0}J=0}function l(){try{var e=require,t=e("vertx");return H=t.runOnLoop||t.runOnContext,s()}catch(n){return c()}}function f(){}function h(){return new TypeError("You cannot resolve a promise with itself")}function d(){return new TypeError("A promises callback cannot return that same promise.")}function _(e){try{return e.then}catch(t){return te.error=t,te}}function y(e,t,n,r){try{e.call(t,n,r)}catch(o){return o}}function g(e,t,n){K(function(e){var r=!1,o=y(n,t,function(n){r||(r=!0,t!==n?v(e,n):w(e,n))},function(t){r||(r=!0,E(e,t))},"Settle: "+(e._label||" unknown promise"));!r&&o&&(r=!0,E(e,o))},e)}function b(e,t){t._state===Z?w(e,t._result):t._state===ee?E(e,t._result):S(t,void 0,function(t){v(e,t)},function(t){E(e,t)})}function m(e,n){if(n.constructor===e.constructor)b(e,n);else{var r=_(n);r===te?E(e,te.error):void 0===r?w(e,n):t(r)?g(e,n,r):w(e,n)}}function v(t,n){t===n?E(t,h()):e(n)?m(t,n):w(t,n)}function k(e){e._onerror&&e._onerror(e._result),x(e)}function w(e,t){e._state===$&&(e._result=t,e._state=Z,0!==e._subscribers.length&&K(x,e))}function E(e,t){e._state===$&&(e._state=ee,e._result=t,K(k,e))}function S(e,t,n,r){var o=e._subscribers,i=o.length;e._onerror=null,o[i]=t,o[i+Z]=n,o[i+ee]=r,0===i&&e._state&&K(x,e)}function x(e){var t=e._subscribers,n=e._state;if(0!==t.length){for(var r,o,i=e._result,s=0;ss;s++)S(r.resolve(e[s]),void 0,t,n);return o}function M(e){var t=this;if(e&&"object"==typeof e&&e.constructor===t)return e;var n=new t(f);return v(n,e),n}function D(e){var t=this,n=new t(f);return E(n,e),n}function N(){throw new TypeError("You must pass a resolver function as the first argument to the promise constructor")}function j(){throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.")}function U(e){this._id=ue++,this._state=void 0,this._result=void 0,this._subscribers=[],f!==e&&(t(e)||N(),this instanceof U||j(),O(this,e))}function I(){var e;if("undefined"!=typeof global)e=global;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=ce)}var F;F=Array.isArray?Array.isArray:function(e){return"[object Array]"===Object.prototype.toString.call(e)};var H,L,q,z=F,J=0,K=({}.toString,r),V="undefined"!=typeof window?window:void 0,G=V||{},W=G.MutationObserver||G.WebKitMutationObserver,X="undefined"!=typeof process&&"[object process]"==={}.toString.call(process),Y="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel,Q=new Array(1e3);q=X?i():W?a():Y?u():void 0===V&&"function"==typeof require?l():c();var $=void 0,Z=1,ee=2,te=new C,ne=new C;P.prototype._validateInput=function(e){return z(e)},P.prototype._validationError=function(){return new Error("Array Methods must be provided an Array")},P.prototype._init=function(){this._result=new Array(this.length)};var re=P;P.prototype._enumerate=function(){for(var e=this,t=e.length,n=e.promise,r=e._input,o=0;n._state===$&&t>o;o++)e._eachEntry(r[o],o)},P.prototype._eachEntry=function(e,t){var r=this,o=r._instanceConstructor;n(e)?e.constructor===o&&e._state!==$?(e._onerror=null,r._settledAt(e._state,t,e._result)):r._willSettleAt(o.resolve(e),t):(r._remaining--,r._result[t]=e)},P.prototype._settledAt=function(e,t,n){var r=this,o=r.promise;o._state===$&&(r._remaining--,e===ee?E(o,n):r._result[t]=n),0===r._remaining&&w(o,r._result)},P.prototype._willSettleAt=function(e,t){var n=this;S(e,void 0,function(e){n._settledAt(Z,t,e)},function(e){n._settledAt(ee,t,e)})};var oe=A,ie=B,se=M,ae=D,ue=0,ce=U;U.all=oe,U.race=ie,U.resolve=se,U.reject=ae,U._setScheduler=o,U._asap=K,U.prototype={constructor:U,then:function(e,t){var n=this,r=n._state;if(r===Z&&!e||r===ee&&!t)return this;var o=new this.constructor(f),i=n._result;if(r){var s=arguments[r-1];K(function(){T(r,o,s,i)})}else S(n,o,e,t);return o},"catch":function(e){return this.then(null,e)}};var pe=I,le={Promise:ce,polyfill:pe};"function"==typeof define&&define.amd?define(function(){return le}):"undefined"!=typeof module&&module.exports?module.exports=le:"undefined"!=typeof this&&(this.ES6Promise=le),pe()}.call(this),function(){"use strict";function e(e){if("string"!=typeof e&&(e=String(e)),/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(e))throw new TypeError("Invalid character in header field name");return e.toLowerCase()}function t(e){return"string"!=typeof e&&(e=String(e)),e}function n(e){this.map={},e instanceof n?e.forEach(function(e,t){this.append(t,e)},this):e&&Object.getOwnPropertyNames(e).forEach(function(t){this.append(t,e[t])},this)}function r(e){return e.bodyUsed?Promise.reject(new TypeError("Already read")):void(e.bodyUsed=!0)}function o(e){return new Promise(function(t,n){ -e.onload=function(){t(e.result)},e.onerror=function(){n(e.error)}})}function i(e){var t=new FileReader;return t.readAsArrayBuffer(e),o(t)}function s(e){var t=new FileReader;return t.readAsText(e),o(t)}function a(){return this.bodyUsed=!1,this._initBody=function(e){if(this._bodyInit=e,"string"==typeof e)this._bodyText=e;else if(h.blob&&Blob.prototype.isPrototypeOf(e))this._bodyBlob=e;else if(h.formData&&FormData.prototype.isPrototypeOf(e))this._bodyFormData=e;else{if(e)throw new Error("unsupported BodyInit type");this._bodyText=""}},h.blob?(this.blob=function(){var e=r(this);if(e)return e;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this.blob().then(i)},this.text=function(){var e=r(this);if(e)return e;if(this._bodyBlob)return s(this._bodyBlob);if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)}):this.text=function(){var e=r(this);return e?e:Promise.resolve(this._bodyText)},h.formData&&(this.formData=function(){return this.text().then(p)}),this.json=function(){return this.text().then(JSON.parse)},this}function u(e){var t=e.toUpperCase();return d.indexOf(t)>-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 p(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 l(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 f(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(f.prototype),self.Headers=n,self.Request=c,self.Response=f,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:l(o),url:r()},s="response"in o?o.response:o.responseText;e(new f(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}}(),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.13",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 b||h()?0:unique()}function p(e){if(b||h())return l(e);var n=u("script"),r=e.callback,o=unique(),a=0,c=e.timeout||DEF_TIMEOUT,p=timeout(function(){m(1,{message:"timeout"})},c),f=e.fail||function(){},d=e.data||{},y=e.success||function(){},g=function(){i().appendChild(n)},m=function(e,r){a||(a=1,n.onerror=null,clearTimeout(p),e||!r||y(r),timeout(function(){e&&f();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,d),s(n,"id",o),g(),m}function l(e){var t,n,r=function(){if(!i){i=1,clearTimeout(a);try{n=JSON.parse(t.responseText)}catch(e){return d(1)}o=1,l(n)}},o=0,i=0,s=e.timeout||DEF_TIMEOUT,a=timeout(function(){d(1,{message:"timeout"})},s),u=e.fail||function(){},c=e.data||{},l=e.success||function(){},f=!e.blocking,d=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=h()||window.XDomainRequest&&new XDomainRequest||new XMLHttpRequest,t.onerror=t.onabort=function(e){d(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),d(1,n)}catch(e){return d(1,{status:t.status,payload:null,message:t.responseText})}return}};var _=build_url(e.url,c);t.open("GET",_,f),f&&(t.timeout=s),t.send()}catch(y){return d(0),b=0,p(e)}return d}function f(){if(!("onLine"in navigator))return 1;try{return navigator.onLine}catch(e){return!0}}function h(){if(!S||!S.get)return 0;var e={id:h.id++,send:function(){},abort:function(){e.id={}},open:function(t,n){h[e.id]=e,S.get(e.id,n)}};return e}var d="https://pubnub.a.ssl.fastly.net/pubnub.swf",_="async",y=navigator.userAgent,g="PubNub-JS-Web/3.7.13",b=-1==y.indexOf("MSIE 6");window.console||(window.console=window.console||{}),console.log||(console.log=console.error=(window.opera||{}).postError||function(){});var m=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}}}}(),v={list:{},unbind:function(e){v.list[e]=[]},bind:function(e,t){(v.list[e]=v.list[e]||[]).push(t)},fire:function(e,t){each(v.list[e]||[],function(e){e(t)})}},k=t("pubnub")||0,w=function(l){b=l.jsonp?0:-1==y.indexOf("MSIE 6");var h=l.subscribe_key||"",d=((+l.keepalive||DEF_KEEPALIVE)*SECOND,l.uuid||m.get(h+"uuid")||"",l.leave_on_unload||0);l.xdr=p,l.db=m,l.error=l.error||n,l._is_online=f,l.jsonp_cb=c,l.hmac_SHA256=e,l.crypto_obj=crypto_obj(),l.params={pnsdk:g};var _=function(e){return w(e)},k=PN_API(l);for(var E in k)k.hasOwnProperty(E)&&(_[E]=k[E]);return _.css=a,_.$=t,_.create=u,_.bind=o,_.head=i,_.search=r,_.attr=s,_.events=v,_.init=_,_.secure=_,_.crypto_obj=crypto_obj(),o("beforeunload",window,function(){return d&&_["each-channel"](function(e){_.LEAVE(e.name,0)}),!0}),l.notest?_:(o("offline",window,_.offline),o("offline",document,_.offline),_)};w.init=w,w.secure=w,w.crypto_obj=crypto_obj(),"complete"===document.readyState?timeout(ready,0):o("load",window,function(){timeout(ready,0)});var E=k||{};PUBNUB=w({notest:1,publish_key:s(E,"pub-key"),subscribe_key:s(E,"sub-key"),ssl:!document.location.href.indexOf("https")||"on"==s(E,"ssl"),origin:s(E,"origin"),uuid:s(E,"uuid")}),window.jQuery&&(window.jQuery.PUBNUB=w),"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?(h[e].responseText=unescape(t),void h[e].onload()):h[e].onerror()},h.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)}},p=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)))}},l=r.BufferedBlockAlgorithm=i.extend({reset:function(){this._data=new s.init,this._nDataBytes=0},_append:function(e){"string"==typeof e&&(e=p.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=l.extend({cfg:i.extend(),init:function(e){this.cfg=this.cfg.extend(e),this.reset()},reset:function(){l.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 f.HMAC.init(e,n).finalize(t)}}});var f=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 p;e:{p=u;for(var l=e.sqrt(p),f=2;l>=f;f++)if(!(p%f)){p=!1;break e}p=!0}p&&(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],p=n[6],l=n[7],f=0;64>f;f++){if(16>f)h[f]=0|e[t+f];else{var d=h[f-15],_=h[f-2];h[f]=((d<<25|d>>>7)^(d<<14|d>>>18)^d>>>3)+h[f-7]+((_<<15|_>>>17)^(_<<13|_>>>19)^_>>>10)+h[f-16]}d=l+((u<<26|u>>>6)^(u<<21|u>>>11)^(u<<7|u>>>25))+(u&c^~u&p)+s[f]+h[f],_=((r<<30|r>>>2)^(r<<19|r>>>13)^(r<<10|r>>>22))+(r&o^r&i^o&i),l=p,p=c,c=u,u=a+d|0,a=i,i=o,o=r,r=d+_|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]+p|0,n[7]=n[7]+l|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=[],p=0;64>p;p++)c[p]=4294967296*e.abs(e.sin(p+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],p=e[i+2],l=e[i+3],f=e[i+4],h=e[i+5],d=e[i+6],_=e[i+7],y=e[i+8],g=e[i+9],b=e[i+10],m=e[i+11],v=e[i+12],k=e[i+13],w=e[i+14],E=e[i+15],S=s[0],x=s[1],C=s[2],R=s[3],S=t(S,x,C,R,a,7,c[0]),R=t(R,S,x,C,u,12,c[1]),C=t(C,R,S,x,p,17,c[2]),x=t(x,C,R,S,l,22,c[3]),S=t(S,x,C,R,f,7,c[4]),R=t(R,S,x,C,h,12,c[5]),C=t(C,R,S,x,d,17,c[6]),x=t(x,C,R,S,_,22,c[7]),S=t(S,x,C,R,y,7,c[8]),R=t(R,S,x,C,g,12,c[9]),C=t(C,R,S,x,b,17,c[10]),x=t(x,C,R,S,m,22,c[11]),S=t(S,x,C,R,v,7,c[12]),R=t(R,S,x,C,k,12,c[13]),C=t(C,R,S,x,w,17,c[14]),x=t(x,C,R,S,E,22,c[15]),S=n(S,x,C,R,u,5,c[16]),R=n(R,S,x,C,d,9,c[17]),C=n(C,R,S,x,m,14,c[18]),x=n(x,C,R,S,a,20,c[19]),S=n(S,x,C,R,h,5,c[20]),R=n(R,S,x,C,b,9,c[21]),C=n(C,R,S,x,E,14,c[22]),x=n(x,C,R,S,f,20,c[23]),S=n(S,x,C,R,g,5,c[24]),R=n(R,S,x,C,w,9,c[25]),C=n(C,R,S,x,l,14,c[26]),x=n(x,C,R,S,y,20,c[27]),S=n(S,x,C,R,k,5,c[28]),R=n(R,S,x,C,p,9,c[29]),C=n(C,R,S,x,_,14,c[30]),x=n(x,C,R,S,v,20,c[31]),S=r(S,x,C,R,h,4,c[32]),R=r(R,S,x,C,y,11,c[33]),C=r(C,R,S,x,m,16,c[34]),x=r(x,C,R,S,w,23,c[35]),S=r(S,x,C,R,u,4,c[36]),R=r(R,S,x,C,f,11,c[37]),C=r(C,R,S,x,_,16,c[38]),x=r(x,C,R,S,b,23,c[39]),S=r(S,x,C,R,k,4,c[40]),R=r(R,S,x,C,a,11,c[41]),C=r(C,R,S,x,l,16,c[42]),x=r(x,C,R,S,d,23,c[43]),S=r(S,x,C,R,g,4,c[44]),R=r(R,S,x,C,v,11,c[45]),C=r(C,R,S,x,E,16,c[46]),x=r(x,C,R,S,p,23,c[47]),S=o(S,x,C,R,a,6,c[48]),R=o(R,S,x,C,_,10,c[49]),C=o(C,R,S,x,w,15,c[50]),x=o(x,C,R,S,h,21,c[51]),S=o(S,x,C,R,v,6,c[52]),R=o(R,S,x,C,l,10,c[53]),C=o(C,R,S,x,b,15,c[54]),x=o(x,C,R,S,u,21,c[55]),S=o(S,x,C,R,y,6,c[56]),R=o(R,S,x,C,E,10,c[57]),C=o(C,R,S,x,d,15,c[58]),x=o(x,C,R,S,k,21,c[59]),S=o(S,x,C,R,f,6,c[60]),R=o(R,S,x,C,m,10,c[61]),C=o(C,R,S,x,p,15,c[62]),x=o(x,C,R,S,g,21,c[63]);s[0]=s[0]+S|0,s[1]=s[1]+x|0,s[2]=s[2]+C|0,s[3]=s[3]+R|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={},p=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]},l=(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();l.Encryptor=l.extend({processBlock:function(e,t){var n=this._cipher,r=n.blockSize;p.call(this,e,t,r),n.encryptBlock(e,t),this._prevBlock=e.slice(t,t+r)}}),l.Decryptor=l.extend({processBlock:function(e,t){var n=this._cipher,r=n.blockSize,o=e.slice(t,t+r);n.decryptBlock(e,t),p.call(this,e,t,r),this._prevBlock=o}}),c=c.CBC=l,l=(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:l}),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 f=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 f.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,f.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,f.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=[],p=[],l=[],f=[],h=[],d=0;256>d;d++)h[d]=128>d?d<<1:d<<1^283;for(var _=0,y=0,d=0;256>d;d++){var g=y^y<<1^y<<2^y<<3^y<<4,g=g>>>8^255&g^99;r[_]=g,o[g]=_;var b=h[_],m=h[b],v=h[m],k=257*h[g]^16843008*g;i[_]=k<<24|k>>>8,s[_]=k<<16|k>>>16,a[_]=k<<8|k>>>24,u[_]=k,k=16843009*v^65537*m^257*b^16843008*_,c[g]=k<<24|k>>>8,p[g]=k<<16|k>>>16,l[g]=k<<8|k>>>24,f[g]=k,_?(_=b^h[h[h[v^b]]],y^=h[h[y]]):_=y=1}var w=[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^=w[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]]^p[r[s>>>16&255]]^l[r[s>>>8&255]]^f[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,p,l,f,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],p=e[t+1]^n[1],l=e[t+2]^n[2],f=e[t+3]^n[3],h=4,d=1;u>d;d++)var _=r[c>>>24]^o[p>>>16&255]^i[l>>>8&255]^s[255&f]^n[h++],y=r[p>>>24]^o[l>>>16&255]^i[f>>>8&255]^s[255&c]^n[h++],g=r[l>>>24]^o[f>>>16&255]^i[c>>>8&255]^s[255&p]^n[h++],f=r[f>>>24]^o[c>>>16&255]^i[p>>>8&255]^s[255&l]^n[h++],c=_,p=y,l=g;_=(a[c>>>24]<<24|a[p>>>16&255]<<16|a[l>>>8&255]<<8|a[255&f])^n[h++],y=(a[p>>>24]<<24|a[l>>>16&255]<<16|a[f>>>8&255]<<8|a[255&c])^n[h++],g=(a[l>>>24]<<24|a[f>>>16&255]<<16|a[c>>>8&255]<<8|a[255&p])^n[h++],f=(a[f>>>24]<<24|a[c>>>16&255]<<16|a[p>>>8&255]<<8|a[255&l])^n[h++],e[t]=_,e[t+1]=y,e[t+2]=g,e[t+3]=f},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}(); -//# sourceMappingURL=ringcentral-bundle.min.js.map \ No newline at end of file +!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}())}])}); +//# sourceMappingURL=ringcentral-bundle.min.js.map diff --git a/build/ringcentral-bundle.min.js.map b/build/ringcentral-bundle.min.js.map index 8866f939..cd0c3ba6 100644 --- a/build/ringcentral-bundle.min.js.map +++ b/build/ringcentral-bundle.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["/source/bower_components/pubnub/web/pubnub.js","/source/core/Cache.ts","/source/core/Log.ts","ringcentral-bundle.js","/source/core/Utils.ts","/source/core/Observable.ts","/source/core/PageVisibility.ts","/source/mocks/Mock.ts","/source/mocks/Registry.ts","/source/externals/Externals.ts","/source/http/ApiResponse.ts","/source/http/Client.ts","/source/platform/Queue.ts","/source/platform/Platform.ts","/source/subscription/Subscription.ts","/source/pubnub/PubnubMock.ts","/source/pubnub/PubnubFactory.ts","/source/SDK.ts","/source/http/ClientMock.ts","/source/platform/Auth.ts","/source/bower_components/es6-promise/promise.js","/source/bower_components/fetch/fetch.js"],"names":["unique","NOW","Date","rnow","build_url","url_components","url_params","url","join","URLBIT","params","each","key","value","value_str","JSON","encode","length","push","PARAMSBIT","updater","fun","rate","timeout","last","runnit","clearTimeout","setTimeout","grep","list","fin","l","supplant","str","values","replace","REPL","_","match","wait","generate_uuid","callback","u","c","r","Math","random","v","toString","isArray","arg","Array","o","f","i","call","hasOwnProperty","map","k","pam_encode","encodeURIComponent","charCodeAt","toUpperCase","path","generate_channel_list","channels","nopresence","channel","status","search","subscribed","sort","generate_channel_group_list","channel_groups","channel_group","ready","READY","READY_BUFFER","connect","SECOND","PNmessage","args","msg","apns","m","Object","keys","aps","alert","badge","exclude1","data","exclude","getPubnubMessage","publish","message","error","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","input","crypto_obj","CIPHER_KEY","decrypt","_presence_heartbeat","PRESENCE_HB_TIMEOUT","PRESENCE_HB_INTERVAL","CHANNELS","CHANNEL_GROUPS","PRESENCE_HB_RUNNING","SELF","e","stringify","start_presence_heartbeat","next","NO_WAIT_FOR_PENDING","PUB_QUEUE","sending","xdr","shift","each_channel_group","count","chang","each_channel","chan","_invoke_callback","response","callback_data","_invoke_error","CR","url1","jsonp","jsonp_cb","AUTH_KEY","STD_ORIGIN","SUBSCRIBE_KEY","apply","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","get","set","UUID","USE_INSTANCEID","INSTANCEID","a","b","LEAVE","blocking","auth_key","uuid","auth","origin","indexOf","PRESENCE_SUFFIX","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","obj","getApnsMessageObject","x","newPnMessage","gcm","n","_add_param","val","namespace","ns_ch","cloak","mode","ns_ch_a","split","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","payload","messages","decrypted_messages","new_message","replay","source","destination","stop","limit","post","store","add_msg","unsubscribe","ch","CB_CALLED","action","chg","subscribe","_test_connection","windowing","disconnected","reconnect","name","disconnect","_connect","st","sub_timeout","SUB_ERROR","idlecb","connected","backfill","next_callback","channels2","list2","channel2","chobj","decrypted_msg","presence","noheresync","timetoken","state","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","type","audit","revoke","set_uuid","get_uuid","get_subscibed_channels","presence_heartbeat","stop_timers","each-channel","offline","now","SHA256","s","CryptoJS","parse_options","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","undefined","RingCentral","RingCentral.sdk","RingCentral.sdk.core","RingCentral.sdk.core.Cache","RingCentral.sdk.core.Cache.constructor","RingCentral.sdk.core.Cache.setPrefix","RingCentral.sdk.core.Cache.setItem","RingCentral.sdk.core.Cache.removeItem","RingCentral.sdk.core.Cache.getItem","RingCentral.sdk.core.Cache.clean","RingCentral.sdk.core.Cache._prefixKey","Log","RingCentral.sdk.core.Log","RingCentral.sdk.core.Log.constructor","RingCentral.sdk.core.Log.disableAll","RingCentral.sdk.core.Log.enableAll","RingCentral.sdk.core.Log.debug","RingCentral.sdk.core.Log.info","RingCentral.sdk.core.Log.warn","RingCentral.sdk.core.Log.error","RingCentral.sdk.core.Log.stack","RingCentral.sdk.core.Log._parseArguments","extend","RingCentral.sdk.core.utils","RingCentral.sdk.core.utils.extend","RingCentral.sdk.core.utils.forEach","queryStringify","RingCentral.sdk.core.utils.queryStringify","parseQueryString","RingCentral.sdk.core.utils.parseQueryString","isEmail","RingCentral.sdk.core.utils.isEmail","RingCentral.sdk.core.utils.isPhoneNumber","argumentsToArray","RingCentral.sdk.core.utils.argumentsToArray","RingCentral.sdk.core.utils.isDate","RingCentral.sdk.core.utils.isFunction","RingCentral.sdk.core.utils.isArray","isWindow","RingCentral.sdk.core.utils.isWindow","RingCentral.sdk.core.utils.isNan","RingCentral.sdk.core.utils.type","RingCentral.sdk.core.utils.isPlainObject","RingCentral.sdk.core.utils.getProperty","RingCentral.sdk.core.utils.poll","RingCentral.sdk.core.utils.stopPolling","RingCentral.sdk.core.utils.parseString","RingCentral.sdk.core.utils.parseNumber","RingCentral.sdk.core.utils.isNodeJS","RingCentral.sdk.core.utils.isBrowser","Observable","RingCentral.sdk.core.Observable","RingCentral.sdk.core.Observable.constructor","RingCentral.sdk.core.Observable.hasListeners","RingCentral.sdk.core.Observable.on","RingCentral.sdk.core.Observable.emit","RingCentral.sdk.core.Observable.off","RingCentral.sdk.core.Observable.destroy","__extends","this","d","__","constructor","p","prototype","RingCentral.sdk.core.PageVisibility","RingCentral.sdk.core.PageVisibility.constructor","RingCentral.sdk.core.PageVisibility.visible","RingCentral.sdk.mocks","RingCentral.sdk.mocks.Mock","RingCentral.sdk.mocks.Mock.constructor","RingCentral.sdk.mocks.Mock.path","RingCentral.sdk.mocks.Mock.method","RingCentral.sdk.mocks.Mock.test","RingCentral.sdk.mocks.Mock.getResponse","RingCentral.sdk.mocks.Mock.createResponse","RingCentral.sdk.mocks.Registry","RingCentral.sdk.mocks.Registry.constructor","RingCentral.sdk.mocks.Registry.add","RingCentral.sdk.mocks.Registry.clear","RingCentral.sdk.mocks.Registry.find","RingCentral.sdk.mocks.Registry.apiCall","RingCentral.sdk.mocks.Registry.authentication","RingCentral.sdk.mocks.Registry.logout","RingCentral.sdk.mocks.Registry.presenceLoad","RingCentral.sdk.mocks.Registry.subscribeGeneric","RingCentral.sdk.mocks.Registry.subscribeOnPresence","RingCentral.sdk.mocks.Registry.tokenRefresh","RingCentral.sdk.externals","RingCentral.sdk.externals.get","ApiResponse","RingCentral.sdk.http.ApiResponse","RingCentral.sdk.http.ApiResponse.constructor","RingCentral.sdk.http.ApiResponse.response","RingCentral.sdk.http.ApiResponse.request","RingCentral.sdk.http.ApiResponse.ok","RingCentral.sdk.http.ApiResponse.text","RingCentral.sdk.http.ApiResponse.json","RingCentral.sdk.http.ApiResponse.error","RingCentral.sdk.http.ApiResponse.multipart","RingCentral.sdk.http.ApiResponse.multipartJson","RingCentral.sdk.http.ApiResponse._isContentType","RingCentral.sdk.http.ApiResponse._getContentType","RingCentral.sdk.http.ApiResponse._isMultipart","RingCentral.sdk.http.ApiResponse._isUrlEncoded","RingCentral.sdk.http.ApiResponse._isJson","RingCentral.sdk.http.ApiResponse.create","RingCentral.sdk.http","RingCentral.sdk.http.Client","RingCentral.sdk.http.Client.constructor","RingCentral.sdk.http.Client.sendRequest","RingCentral.sdk.http.Client._loadResponse","RingCentral.sdk.http.Client.makeError","RingCentral.sdk.http.Client.cloneResponse","RingCentral.sdk.http.Client.createResponse","RingCentral.sdk.http.Client.createRequest","RingCentral.sdk.platform","RingCentral.sdk.platform.Queue","RingCentral.sdk.platform.Queue.constructor","RingCentral.sdk.platform.Queue.isPaused","RingCentral.sdk.platform.Queue.pause","RingCentral.sdk.platform.Queue.resume","RingCentral.sdk.platform.Queue.poll","RingCentral.sdk.platform.Queue.releaseTimeout","RingCentral.sdk.platform.Queue.pollInterval","RingCentral.sdk.platform.Queue.setReleaseTimeout","RingCentral.sdk.platform.Queue.setPollInterval","RingCentral.sdk.platform.Platform","RingCentral.sdk.platform.Platform.constructor","RingCentral.sdk.platform.Platform.auth","RingCentral.sdk.platform.Platform.createUrl","RingCentral.sdk.platform.Platform.authUrl","RingCentral.sdk.platform.Platform.parseAuthRedirectUrl","RingCentral.sdk.platform.Platform.loggedIn","RingCentral.sdk.platform.Platform.login","RingCentral.sdk.platform.Platform.refresh","RingCentral.sdk.platform.Platform.logout","RingCentral.sdk.platform.Platform.inflateRequest","RingCentral.sdk.platform.Platform.sendRequest","RingCentral.sdk.platform.Platform.send","RingCentral.sdk.platform.Platform.get","RingCentral.sdk.platform.Platform.post","RingCentral.sdk.platform.Platform.put","RingCentral.sdk.platform.Platform.delete","RingCentral.sdk.platform.Platform._tokenRequest","RingCentral.sdk.platform.Platform._ensureAuthentication","RingCentral.sdk.platform.Platform._isAccessTokenValid","RingCentral.sdk.platform.Platform._refreshPolling","RingCentral.sdk.platform.Platform._apiKey","RingCentral.sdk.platform.Platform._authHeader","RingCentral.sdk.subscription","RingCentral.sdk.subscription.Subscription","RingCentral.sdk.subscription.Subscription.constructor","RingCentral.sdk.subscription.Subscription.alive","RingCentral.sdk.subscription.Subscription.setSubscription","RingCentral.sdk.subscription.Subscription.subscription","RingCentral.sdk.subscription.Subscription.register","RingCentral.sdk.subscription.Subscription.addEvents","RingCentral.sdk.subscription.Subscription.setEvents","RingCentral.sdk.subscription.Subscription.subscribe","RingCentral.sdk.subscription.Subscription.renew","RingCentral.sdk.subscription.Subscription.remove","RingCentral.sdk.subscription.Subscription.reset","RingCentral.sdk.subscription.Subscription.destroy","RingCentral.sdk.subscription.Subscription._getFullEventFilters","RingCentral.sdk.subscription.Subscription._setTimeout","RingCentral.sdk.subscription.Subscription._clearTimeout","RingCentral.sdk.subscription.Subscription._decrypt","RingCentral.sdk.subscription.Subscription._notify","RingCentral.sdk.subscription.Subscription._subscribeAtPubnub","RingCentral.sdk.pubnub","RingCentral.sdk.pubnub.PubnubMock","RingCentral.sdk.pubnub.PubnubMock.constructor","RingCentral.sdk.pubnub.PubnubMock.subscribe","RingCentral.sdk.pubnub.PubnubMock.unsubscribe","RingCentral.sdk.pubnub.PubnubMock.receiveMessage","RingCentral.sdk.pubnub.PubnubMockFactory","RingCentral.sdk.pubnub.PubnubMockFactory.constructor","RingCentral.sdk.pubnub.PubnubMockFactory.init","RingCentral.sdk.pubnub.PubnubFactory","RingCentral.sdk.pubnub.PubnubFactory.constructor","RingCentral.sdk.pubnub.PubnubFactory.getPubnub","RingCentral.sdk.SDK","RingCentral.sdk.SDK.constructor","RingCentral.sdk.SDK.platform","RingCentral.sdk.SDK.cache","RingCentral.sdk.SDK.createSubscription","RingCentral.sdk.SDK.createPageVisibility","RingCentral.sdk.SDK.createObservable","RingCentral.sdk.SDK.log","RingCentral.sdk.SDK.utils","RingCentral.sdk.SDK.mockRegistry","sdk","externals","define","amd","PUBNUB","_PUBNUB","module","exports","require","_Promise","Promise","_fetch","_Request","_Response","_Headers","RingCentral.sdk.http.ClientMock","RingCentral.sdk.http.ClientMock.constructor","RingCentral.sdk.http.ClientMock._loadResponse","RingCentral.sdk.platform.Auth","RingCentral.sdk.platform.Auth.constructor","RingCentral.sdk.platform.Auth.accessToken","RingCentral.sdk.platform.Auth.refreshToken","RingCentral.sdk.platform.Auth.tokenType","RingCentral.sdk.platform.Auth.data","RingCentral.sdk.platform.Auth.setData","RingCentral.sdk.platform.Auth.accessTokenValid","RingCentral.sdk.platform.Auth.refreshTokenValid","RingCentral.sdk.platform.Auth.cancelAccessToken","RingCentral.sdk.platform.Auth.forceAuthentication","RingCentral.sdk.platform.Auth.setRemember","RingCentral.sdk.platform.Auth.remember","lib$es6$promise$utils$$objectOrFunction","lib$es6$promise$utils$$isFunction","lib$es6$promise$utils$$isMaybeThenable","lib$es6$promise$asap$$asap","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","process","version","versions","node","setImmediate","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","lib$es6$promise$asap$$useMessageChannel","MessageChannel","port1","onmessage","port2","postMessage","lib$es6$promise$asap$$useSetTimeout","lib$es6$promise$asap$$attemptVertex","vertx","runOnLoop","runOnContext","lib$es6$promise$$internal$$noop","lib$es6$promise$$internal$$selfFullfillment","TypeError","lib$es6$promise$$internal$$cannotReturnOwn","lib$es6$promise$$internal$$getThen","promise","then","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","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","Constructor","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","resolve","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","global","self","Function","Error","P","cast","lib$es6$promise$promise$$default","lib$es6$promise$utils$$_isArray","lib$es6$promise$asap$$browserWindow","window","lib$es6$promise$asap$$browserGlobal","MutationObserver","WebKitMutationObserver","lib$es6$promise$asap$$isNode","lib$es6$promise$asap$$isWorker","Uint8ClampedArray","importScripts","_eachEntry","entry","_settledAt","_willSettleAt","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","reject","_setScheduler","_asap","result","arguments","catch","lib$es6$promise$polyfill$$default","lib$es6$promise$umd$$ES6Promise","polyfill","normalizeName","String","test","toLowerCase","normalizeValue","Headers","headers","forEach","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","parse","normalizeMethod","method","upcased","methods","Request","credentials","referrer","form","trim","bytes","decodeURIComponent","xhr","head","pairs","getAllResponseHeaders","header","Response","bodyInit","ok","statusText","fetch","getAll","has","thisArg","init","request","responseURL","getResponseHeader","XMLHttpRequest","responseText","open","withCredentials","responseType","setRequestHeader","send","toJSON","valueOf","quote","string","escapable","lastIndex","meta","slice","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","$","id","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","loaded","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","code","wasClean","close","h","g","lib","q","Base","mixIn","$super","clone","WordArray","words","sigBytes","concat","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"],"mappings":"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","file":"ringcentral-bundle.min.js","sourcesContent":["// Version: 3.7.13\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.13'\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'] || 'demo'\n , SUBSCRIBE_KEY = setup['subscribe_key'] || 'demo'\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 , _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 , jsonp = jsonp_cb();\n\n // Prevent Leaving a Presence Channel\n if (channel.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 (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n blocking : blocking || SSL,\n timeout : 2000,\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(channel), 'leave'\n ]\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 , 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\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 },\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.13'\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/* =-====================================================================-= */\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['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","module RingCentral.sdk.core {\n\n export class Cache {\n\n private _storage:Storage;\n private _prefix:string;\n\n constructor(storage:Storage|any, prefix?:string) {\n this.setPrefix(prefix);\n this._storage = storage;\n }\n\n setPrefix(prefix?:string) {\n this._prefix = prefix || 'rc-';\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 protected _prefixKey(key) {\n return this._prefix + key;\n }\n\n }\n\n}\n\n","module RingCentral.sdk.core {\n\n /**\n * TODO Fix public vars\n */\n export class Log {\n\n public _console:Console;\n public logDebug:boolean;\n public logInfo:boolean;\n public logWarnings:boolean;\n public logErrors:boolean;\n public addTimestamps:boolean;\n\n constructor(console?:Console) {\n\n if (!console) {\n console = { // safety\n log: () => {},\n warn: () => {},\n info: () => {},\n error: () => {}\n };\n }\n\n this._console = console;\n\n this.logDebug = false;\n this.logInfo = false;\n this.logWarnings = false;\n this.logErrors = false;\n\n this.addTimestamps = false;\n\n }\n\n disableAll() {\n this.logDebug = false;\n this.logInfo = false;\n this.logWarnings = false;\n this.logErrors = false;\n }\n\n enableAll() {\n this.logDebug = true;\n this.logInfo = true;\n this.logWarnings = true;\n this.logErrors = true;\n }\n\n debug(...args) {\n if (this.logDebug) this._console.log.apply(this._console, this._parseArguments(arguments));\n }\n\n info(...args) {\n if (this.logInfo) this._console.info.apply(this._console, this._parseArguments(arguments));\n }\n\n warn(...args) {\n if (this.logWarnings) this._console.warn.apply(this._console, this._parseArguments(arguments));\n }\n\n error(...args) {\n if (this.logErrors) this._console.error.apply(this._console, this._parseArguments(arguments));\n }\n\n stack() {\n var e = new Error();\n if (e.hasOwnProperty('stack')) {\n return e.stack.replace('Error\\n', 'Stack Trace\\n');\n }\n }\n\n protected _parseArguments(args) {\n args = utils.argumentsToArray(args);\n if (this.addTimestamps) args.unshift(new Date().toLocaleString(), '-');\n return args;\n }\n\n }\n\n export var log = new Log();\n\n}","var RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var core;\n (function (core) {\n var Cache = (function () {\n function Cache(storage, prefix) {\n this.setPrefix(prefix);\n this._storage = storage;\n }\n Cache.prototype.setPrefix = function (prefix) {\n this._prefix = prefix || 'rc-';\n return this;\n };\n Cache.prototype.setItem = function (key, data) {\n this._storage[this._prefixKey(key)] = JSON.stringify(data);\n return this;\n };\n Cache.prototype.removeItem = function (key) {\n delete this._storage[this._prefixKey(key)];\n return this;\n };\n Cache.prototype.getItem = function (key) {\n var item = this._storage[this._prefixKey(key)];\n if (!item)\n return null;\n return JSON.parse(item);\n };\n Cache.prototype.clean = function () {\n for (var key in this._storage) {\n if (!this._storage.hasOwnProperty(key))\n continue;\n if (key.indexOf(this._prefix) === 0) {\n delete this._storage[key];\n }\n }\n return this;\n };\n Cache.prototype._prefixKey = function (key) {\n return this._prefix + key;\n };\n return Cache;\n })();\n core.Cache = Cache;\n })(core = sdk.core || (sdk.core = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var core;\n (function (core) {\n /**\n * TODO Fix public vars\n */\n var Log = (function () {\n function Log(console) {\n if (!console) {\n console = {\n log: function () { },\n warn: function () { },\n info: function () { },\n error: function () { }\n };\n }\n this._console = console;\n this.logDebug = false;\n this.logInfo = false;\n this.logWarnings = false;\n this.logErrors = false;\n this.addTimestamps = false;\n }\n Log.prototype.disableAll = function () {\n this.logDebug = false;\n this.logInfo = false;\n this.logWarnings = false;\n this.logErrors = false;\n };\n Log.prototype.enableAll = function () {\n this.logDebug = true;\n this.logInfo = true;\n this.logWarnings = true;\n this.logErrors = true;\n };\n Log.prototype.debug = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i - 0] = arguments[_i];\n }\n if (this.logDebug)\n this._console.log.apply(this._console, this._parseArguments(arguments));\n };\n Log.prototype.info = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i - 0] = arguments[_i];\n }\n if (this.logInfo)\n this._console.info.apply(this._console, this._parseArguments(arguments));\n };\n Log.prototype.warn = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i - 0] = arguments[_i];\n }\n if (this.logWarnings)\n this._console.warn.apply(this._console, this._parseArguments(arguments));\n };\n Log.prototype.error = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i - 0] = arguments[_i];\n }\n if (this.logErrors)\n this._console.error.apply(this._console, this._parseArguments(arguments));\n };\n Log.prototype.stack = function () {\n var e = new Error();\n if (e.hasOwnProperty('stack')) {\n return e.stack.replace('Error\\n', 'Stack Trace\\n');\n }\n };\n Log.prototype._parseArguments = function (args) {\n args = core.utils.argumentsToArray(args);\n if (this.addTimestamps)\n args.unshift(new Date().toLocaleString(), '-');\n return args;\n };\n return Log;\n })();\n core.Log = Log;\n core.log = new Log();\n })(core = sdk.core || (sdk.core = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var core;\n (function (core) {\n var utils;\n (function (utils) {\n var hasOwn = Object.prototype.hasOwnProperty, toString = Object.prototype.toString, rdigit = /\\d/, class2type = {};\n // Populate the class2type map\n 'Boolean Number String Function Array Date RegExp Object'.split(' ').forEach(function (name) {\n class2type[\"[object \" + name + \"]\"] = name.toLowerCase();\n });\n /**\n * Ported from jQuery.fn.extend\n * Optional first parameter makes deep copy\n */\n function extend(targetObject, sourceObject) {\n var args = [];\n for (var _i = 2; _i < arguments.length; _i++) {\n args[_i - 2] = arguments[_i];\n }\n var options, name, src, copy, copyIsArray, clone, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false;\n // Handle a deep copy situation\n if (typeof target === \"boolean\") {\n deep = target;\n // skip the boolean and the target\n target = arguments[i] || {};\n i++;\n }\n // Handle case when target is a string or something (possible in deep copy)\n if (typeof target !== \"object\" && !isFunction(target)) {\n target = {};\n }\n for (; i < length; i++) {\n // Only deal with non-null/undefined values\n if ((options = arguments[i]) !== null) {\n // Extend the base object\n for (name in options) {\n src = target[name];\n copy = options[name];\n // Prevent never-ending loop\n if (target === copy) {\n continue;\n }\n // Recurse if we're merging plain objects or arrays\n if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {\n if (copyIsArray) {\n copyIsArray = false;\n clone = src && isArray(src) ? src : [];\n }\n else {\n clone = src && isPlainObject(src) ? src : {};\n }\n // Never move original objects, clone them\n target[name] = extend(deep, clone, copy);\n }\n else if (copy !== undefined) {\n target[name] = copy;\n }\n }\n }\n }\n // Return the modified object\n return target;\n }\n utils.extend = extend;\n function forEach(object, cb) {\n for (var i in object) {\n if (!object.hasOwnProperty(i))\n continue;\n var res = cb(object[i], i);\n if (res === false)\n break;\n }\n }\n utils.forEach = forEach;\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 function queryStringify(parameters) {\n var array = [];\n forEach(parameters, function (v, i) {\n if (isArray(v)) {\n v.forEach(function (vv) {\n array.push(encodeURIComponent(i) + '=' + encodeURIComponent(vv));\n });\n }\n else {\n array.push(encodeURIComponent(i) + '=' + encodeURIComponent(v));\n }\n });\n return array.join('&');\n }\n utils.queryStringify = queryStringify;\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 function parseQueryString(queryString) {\n var argsParsed = {}, self = this;\n queryString.split('&').forEach(function (arg) {\n arg = decodeURIComponent(arg);\n if (arg.indexOf('=') == -1) {\n argsParsed[arg.trim()] = true;\n }\n else {\n var pair = arg.split('='), key = pair[0].trim(), value = pair[1].trim();\n if (key in argsParsed) {\n if (key in argsParsed && !self.isArray(argsParsed[key]))\n argsParsed[key] = [argsParsed[key]];\n argsParsed[key].push(value);\n }\n else {\n argsParsed[key] = value;\n }\n }\n });\n return argsParsed;\n }\n utils.parseQueryString = parseQueryString;\n /**\n * Returns true if the passed value is valid email address.\n * Checks multiple comma separated emails according to RFC 2822 if parameter `multiple` is `true`\n */\n function isEmail(v, multiple) {\n if (!!multiple) {\n //this Regexp is also suitable for multiple emails (comma separated)\n return /^(?:[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?[ ,;]*)+$/i.test(v);\n }\n else {\n return /^[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i.test(v);\n }\n }\n utils.isEmail = isEmail;\n function isPhoneNumber(v) {\n return (/\\+?1[0-9]{3}[0-9a-z]{7}/im.test(v.toString().split(/[^0-9a-z\\+]/im).join('')));\n }\n utils.isPhoneNumber = isPhoneNumber;\n /**\n * @param args\n * @returns {Array}\n */\n function argumentsToArray(args) {\n return Array.prototype.slice.call(args || [], 0);\n }\n utils.argumentsToArray = argumentsToArray;\n function isDate(obj) {\n return type(obj) === \"date\";\n }\n utils.isDate = isDate;\n function isFunction(obj) {\n return type(obj) === \"function\";\n }\n utils.isFunction = isFunction;\n function isArray(obj) {\n return Array.isArray ? Array.isArray(obj) : type(obj) === \"array\";\n }\n utils.isArray = isArray;\n // A crude way of determining if an object is a window\n function isWindow(obj) {\n return obj && typeof obj === \"object\" && \"setInterval\" in obj;\n }\n utils.isWindow = isWindow;\n function isNan(obj) {\n return obj === null || !rdigit.test(obj) || isNaN(obj);\n }\n utils.isNan = isNan;\n function type(obj) {\n return obj === null\n ? String(obj)\n : class2type[toString.call(obj)] || \"object\";\n }\n utils.type = type;\n function isPlainObject(obj) {\n // Must be an Object.\n // Because of IE, we also have to check the presence of the constructor property.\n // Make sure that DOM nodes and window objects don't pass through, as well\n if (!obj || type(obj) !== \"object\" || obj.nodeType || isWindow(obj)) {\n return false;\n }\n // Not own constructor property must be Object\n if (obj.constructor && !hasOwn.call(obj, \"constructor\") && !hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\")) {\n return false;\n }\n // Own properties are enumerated firstly, so to speed up,\n // if last one is own, then all properties are own.\n var key;\n for (key in obj) { }\n return key === undefined || hasOwn.call(obj, key);\n }\n utils.isPlainObject = isPlainObject;\n function getProperty(obj, property) {\n return property\n .split(/[.[\\]]/)\n .reduce(function (res, part) {\n if (!res)\n return undefined;\n return part ? res[part] : res;\n }, obj);\n }\n utils.getProperty = getProperty;\n function poll(fn, interval, timeout) {\n stopPolling(timeout);\n interval = interval || 1000;\n var next = function (delay) {\n delay = delay || interval;\n interval = delay;\n return setTimeout(function () {\n fn(next, delay);\n }, delay);\n };\n return next();\n }\n utils.poll = poll;\n function stopPolling(timeout) {\n if (timeout)\n clearTimeout(timeout);\n }\n utils.stopPolling = stopPolling;\n function parseString(s) {\n return s ? s.toString() : '';\n }\n utils.parseString = parseString;\n function parseNumber(n) {\n if (!n)\n return 0;\n n = parseFloat(n);\n return isNan(n) ? 0 : n;\n }\n utils.parseNumber = parseNumber;\n function isNodeJS() {\n return (typeof process !== 'undefined');\n }\n utils.isNodeJS = isNodeJS;\n function isBrowser() {\n return (typeof window !== 'undefined');\n }\n utils.isBrowser = isBrowser;\n })(utils = core.utils || (core.utils = {}));\n })(core = sdk.core || (sdk.core = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\n/// \n/// \nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var core;\n (function (core) {\n /**\n * @see https://github.com/Microsoft/TypeScript/issues/275\n */\n var Observable = (function () {\n function Observable() {\n if (!(this instanceof Observable))\n throw new Error('Observable(): New operator was omitted');\n this.off();\n }\n Observable.prototype.hasListeners = function (event) {\n return (event in this._listeners);\n };\n Observable.prototype.on = function (events, callback) {\n var _this = this;\n if (typeof events == 'string')\n events = [events];\n if (!events)\n throw new Error('No events to subscribe to');\n if (typeof callback !== 'function')\n throw new Error('Callback must be a function');\n events.forEach(function (event) {\n if (!_this.hasListeners(event))\n _this._listeners[event] = [];\n _this._listeners[event].push(callback);\n });\n return this;\n };\n Observable.prototype.emit = function (event) {\n var _this = this;\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n var result = null;\n if (!this.hasListeners(event))\n return null;\n this._listeners[event].some(function (callback) {\n result = callback.apply(_this, args);\n return (result === false);\n });\n return result;\n };\n Observable.prototype.off = function (event, callback) {\n var _this = this;\n if (!event) {\n this._listeners = {};\n }\n else {\n if (!callback) {\n delete this._listeners[event];\n }\n else {\n if (!this.hasListeners(event))\n return this;\n this._listeners[event].forEach(function (cb, i) {\n if (cb === callback)\n delete _this._listeners[event][i];\n });\n }\n }\n return this;\n };\n Observable.prototype.destroy = function () {\n this.off();\n core.log.debug('Observable.destroy(): Listeners were destroyed');\n return this;\n };\n return Observable;\n })();\n core.Observable = Observable;\n })(core = sdk.core || (sdk.core = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\n/// \nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n __.prototype = b.prototype;\n d.prototype = new __();\n};\nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var core;\n (function (core) {\n var PageVisibility = (function (_super) {\n __extends(PageVisibility, _super);\n function PageVisibility() {\n var _this = this;\n _super.call(this);\n this.events = {\n change: 'change'\n };\n var hidden = \"hidden\", onchange = function (evt) {\n evt = evt || window.event;\n var v = 'visible', h = 'hidden', evtMap = {\n focus: v, focusin: v, pageshow: v, blur: h, focusout: h, pagehide: h\n };\n _this._visible = (evt.type in evtMap) ? evtMap[evt.type] == v : !document[hidden];\n _this.emit(_this.events.change, _this._visible);\n };\n this._visible = true;\n if (typeof document == 'undefined' || typeof window == 'undefined')\n return;\n // Standards:\n if (hidden in document)\n document.addEventListener(\"visibilitychange\", onchange);\n else if ((hidden = \"mozHidden\") in document)\n document.addEventListener(\"mozvisibilitychange\", onchange);\n else if ((hidden = \"webkitHidden\") in document)\n document.addEventListener(\"webkitvisibilitychange\", onchange);\n else if ((hidden = \"msHidden\") in document)\n document.addEventListener(\"msvisibilitychange\", onchange);\n else if ('onfocusin' in document)\n document.onfocusin = document.onfocusout = onchange;\n else\n window.onpageshow = window.onpagehide = window.onfocus = window.onblur = onchange;\n }\n PageVisibility.prototype.visible = function () {\n return this._visible;\n };\n return PageVisibility;\n })(core.Observable);\n core.PageVisibility = PageVisibility;\n })(core = sdk.core || (sdk.core = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\n/// \n/// \nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var mocks;\n (function (mocks) {\n var Mock = (function () {\n function Mock(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 Mock.prototype.path = function () {\n return this._path;\n };\n Mock.prototype.method = function () {\n return this._method;\n };\n Mock.prototype.test = function (request) {\n return request.url.indexOf(this._path) > -1 &&\n request.method.toUpperCase() == this._method;\n };\n Mock.prototype.getResponse = function (request) {\n var _this = this;\n return new sdk.externals._Promise(function (resolve, reject) {\n setTimeout(function () {\n resolve(_this.createResponse(_this._json));\n }, _this._delay);\n });\n };\n Mock.prototype.createResponse = function (json, init) {\n init = init || {};\n init.status = init.status || this._status;\n init.statusText = init.statusText || this._statusText;\n var str = JSON.stringify(json), res = sdk.http.Client.createResponse(str, init);\n res.headers.set(sdk.http.ApiResponse.contentType, sdk.http.ApiResponse.jsonContentType);\n return res;\n };\n return Mock;\n })();\n mocks.Mock = Mock;\n })(mocks = sdk.mocks || (sdk.mocks = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\n/// \nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var mocks;\n (function (mocks) {\n var Registry = (function () {\n function Registry() {\n this._mocks = [];\n }\n Registry.prototype.add = function (mock) {\n this._mocks.push(mock);\n return this;\n };\n Registry.prototype.clear = function () {\n this._mocks = [];\n return this;\n };\n Registry.prototype.find = function (request) {\n //console.log('Registry is looking for', request);\n var mock = this._mocks.shift();\n if (!mock)\n throw new Error('No mock in registry for request ' + request.method + ' ' + request.url);\n if (!mock.test(request))\n throw new Error('Wrong request ' + request.method + ' ' + request.url +\n ' for expected mock ' + mock.method() + ' ' + mock.path());\n return mock;\n };\n Registry.prototype.apiCall = function (method, path, response, status, statusText) {\n this.add(new mocks.Mock(method, path, response, status, statusText));\n return this;\n };\n Registry.prototype.authentication = function () {\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 return this;\n };\n Registry.prototype.logout = function () {\n this.apiCall('POST', '/restapi/oauth/revoke', {});\n return this;\n };\n Registry.prototype.presenceLoad = function (id) {\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 return this;\n };\n Registry.prototype.subscribeGeneric = function (expiresIn) {\n expiresIn = expiresIn || 15 * 60 * 60;\n var date = new Date();\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 return this;\n };\n Registry.prototype.subscribeOnPresence = function (id, detailed) {\n id = id || '1';\n var date = new Date();\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 return this;\n };\n Registry.prototype.tokenRefresh = function (failure) {\n if (!failure) {\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 this.apiCall('POST', '/restapi/oauth/token', {\n 'message': 'Wrong token',\n 'error_description': 'Wrong token',\n 'description': 'Wrong token'\n }, 400);\n }\n return this;\n };\n return Registry;\n })();\n mocks.Registry = Registry;\n })(mocks = sdk.mocks || (sdk.mocks = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\n/// \nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var externals;\n (function (externals) {\n externals._Promise;\n externals._fetch;\n externals._Response;\n externals._Request;\n externals._Headers;\n externals._PUBNUB;\n function get() {\n var root = Function('return this')();\n if (!externals._PUBNUB)\n externals._PUBNUB = root.PUBNUB;\n if (!externals._Promise)\n externals._Promise = root.Promise;\n if (!externals._fetch)\n externals._fetch = root.fetch;\n if (!externals._Headers)\n externals._Headers = root.Headers;\n if (!externals._Request)\n externals._Request = root.Request;\n if (!externals._Response)\n externals._Response = root.Response;\n return externals;\n }\n externals.get = get;\n })(externals = sdk.externals || (sdk.externals = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\n/// \n/// \n/// \nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var http;\n (function (http) {\n /**\n * @TODO Bring back tests\n */\n var ApiResponse = (function () {\n function ApiResponse(request, response, responseText) {\n this._text = responseText;\n this._request = request;\n this._response = response;\n this._json = null;\n this._multipartTransactions = null;\n }\n ApiResponse.prototype.response = function () {\n return this._response;\n };\n ApiResponse.prototype.request = function () {\n return this._request;\n };\n ApiResponse.prototype.ok = function () {\n return this._response && this._response.ok;\n };\n ApiResponse.prototype.text = function () {\n return this._text;\n };\n ApiResponse.prototype.json = function () {\n if (!this._isJson())\n 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 ApiResponse.prototype.error = function (skipOKCheck) {\n if (this.ok() && !skipOKCheck)\n return null;\n var message = (this._response && this._response.status ? this._response.status + ' ' : '') +\n (this._response && this._response.statusText ? this._response.statusText : '');\n try {\n var json = this.json();\n if (json.message)\n message = json.message;\n if (json.error_description)\n message = json.error_description;\n if (json.description)\n message = json.description;\n }\n catch (ex) { }\n return message;\n };\n ApiResponse.prototype.multipart = function () {\n if (!this._isMultipart())\n throw new Error('Response is not multipart');\n if (null === this._multipartTransactions) {\n // Step 1. Split multipart response\n if (!this._text)\n throw new Error('No response body');\n var boundary = this._response.headers.get('Content-Type').match(/boundary=([^;]+)/i)[1];\n if (!boundary)\n throw new Error('Cannot find boundary');\n var parts = this._text.toString().split(ApiResponse.boundarySeparator + boundary);\n if (parts[0].trim() === '')\n parts.shift();\n if (parts[parts.length - 1].trim() == ApiResponse.boundarySeparator)\n parts.pop();\n if (parts.length < 1)\n throw new Error('No parts in body');\n // Step 2. Parse status info\n var statusInfo = ApiResponse.create(parts.shift(), this._response.status, this._response.statusText);\n // Step 3. Parse all other parts\n this._multipartTransactions = parts.map(function (part, i) {\n var status = statusInfo.json().response[i].status;\n return ApiResponse.create(part, status);\n });\n }\n return this._multipartTransactions;\n };\n /**\n * Short-hand method to get only JSON content of responses\n */\n ApiResponse.prototype.multipartJson = function () {\n return this.multipart().map(function (res) {\n return res.json();\n });\n };\n ApiResponse.prototype._isContentType = function (contentType) {\n return this._getContentType().indexOf(contentType) > -1;\n };\n ApiResponse.prototype._getContentType = function () {\n return this._response.headers.get(ApiResponse.contentType) || '';\n };\n ApiResponse.prototype._isMultipart = function () {\n return this._isContentType(ApiResponse.multipartContentType);\n };\n ApiResponse.prototype._isUrlEncoded = function () {\n return this._isContentType(ApiResponse.urlencodedContentType);\n };\n ApiResponse.prototype._isJson = function () {\n return this._isContentType(ApiResponse.jsonContentType);\n };\n /**\n * Method is used to create Transaction objects from string parts of multipart/mixed response\n * @param text\n * @param status\n * @param statusText\n * @return {ApiResponse}\n */\n ApiResponse.create = function (text, status, statusText) {\n status = status || 200;\n statusText = statusText || 'OK';\n text = text.replace(/\\r/g, '');\n var headers = new sdk.externals._Headers(), headersAndBody = text.split(ApiResponse.bodySeparator), headersText = (headersAndBody.length > 1) ? headersAndBody.shift() : '';\n text = headersAndBody.join(ApiResponse.bodySeparator);\n (headersText || '')\n .split('\\n')\n .forEach(function (header) {\n var split = header.trim().split(ApiResponse.headerSeparator), key = split.shift().trim(), value = split.join(ApiResponse.headerSeparator).trim();\n if (key)\n headers.append(key, value);\n });\n return new ApiResponse(null, http.Client.createResponse(text, {\n headers: headers,\n status: status,\n statusText: statusText\n }), text);\n };\n ApiResponse.contentType = 'Content-Type';\n ApiResponse.jsonContentType = 'application/json';\n ApiResponse.multipartContentType = 'multipart/mixed';\n ApiResponse.urlencodedContentType = 'application/x-www-form-urlencoded';\n ApiResponse.headerSeparator = ':';\n ApiResponse.bodySeparator = '\\n\\n';\n ApiResponse.boundarySeparator = '--';\n return ApiResponse;\n })();\n http.ApiResponse = ApiResponse;\n })(http = sdk.http || (sdk.http = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\n/// \n/// \n/// \n/// \n/// \n/// \nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var http;\n (function (http) {\n var allowedMethods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'];\n var Client = (function (_super) {\n __extends(Client, _super);\n function Client() {\n _super.apply(this, arguments);\n this.events = {\n beforeRequest: 'beforeRequest',\n requestSuccess: 'requestSuccess',\n requestError: 'requestError' // means that request failed completely\n };\n }\n Client.prototype.sendRequest = function (request) {\n var _this = this;\n var res = new http.ApiResponse(request); //FIXME Potential leak\n return new sdk.externals._Promise(function (resolve) {\n //TODO Stop request if listeners return false\n _this.emit(_this.events.beforeRequest, res);\n resolve(_this._loadResponse(request));\n })\n .then(function (response) {\n res['_response'] = Client.cloneResponse(response);\n return response.text();\n })\n .then(function (text) {\n res['_text'] = text;\n if (!res.ok())\n throw Client.makeError(new Error('Response has unsuccessful status'), res);\n _this.emit(_this.events.requestSuccess, res);\n return res;\n })\n .catch(function (e) {\n if (!e.apiResponse) {\n // we don't pass response since most likely it's parsing caused an error\n e = Client.makeError(e, res);\n }\n _this.emit(_this.events.requestError, e);\n throw e;\n });\n };\n Client.prototype._loadResponse = function (request) {\n return sdk.externals._fetch.call(null, request);\n };\n /**\n * Wraps the JS Error object with transaction information\n * @param {Error} e\n * @param {ApiResponse} apiResponse\n * @return {IApiError}\n */\n Client.makeError = function (e, apiResponse) {\n var error = e;\n // Wrap only if regular error\n if (!error.hasOwnProperty('apiResponse') && !error.hasOwnProperty('originalMessage')) {\n error.apiResponse = apiResponse;\n error.originalMessage = error.message;\n error.message = (apiResponse && apiResponse.error(true)) || error.originalMessage;\n }\n return error;\n };\n /**\n * TODO Wait for\n * - https://github.com/github/fetch/issues/185\n * - https://github.com/bitinn/node-fetch/issues/34\n * @param {Response} response\n * @return {Response}\n */\n Client.cloneResponse = function (response) {\n if (sdk.core.utils.isFunction(response.clone))\n return response.clone();\n var body = '';\n if (response.hasOwnProperty('_bodyInit'))\n body = response['_bodyInit'];\n if (response.hasOwnProperty('_bodyText'))\n body = response['_bodyText'];\n if (response.hasOwnProperty('_bodyBlob'))\n body = response['_bodyBlob'].slice();\n if (response.hasOwnProperty('_bodyFormData'))\n body = response['_bodyFormData'];\n if (response.hasOwnProperty('_raw'))\n body = response['_raw'].join('');\n var clone = new sdk.externals._Response(body, response);\n if (response.hasOwnProperty('body'))\n clone['body'] = response['body']; // accessing non-standard properties\n return clone;\n };\n /**\n * Creates a response\n * @param stringBody\n * @param init\n * @return {Response}\n */\n Client.createResponse = function (stringBody, init) {\n init = init || {};\n return new sdk.externals._Response(stringBody, init);\n };\n Client.createRequest = function (input, init) {\n init = init || {};\n var body = init.body;\n // Assign request with empty body, Github's fetch throws errors if it cannot recognize the body type\n var req = new sdk.externals._Request(input, sdk.core.utils.extend({}, init, { body: null }));\n if (!req.url)\n throw new Error('Url is not defined');\n if (!req.method)\n req.method = 'GET';\n if (req.method && allowedMethods.indexOf(req.method) < 0)\n throw new Error('Method has wrong value: ' + req.method);\n if (!req.headers.has('Accept'))\n req.headers.set('Accept', 'application/json');\n // Serialize body\n if (sdk.core.utils.isPlainObject(init.body) || !init.body) {\n if (!req.headers.has('Content-Type'))\n req.headers.set('Content-Type', 'application/json');\n var contentType = req.headers.get('Content-Type');\n if (contentType.indexOf('application/json') > -1) {\n body = JSON.stringify(init.body);\n }\n else if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n body = sdk.core.utils.queryStringify(init.body);\n }\n }\n req.credentials = 'include';\n req.mode = 'cors';\n if (init.query) {\n req.url = req.url + (req.url.indexOf('?') > -1 ? '&' : '?') + sdk.core.utils.queryStringify(init.query);\n }\n // Create another request with encoded body\n req = new sdk.externals._Request(req.url, sdk.core.utils.extend(req, { body: body }));\n // Keep the original body accessible directly (for mocks)\n req.body = init.body;\n return req;\n };\n return Client;\n })(sdk.core.Observable);\n http.Client = Client;\n })(http = sdk.http || (sdk.http = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\n/// \n/// \n/// \n/// \nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var platform;\n (function (platform) {\n var Queue = (function () {\n function Queue(cache, cacheId) {\n this._cache = cache;\n this._cacheId = cacheId;\n this.setPollInterval(250);\n this.setReleaseTimeout(5000); // If queue was not released then force it to do so after some timeout\n }\n Queue.prototype.isPaused = function () {\n var storage = this._cache, cacheId = this._cacheId, time = storage.getItem(cacheId);\n return !!time && Date.now() - parseInt(time) < this._releaseTimeout;\n };\n Queue.prototype.pause = function () {\n this._cache.setItem(this._cacheId, Date.now());\n return this;\n };\n Queue.prototype.resume = function () {\n this._cache.removeItem(this._cacheId);\n return this;\n };\n Queue.prototype.poll = function () {\n var _this = this;\n if (this._promise)\n return this._promise;\n this._promise = new sdk.externals._Promise(function (resolve, reject) {\n sdk.core.utils.poll(function (next) {\n if (_this.isPaused())\n return next();\n _this._promise = null;\n _this.resume(); // this is actually not needed but why not\n resolve(null);\n }, _this._pollInterval);\n });\n return this._promise;\n };\n Queue.prototype.releaseTimeout = function () {\n return this._releaseTimeout;\n };\n Queue.prototype.pollInterval = function () {\n return this._pollInterval;\n };\n Queue.prototype.setReleaseTimeout = function (releaseTimeout) {\n this._releaseTimeout = releaseTimeout;\n return this;\n };\n Queue.prototype.setPollInterval = function (pollInterval) {\n this._pollInterval = pollInterval;\n return this;\n };\n return Queue;\n })();\n platform.Queue = Queue;\n })(platform = sdk.platform || (sdk.platform = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var platform;\n (function (platform) {\n var Platform = (function (_super) {\n __extends(Platform, _super);\n function Platform(client, cache, queue, server, appKey, appSecret) {\n _super.call(this);\n this._refreshDelayMs = 100;\n this._clearCacheOnRefreshError = true;\n this._cacheId = 'platform';\n this.events = {\n accessViolation: 'accessViolation',\n logoutSuccess: 'logoutSuccess',\n logoutError: 'logoutError',\n authorizeSuccess: 'authorizeSuccess',\n authorizeError: 'authorizeError',\n refreshSuccess: 'refreshSuccess',\n refreshError: 'refreshError'\n };\n this._server = server;\n this._appKey = appKey;\n this._appSecret = appSecret;\n this._cache = cache;\n this._client = client;\n this._queue = new platform.Queue(this._cache, this._cacheId + '-refresh');\n this._auth = new platform.Auth(this._cache, this._cacheId);\n }\n Platform.prototype.auth = function () {\n return this._auth;\n };\n Platform.prototype.createUrl = function (path, options) {\n path = path || '';\n options = options || {};\n var builtUrl = '', hasHttp = path.indexOf('http://') != -1 || path.indexOf('https://') != -1;\n if (options.addServer && !hasHttp)\n builtUrl += this._server;\n if (path.indexOf(Platform._urlPrefix) == -1 && !hasHttp)\n builtUrl += Platform._urlPrefix + '/' + Platform._apiVersion;\n builtUrl += path;\n if (options.addMethod || options.addToken)\n builtUrl += (path.indexOf('?') > -1 ? '&' : '?');\n if (options.addMethod)\n builtUrl += '_method=' + options.addMethod;\n if (options.addToken)\n builtUrl += (options.addMethod ? '&' : '') + 'access_token=' + this._auth.accessToken();\n return builtUrl;\n };\n Platform.prototype.authUrl = function (options) {\n options = options || {};\n return this.createUrl(Platform._authorizeEndpoint + '?' + sdk.core.utils.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 Platform.prototype.parseAuthRedirectUrl = function (url) {\n var qs = sdk.core.utils.parseQueryString(url.split('?').reverse()[0]), error = qs.error_description || qs.error;\n if (error) {\n var e = new Error(error);\n e.error = qs.error;\n throw e;\n }\n return qs;\n };\n Platform.prototype.loggedIn = function () {\n return this._ensureAuthentication()\n .then(function () {\n return true;\n })\n .catch(function () {\n return false;\n });\n };\n Platform.prototype.login = function (options) {\n var _this = this;\n options = options || {};\n options.remember = options.remember || false;\n var body = {\n \"access_token_ttl\": Platform._accessTokenTtl,\n \"refresh_token_ttl\": options.remember ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl\n };\n if (!options.code) {\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 body.grant_type = 'authorization_code';\n body.code = options.code;\n body.redirect_uri = options.redirectUri;\n }\n if (options.endpointId)\n body.endpoint_id = options.endpointId;\n return this._tokenRequest(Platform._tokenEndpoint, body).then(function (res) {\n _this._auth\n .setData(res.json())\n .setRemember(options.remember);\n _this.emit(_this.events.authorizeSuccess, res);\n return res;\n }).catch(function (e) {\n _this._cache.clean();\n _this.emit(_this.events.authorizeError, e);\n throw e;\n });\n };\n Platform.prototype.refresh = function () {\n var _this = this;\n var refresh = new sdk.externals._Promise(function (resolve, reject) {\n if (_this._queue.isPaused()) {\n return resolve(_this._refreshPolling());\n }\n _this._queue.pause();\n // Make sure all existing AJAX calls had a chance to reach the server\n setTimeout(function () {\n sdk.core.log.debug('Platform.refresh(): Performing token refresh (access token', _this._auth.accessToken(), ', refresh token', _this._auth.refreshToken(), ')');\n // Perform sanity checks\n if (!_this._auth.refreshToken())\n return reject(new Error('Refresh token is missing'));\n if (!_this._auth.refreshTokenValid())\n return reject(new Error('Refresh token has expired'));\n if (!_this._queue.isPaused())\n return reject(new Error('Queue was resumed before refresh call'));\n resolve(_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 }, _this._refreshDelayMs);\n });\n return refresh.then(function (res) {\n // This means refresh has happened elsewhere and we are here because of timeout\n if (res && res.json && res.json()) {\n var json = res.json();\n sdk.core.log.info('Platform.refresh(): Token was refreshed', res);\n if (!json.refresh_token || !json.access_token) {\n throw sdk.http.Client.makeError(new Error('Malformed OAuth response'), res);\n }\n _this._auth.setData(json);\n _this._queue.resume();\n }\n _this.emit(_this.events.refreshSuccess, res);\n return res;\n }).catch(function (e) {\n e = sdk.http.Client.makeError(e);\n if (_this._clearCacheOnRefreshError) {\n _this._cache.clean();\n }\n _this.emit(_this.events.accessViolation, e);\n _this.emit(_this.events.refreshError, e);\n throw e;\n });\n };\n /**\n * @returns {Promise}\n */\n Platform.prototype.logout = function () {\n var _this = this;\n this._queue.pause();\n return this._tokenRequest(Platform._revokeEndpoint, {\n token: this._auth.accessToken()\n }).then(function (res) {\n _this._queue.resume();\n _this._cache.clean();\n _this.emit(_this.events.logoutSuccess, res);\n return res;\n }).catch(function (e) {\n _this._queue.resume();\n _this.emit(_this.events.accessViolation, e);\n _this.emit(_this.events.logoutError, e);\n throw e;\n });\n };\n Platform.prototype.inflateRequest = function (request, options) {\n var _this = this;\n options = options || {};\n if (options.skipAuthCheck)\n return sdk.externals._Promise.resolve(request);\n return this\n ._ensureAuthentication()\n .then(function () {\n request.headers.set('Authorization', _this._authHeader());\n request.url = _this.createUrl(request.url, { addServer: true });\n return request;\n });\n };\n Platform.prototype.sendRequest = function (request, options) {\n var _this = this;\n return this\n .inflateRequest(request, options)\n .then(function (req) {\n return _this._client.sendRequest(req);\n })\n .catch(function (e) {\n // Guard is for errors that come from polling\n if (!e.apiResponse || !e.apiResponse.response() || (e.apiResponse.response().status != 401))\n throw e;\n _this._auth.cancelAccessToken();\n return _this.sendRequest(request, options);\n });\n };\n /**\n * General purpose function to send anything to server\n */\n Platform.prototype.send = function (url, options) {\n try {\n // This has to be done here in order to let NodeJS Fetch to create Request\n url = this.createUrl(url, { addServer: true });\n return this.sendRequest(sdk.http.Client.createRequest(url, options), options);\n }\n catch (e) {\n return sdk.externals._Promise.reject(e);\n }\n };\n Platform.prototype.get = function (url, options) {\n options = options || {};\n options.method = 'GET';\n return this.send(url, options);\n };\n Platform.prototype.post = function (url, options) {\n options = options || {};\n options.method = 'POST';\n return this.send(url, options);\n };\n Platform.prototype.put = function (url, options) {\n options = options || {};\n options.method = 'PUT';\n return this.send(url, options);\n };\n Platform.prototype['delete'] = function (url, options) {\n options = options || {};\n options.method = 'DELETE';\n return this.send(url, options);\n };\n Platform.prototype._tokenRequest = function (path, body) {\n return this.send(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 Platform.prototype._ensureAuthentication = function () {\n if (this._isAccessTokenValid())\n return sdk.externals._Promise.resolve(null);\n return this.refresh();\n };\n Platform.prototype._isAccessTokenValid = function () {\n return (this._auth.accessTokenValid() && !this._queue.isPaused());\n };\n Platform.prototype._refreshPolling = function () {\n var _this = this;\n sdk.core.log.warn('Platform.refresh(): Refresh is already in progress, polling started');\n return this._queue.poll().then(function () {\n if (!_this._isAccessTokenValid()) {\n throw new Error('Automatic authentification timeout');\n }\n return null;\n });\n };\n Platform.prototype._apiKey = function () {\n var apiKey = this._appKey + ':' + this._appSecret;\n return (typeof btoa == 'function') ? btoa(apiKey) : new Buffer(apiKey).toString('base64');\n };\n Platform.prototype._authHeader = function () {\n var token = this._auth.accessToken();\n return this._auth.tokenType() + (token ? ' ' + token : '');\n };\n Platform._urlPrefix = '/restapi';\n Platform._apiVersion = 'v1.0';\n Platform._accessTokenTtl = null; // Platform server by default sets it to 60 * 60 = 1 hour\n Platform._refreshTokenTtl = 10 * 60 * 60; // 10 hours\n Platform._refreshTokenTtlRemember = 7 * 24 * 60 * 60; // 1 week\n Platform._tokenEndpoint = '/restapi/oauth/token';\n Platform._revokeEndpoint = '/restapi/oauth/revoke';\n Platform._authorizeEndpoint = '/restapi/oauth/authorize';\n return Platform;\n })(sdk.core.Observable);\n platform.Platform = Platform;\n })(platform = sdk.platform || (sdk.platform = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\n/// \n/// \n/// \n/// \n/// \n/// \nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var subscription;\n (function (subscription_1) {\n var Subscription = (function (_super) {\n __extends(Subscription, _super);\n function Subscription(pubnubFactory, platform) {\n _super.call(this);\n this._renewHandicapMs = 2 * 60 * 1000;\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._eventFilters = [];\n this._timeout = null;\n this._subscription = null;\n }\n Subscription.prototype.alive = function () {\n return this._subscription &&\n this._subscription.id &&\n this._subscription.deliveryMode &&\n this._subscription.deliveryMode.subscriberKey &&\n this._subscription.deliveryMode.address;\n };\n Subscription.prototype.setSubscription = function (subscription) {\n this._clearTimeout();\n this._subscription = subscription;\n if (!this._pubnub)\n this._subscribeAtPubnub();\n this._setTimeout();\n return this;\n };\n Subscription.prototype.subscription = function () {\n return this._subscription;\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 Subscription.prototype.register = function (options) {\n if (this.alive()) {\n return this.renew(options);\n }\n else {\n return this.subscribe(options);\n }\n };\n Subscription.prototype.addEvents = function (events) {\n this._eventFilters = this._eventFilters.concat(events);\n return this;\n };\n Subscription.prototype.setEvents = function (events) {\n this._eventFilters = events;\n return this;\n };\n Subscription.prototype.subscribe = function (options) {\n var _this = this;\n options = options || {};\n if (options.events)\n this.setEvents(options.events);\n this._clearTimeout();\n return new sdk.externals._Promise(function (resolve, reject) {\n if (!_this._eventFilters || !_this._eventFilters.length)\n throw new Error('Events are undefined');\n resolve(_this._platform.post('/restapi/v1.0/subscription', {\n body: {\n eventFilters: _this._getFullEventFilters(),\n deliveryMode: {\n transportType: 'PubNub'\n }\n }\n }));\n }).then(function (ajax) {\n _this.setSubscription(ajax.json())\n .emit(_this.events.subscribeSuccess, ajax);\n return ajax;\n }).catch(function (e) {\n e = sdk.http.Client.makeError(e);\n _this.reset()\n .emit(_this.events.subscribeError, e);\n throw e;\n });\n };\n Subscription.prototype.renew = function (options) {\n var _this = this;\n options = options || {};\n if (options.events)\n this.setEvents(options.events);\n this._clearTimeout();\n return new sdk.externals._Promise(function (resolve, reject) {\n if (!_this.alive())\n throw new Error('Subscription is not alive');\n if (!_this._eventFilters || !_this._eventFilters.length)\n throw new Error('Events are undefined');\n return _this._platform.put('/restapi/v1.0/subscription/' + _this._subscription.id, {\n body: {\n eventFilters: _this._getFullEventFilters()\n }\n });\n })\n .then(function (ajax) {\n _this.setSubscription(ajax.json())\n .emit(_this.events.renewSuccess, ajax.json());\n return ajax;\n })\n .catch(function (e) {\n e = sdk.http.Client.makeError(e);\n _this.reset()\n .emit(_this.events.renewError, e);\n throw e;\n });\n };\n Subscription.prototype.remove = function () {\n var _this = this;\n return new sdk.externals._Promise(function (resolve, reject) {\n if (!_this._subscription || !_this._subscription.id)\n throw new Error('Subscription ID is required');\n resolve(_this._platform.delete('/restapi/v1.0/subscription/' + _this._subscription.id));\n }).then(function (ajax) {\n _this.reset()\n .emit(_this.events.removeSuccess, ajax);\n return ajax;\n }).catch(function (e) {\n e = sdk.http.Client.makeError(e);\n _this.emit(_this.events.removeError, e);\n throw e;\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 Subscription.prototype.reset = function () {\n this._clearTimeout();\n if (this.alive() && this._pubnub)\n this._pubnub.unsubscribe({ channel: this._subscription.deliveryMode.address });\n this._subscription = null;\n return this;\n };\n Subscription.prototype.destroy = function () {\n this.reset();\n sdk.core.log.info('RC.subscription.Subscription: Destroyed');\n return _super.prototype.destroy.call(this);\n };\n Subscription.prototype._getFullEventFilters = function () {\n var _this = this;\n return this._eventFilters.map(function (event) {\n return _this._platform.createUrl(event);\n });\n };\n Subscription.prototype._setTimeout = function () {\n var _this = this;\n this._clearTimeout();\n if (!this.alive())\n throw new Error('Subscription is not alive');\n var timeToExpiration = (this._subscription.expiresIn * 1000) - this._renewHandicapMs;\n this._timeout = setTimeout(function () {\n _this.renew({});\n }, timeToExpiration);\n return this;\n };\n Subscription.prototype._clearTimeout = function () {\n clearTimeout(this._timeout);\n return this;\n };\n Subscription.prototype._decrypt = function (message) {\n if (!this.alive())\n throw new Error('Subscription is not alive');\n if (this._subscription.deliveryMode.encryptionKey) {\n var PUBNUB = this._pubnubFactory.getPubnub();\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 return message;\n };\n Subscription.prototype._notify = function (message) {\n this.emit(this.events.notification, this._decrypt(message));\n return this;\n };\n Subscription.prototype._subscribeAtPubnub = function () {\n var _this = this;\n if (!this.alive())\n throw new Error('Subscription is not alive');\n var PUBNUB = this._pubnubFactory.getPubnub();\n this._pubnub = PUBNUB.init({\n ssl: true,\n subscribe_key: this._subscription.deliveryMode.subscriberKey\n });\n this._pubnub.ready();\n this._pubnub.subscribe({\n channel: this._subscription.deliveryMode.address,\n message: function (message, env, channel) {\n sdk.core.log.info('RC.core.Subscription: Incoming message', message);\n _this._notify(message);\n },\n connect: function () {\n sdk.core.log.info('RC.core.Subscription: PUBNUB connected');\n }\n });\n return this;\n };\n return Subscription;\n })(sdk.core.Observable);\n subscription_1.Subscription = Subscription;\n })(subscription = sdk.subscription || (sdk.subscription = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\n/// \n/// \n/// \nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var pubnub;\n (function (pubnub) {\n var PubnubMock = (function (_super) {\n __extends(PubnubMock, _super);\n function PubnubMock(options) {\n _super.call(this);\n this.options = options;\n this.crypto_obj = sdk.externals._PUBNUB.crypto_obj;\n }\n PubnubMock.prototype.ready = function () { };\n PubnubMock.prototype.subscribe = function (options) {\n this.on('message-' + options.channel, options.message);\n };\n PubnubMock.prototype.unsubscribe = function (options) {\n this.off('message-' + options.channel);\n };\n PubnubMock.prototype.receiveMessage = function (msg, channel) {\n this.emit('message-' + channel, msg, 'env', channel);\n };\n return PubnubMock;\n })(sdk.core.Observable);\n pubnub.PubnubMock = PubnubMock;\n var PubnubMockFactory = (function () {\n function PubnubMockFactory() {\n this.crypto_obj = sdk.externals._PUBNUB.crypto_obj;\n }\n PubnubMockFactory.prototype.init = function (options) {\n return new PubnubMock(options);\n };\n return PubnubMockFactory;\n })();\n pubnub.PubnubMockFactory = PubnubMockFactory;\n })(pubnub = sdk.pubnub || (sdk.pubnub = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\n/// \n/// \nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var pubnub;\n (function (pubnub) {\n var PubnubFactory = (function () {\n function PubnubFactory(flag) {\n this._useMock = false;\n this._useMock = !!flag;\n this._mock = new pubnub.PubnubMockFactory();\n }\n PubnubFactory.prototype.getPubnub = function () {\n return this._useMock ? this._mock : sdk.externals._PUBNUB;\n };\n return PubnubFactory;\n })();\n pubnub.PubnubFactory = PubnubFactory;\n })(pubnub = sdk.pubnub || (sdk.pubnub = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var SDK = (function () {\n function SDK(options) {\n options = options || {};\n sdk.externals.get();\n this._mockRegistry = new sdk.mocks.Registry();\n this._cache = new sdk.core.Cache(typeof localStorage !== 'undefined' ? localStorage : {}, options.cachePrefix);\n this._queue = new sdk.platform.Queue(this._cache, 'platform-refresh');\n this._client = options.useHttpMock ? new sdk.http.ClientMock(this._mockRegistry) : new sdk.http.Client();\n this._platform = new sdk.platform.Platform(this._client, this._cache, this._queue, options.server, options.appKey, options.appSecret);\n this._pubnubFactory = new sdk.pubnub.PubnubFactory(options.usePubnubMock);\n //TODO Link Platform events with Subscriptions and the rest\n }\n SDK.prototype.platform = function () {\n return this._platform;\n };\n SDK.prototype.cache = function () {\n return this._cache;\n };\n SDK.prototype.createSubscription = function () {\n return new sdk.subscription.Subscription(this._pubnubFactory, this._platform);\n };\n SDK.prototype.createPageVisibility = function () {\n return new sdk.core.PageVisibility();\n };\n SDK.prototype.createObservable = function () {\n return new sdk.core.Observable();\n };\n SDK.prototype.log = function () {\n return sdk.core.log;\n };\n SDK.prototype.utils = function () {\n return sdk.core.utils;\n };\n SDK.prototype.mockRegistry = function () { return this._mockRegistry; };\n SDK.version = '2.0.0';\n SDK.server = {\n sandbox: 'https://platform.devtest.ringcentral.com',\n production: 'https://platform.ringcentral.com'\n };\n return SDK;\n })();\n sdk.SDK = SDK;\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\nvar e = RingCentral.sdk.externals.get();\nif (typeof define === 'function' && define.amd) {\n define(['pubnub'], function (PUBNUB) {\n e._PUBNUB = PUBNUB;\n return RingCentral.sdk;\n });\n}\nelse if (typeof module === 'object' && module.exports) {\n e._PUBNUB = require('pubnub');\n e._Promise = typeof (Promise) !== 'undefined' ? Promise : require('es6-promise').Promise;\n e._fetch = require('node-fetch');\n e._Request = e._fetch['Request'];\n e._Response = e._fetch['Response'];\n e._Headers = e._fetch['Headers'];\n module.exports = RingCentral.sdk;\n}\nelse {\n}\n/// \n/// \n/// \n/// \n/// \n/// \nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var http;\n (function (http) {\n var ClientMock = (function (_super) {\n __extends(ClientMock, _super);\n function ClientMock(registry) {\n _super.call(this);\n this._registry = registry;\n }\n ClientMock.prototype._loadResponse = function (request) {\n var _this = this;\n return new sdk.externals._Promise(function (resolve) {\n sdk.core.log.debug('API REQUEST', request.method, request.url);\n var mock = _this._registry.find(request);\n resolve(mock.getResponse(request));\n });\n };\n return ClientMock;\n })(http.Client);\n http.ClientMock = ClientMock;\n })(http = sdk.http || (sdk.http = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var platform;\n (function (platform) {\n var Auth = (function () {\n function Auth(cache, cacheId) {\n this._cache = cache;\n this._cacheId = cacheId;\n }\n Auth.prototype.accessToken = function () {\n return this.data().access_token;\n };\n Auth.prototype.refreshToken = function () {\n return this.data().refresh_token;\n };\n Auth.prototype.tokenType = function () {\n return this.data().token_type;\n };\n Auth.prototype.data = function () {\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 Auth.prototype.setData = function (authData) {\n var oldAuthData = this.data();\n authData = sdk.core.utils.extend({}, oldAuthData, authData);\n authData.expire_time = Date.now() + (authData.expires_in * 1000);\n authData.refresh_token_expire_time = Date.now() + (authData.refresh_token_expires_in * 1000);\n sdk.core.log.info('Auth.setData(): Tokens were updated, new:', authData, ', old:', oldAuthData);\n this._cache.setItem(this._cacheId, authData);\n return this;\n };\n /**\n * Check if there is a valid (not expired) access token\n */\n Auth.prototype.accessTokenValid = function () {\n var authData = this.data();\n return (authData.token_type === Auth.forcedTokenType || (authData.expire_time - Auth.refreshHandicapMs > Date.now()));\n };\n /**\n * Check if there is a valid (not expired) access token\n */\n Auth.prototype.refreshTokenValid = function () {\n return (this.data().refresh_token_expire_time > Date.now());\n };\n Auth.prototype.cancelAccessToken = function () {\n return this.setData({\n access_token: '',\n expires_in: 0\n });\n };\n /**\n * This method sets a special authentication mode used in Service Web\n * @return {Platform}\n */\n Auth.prototype.forceAuthentication = function () {\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 return this;\n };\n Auth.prototype.setRemember = function (remember) {\n return this.setData({ remember: remember });\n };\n Auth.prototype.remember = function () {\n return !!this.data().remember;\n };\n Auth.refreshHandicapMs = 60 * 1000; // 1 minute\n Auth.forcedTokenType = 'forced';\n return Auth;\n })();\n platform.Auth = Auth;\n })(platform = sdk.platform || (sdk.platform = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\n\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(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// Version: 3.7.13\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.13'\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'] || 'demo'\n , SUBSCRIBE_KEY = setup['subscribe_key'] || 'demo'\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 , _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 , jsonp = jsonp_cb();\n\n // Prevent Leaving a Presence Channel\n if (channel.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 (USE_INSTANCEID) data['instanceid'] = INSTANCEID;\n\n xdr({\n blocking : blocking || SSL,\n timeout : 2000,\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(channel), 'leave'\n ]\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 , 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\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 },\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.13'\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/* =-====================================================================-= */\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['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//# sourceMappingURL=ringcentral-bundle.js.map","module RingCentral.sdk.core.utils {\n\n var hasOwn = Object.prototype.hasOwnProperty,\n toString = Object.prototype.toString,\n rdigit = /\\d/,\n class2type = {};\n\n // Populate the class2type map\n 'Boolean Number String Function Array Date RegExp Object'.split(' ').forEach((name) => {\n class2type[\"[object \" + name + \"]\"] = name.toLowerCase();\n });\n\n /**\n * Ported from jQuery.fn.extend\n * Optional first parameter makes deep copy\n */\n export function extend(targetObject:any, sourceObject:any, ...args) {\n\n var options, name, src, copy, copyIsArray, clone,\n target = arguments[0] || {},\n i = 1,\n length = arguments.length,\n deep = false;\n\n // Handle a deep copy situation\n if (typeof target === \"boolean\") {\n deep = target;\n\n // skip the boolean and the target\n target = arguments[i] || {};\n i++;\n }\n\n // Handle case when target is a string or something (possible in deep copy)\n if (typeof target !== \"object\" && !isFunction(target)) {\n target = {};\n }\n\n for (; i < length; i++) {\n\n // Only deal with non-null/undefined values\n if ((options = arguments[i]) !== null) {\n\n // Extend the base object\n for (name in options) {\n\n src = target[name];\n copy = options[name];\n\n // Prevent never-ending loop\n if (target === copy) {\n continue;\n }\n\n // Recurse if we're merging plain objects or arrays\n if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {\n\n if (copyIsArray) {\n copyIsArray = false;\n clone = src && isArray(src) ? src : [];\n } else {\n clone = src && isPlainObject(src) ? src : {};\n }\n\n // Never move original objects, clone them\n target[name] = extend(deep, clone, copy);\n\n // Don't bring in undefined values\n } else if (copy !== undefined) {\n\n target[name] = copy;\n\n }\n }\n }\n }\n\n // Return the modified object\n return target;\n\n }\n\n export function forEach(object, cb) {\n\n for (var i in object) {\n\n if (!object.hasOwnProperty(i)) continue;\n\n var res = cb(object[i], i);\n\n if (res === false) break;\n\n }\n\n }\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 export function queryStringify(parameters) {\n\n var array = [];\n\n forEach(parameters, (v, i) => {\n\n if (isArray(v)) {\n v.forEach((vv) => {\n array.push(encodeURIComponent(i) + '=' + encodeURIComponent(vv));\n });\n } else {\n array.push(encodeURIComponent(i) + '=' + 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 */\n export function parseQueryString(queryString:string):any {\n\n var argsParsed = {},\n self = this;\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 && !self.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 * Returns true if the passed value is valid email address.\n * Checks multiple comma separated emails according to RFC 2822 if parameter `multiple` is `true`\n */\n export function isEmail(v:string, multiple:boolean):boolean {\n if (!!multiple) {\n //this Regexp is also suitable for multiple emails (comma separated)\n return /^(?:[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?[ ,;]*)+$/i.test(v);\n } else {\n return /^[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i.test(v);\n }\n\n }\n\n export function isPhoneNumber(v:string):boolean {\n return (/\\+?1[0-9]{3}[0-9a-z]{7}/im.test(v.toString().split(/[^0-9a-z\\+]/im).join('')));\n }\n\n /**\n * @param args\n * @returns {Array}\n */\n export function argumentsToArray(args:any) {\n return Array.prototype.slice.call(args || [], 0);\n }\n\n export function isDate(obj:any):boolean {\n return type(obj) === \"date\";\n }\n\n export function isFunction(obj:any):boolean {\n return type(obj) === \"function\";\n }\n\n export function isArray(obj:any):boolean {\n return Array.isArray ? Array.isArray(obj) : type(obj) === \"array\";\n }\n\n // A crude way of determining if an object is a window\n export function isWindow(obj:any):boolean {\n return obj && typeof obj === \"object\" && \"setInterval\" in obj;\n }\n\n export function isNan(obj:any):boolean {\n return obj === null || !rdigit.test(obj) || isNaN(obj);\n }\n\n export function type(obj:any):string {\n return obj === null\n ? String(obj)\n : class2type[toString.call(obj)] || \"object\";\n }\n\n export function isPlainObject(obj:any):boolean {\n\n // Must be an Object.\n // Because of IE, we also have to check the presence of the constructor property.\n // Make sure that DOM nodes and window objects don't pass through, as well\n if (!obj || type(obj) !== \"object\" || obj.nodeType || isWindow(obj)) {\n return false;\n }\n\n // Not own constructor property must be Object\n if (obj.constructor && !hasOwn.call(obj, \"constructor\") && !hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\")) {\n return false;\n }\n\n // Own properties are enumerated firstly, so to speed up,\n // if last one is own, then all properties are own.\n\n var key;\n for (key in obj) {}\n\n return key === undefined || hasOwn.call(obj, key);\n\n }\n\n export function getProperty(obj:any, property:string):any {\n\n return property\n .split(/[.[\\]]/)\n .reduce((res, part) => {\n if (!res) return undefined;\n return part ? res[part] : res;\n }, obj);\n\n }\n\n export function poll(fn, interval?:number, timeout?:any):any { //NodeJS.Timer|number\n\n stopPolling(timeout);\n\n interval = interval || 1000;\n\n var next = (delay?:number):any => {\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\n export function stopPolling(timeout) {\n if (timeout) clearTimeout(timeout);\n }\n\n export function parseString(s:any):string {\n return s ? s.toString() : '';\n }\n\n export function parseNumber(n:any):number {\n if (!n) return 0;\n n = parseFloat(n);\n return isNan(n) ? 0 : n;\n }\n\n export function isNodeJS():boolean {\n return (typeof process !== 'undefined');\n }\n\n export function isBrowser():boolean {\n return (typeof window !== 'undefined');\n }\n\n}","/// \n/// \n\nmodule RingCentral.sdk.core {\n\n /**\n * @see https://github.com/Microsoft/TypeScript/issues/275\n */\n export class Observable> {\n\n private _listeners:any;\n\n constructor() {\n if (!(this instanceof Observable)) throw new Error('Observable(): New operator was omitted');\n this.off();\n }\n\n hasListeners(event) {\n return (event in this._listeners);\n }\n\n on(events:any, callback:(...args)=>any):T {\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:string) => {\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:string, ...args):any {\n\n var result = null;\n\n if (!this.hasListeners(event)) return null;\n\n this._listeners[event].some((callback:()=>any) => {\n\n result = callback.apply(this, args);\n return (result === false);\n\n });\n\n return result;\n\n }\n\n off(event?:string, callback?):T {\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 destroy():T {\n this.off();\n log.debug('Observable.destroy(): Listeners were destroyed');\n return this;\n }\n\n }\n\n}\n\n\n","/// \n\nmodule RingCentral.sdk.core {\n\n export class PageVisibility extends Observable {\n\n public events = {\n change: 'change'\n };\n\n protected _visible:boolean;\n\n constructor() {\n\n super();\n\n var hidden = \"hidden\",\n onchange = (evt) => {\n\n evt = evt || window.event;\n\n var v = 'visible',\n h = 'hidden',\n evtMap = {\n focus: v, focusin: v, pageshow: v, blur: h, focusout: h, pagehide: h\n };\n\n this._visible = (evt.type in evtMap) ? evtMap[evt.type] == v : !document[hidden];\n\n this.emit(this.events.change, this._visible);\n\n };\n\n this._visible = true;\n\n if (typeof document == 'undefined' || typeof window == 'undefined') return;\n\n // Standards:\n\n if (hidden in document)\n document.addEventListener(\"visibilitychange\", onchange);\n else if ((hidden = \"mozHidden\") in document)\n document.addEventListener(\"mozvisibilitychange\", onchange);\n else if ((hidden = \"webkitHidden\") in document)\n document.addEventListener(\"webkitvisibilitychange\", onchange);\n else if ((hidden = \"msHidden\") in document)\n document.addEventListener(\"msvisibilitychange\", onchange);\n // IE 9 and lower:\n else if ('onfocusin' in document)\n (document).onfocusin = (document).onfocusout = onchange;\n // All others:\n else\n window.onpageshow = window.onpagehide = window.onfocus = window.onblur = onchange;\n\n }\n\n visible() {\n return this._visible;\n }\n\n }\n\n}","/// \n/// \n\nmodule RingCentral.sdk.mocks {\n\n export class Mock {\n\n protected _method:string;\n protected _path:string;\n protected _delay:number;\n protected _json:any;\n protected _status:number;\n protected _statusText:string;\n\n constructor(method:string, path:string, json?:any, status?:number, statusText?:string, delay?:number) {\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 getResponse(request:Request):Response|Promise {\n\n return new externals._Promise((resolve, reject) => {\n\n setTimeout(() => {\n\n resolve(this.createResponse(this._json));\n\n }, this._delay);\n\n });\n\n }\n\n createResponse(json?:any, init?:ResponseInit|any) {\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 = http.Client.createResponse(str, init);\n\n res.headers.set(http.ApiResponse.contentType, http.ApiResponse.jsonContentType);\n\n return res;\n\n }\n\n }\n\n}","/// \n\nmodule RingCentral.sdk.mocks {\n\n export class Registry {\n\n protected _mocks:Mock[];\n\n constructor() {\n this._mocks = [];\n }\n\n add(mock:Mock) {\n this._mocks.push(mock);\n return this;\n }\n\n clear() {\n this._mocks = [];\n return this;\n }\n\n find(request:Request):Mock {\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?:number, statusText?:string) {\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?:number) {\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?:string, detailed?:boolean) {\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?:boolean) {\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\nmodule RingCentral.sdk.externals {\n\n export var _Promise:typeof Promise;\n export var _fetch:Fetch;\n export var _Response:typeof Response;\n export var _Request:typeof Request;\n export var _Headers:typeof Headers;\n export var _PUBNUB:PUBNUB;\n\n export function get() {\n\n var root = Function('return this')();\n\n if (!_PUBNUB) _PUBNUB = root.PUBNUB;\n if (!_Promise) _Promise = root.Promise;\n if (!_fetch) _fetch = root.fetch;\n if (!_Headers) _Headers = root.Headers;\n if (!_Request) _Request = root.Request;\n if (!_Response) _Response = root.Response;\n\n return externals;\n\n }\n\n}\n\n","/// \n/// \n/// \n\nmodule RingCentral.sdk.http {\n\n /**\n * @TODO Bring back tests\n */\n export 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 protected _json:any;\n protected _text:string;\n protected _request:Request;\n protected _response:Response;\n protected _multipartTransactions:ApiResponse[];\n\n constructor(request?:Request, response?:Response, responseText?:string) {\n\n this._text = responseText;\n this._request = request;\n this._response = response;\n this._json = null;\n this._multipartTransactions = null;\n\n }\n\n response() {\n return this._response;\n }\n\n request() {\n return this._request;\n }\n\n ok() {\n return this._response && this._response.ok;\n }\n\n text() {\n return this._text;\n }\n\n json() {\n\n if (!this._isJson()) throw new Error('Response is not JSON');\n\n if (!this._json) {\n this._json = this._text ? JSON.parse(this._text) : null;\n }\n\n return this._json;\n\n }\n\n error(skipOKCheck?:boolean) {\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 var json = this.json();\n\n if (json.message) message = json.message;\n if (json.error_description) message = json.error_description;\n if (json.description) message = json.description;\n\n } catch (ex) {}\n\n return message;\n\n }\n\n multipart():ApiResponse[] {\n\n if (!this._isMultipart()) throw new Error('Response is not multipart');\n\n if (null === this._multipartTransactions) {\n\n // Step 1. Split multipart response\n\n if (!this._text) throw new Error('No response body');\n\n var boundary = this._response.headers.get('Content-Type').match(/boundary=([^;]+)/i)[1];\n\n if (!boundary) throw new Error('Cannot find boundary');\n\n var parts = this._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);\n\n // Step 3. Parse all other parts\n\n this._multipartTransactions = parts.map((part:string, i) => { //FIXME It will not work since parts contain both headers and body\n\n var status = statusInfo.json().response[i].status;\n\n return ApiResponse.create(part, status);\n\n });\n\n }\n\n return this._multipartTransactions;\n\n }\n\n /**\n * Short-hand method to get only JSON content of responses\n */\n multipartJson():any[] {\n\n return this.multipart().map((res)=> {\n return res.json();\n });\n\n }\n\n protected _isContentType(contentType:string):boolean {\n return this._getContentType().indexOf(contentType) > -1;\n }\n\n protected _getContentType():string {\n return this._response.headers.get(ApiResponse.contentType) || '';\n }\n\n protected _isMultipart():boolean {\n return this._isContentType(ApiResponse.multipartContentType);\n }\n\n protected _isUrlEncoded():boolean {\n return this._isContentType(ApiResponse.urlencodedContentType);\n }\n\n protected _isJson():boolean {\n return this._isContentType(ApiResponse.jsonContentType);\n }\n\n /**\n * Method is used to create Transaction objects from string parts of multipart/mixed response\n * @param text\n * @param status\n * @param statusText\n * @return {ApiResponse}\n */\n static create(text?:string, status?:number, statusText?:string):ApiResponse {\n\n status = status || 200;\n statusText = statusText || 'OK';\n\n text = text.replace(/\\r/g, '');\n\n var headers = new externals._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, Client.createResponse(text, {\n headers: headers,\n status: status,\n statusText: statusText\n }), text);\n\n }\n\n }\n\n}","/// \n/// \n/// \n/// \n/// \n/// \n\nmodule RingCentral.sdk.http {\n\n var allowedMethods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'];\n\n export class Client extends core.Observable {\n\n public events = {\n beforeRequest: 'beforeRequest', // parameters: ajax\n requestSuccess: 'requestSuccess', // means that response was successfully fetched from server\n requestError: 'requestError' // means that request failed completely\n };\n\n sendRequest(request:Request):Promise {\n\n var res = new ApiResponse(request); //FIXME Potential leak\n\n return new externals._Promise((resolve) => {\n\n //TODO Stop request if listeners return false\n this.emit(this.events.beforeRequest, res);\n\n resolve(this._loadResponse(request));\n\n })\n .then((response:Response) => {\n\n res['_response'] = Client.cloneResponse(response);\n\n return response.text();\n\n })\n .then((text:string) => {\n\n res['_text'] = text;\n\n if (!res.ok()) throw Client.makeError(new Error('Response has unsuccessful status'), res);\n\n this.emit(this.events.requestSuccess, res);\n\n return res;\n\n })\n .catch((e:IApiError):any=> {\n\n if (!e.apiResponse) {\n // we don't pass response since most likely it's parsing caused an error\n e = Client.makeError(e, res);\n }\n\n this.emit(this.events.requestError, e);\n\n throw e;\n\n });\n\n }\n\n protected _loadResponse(request:Request):Promise {\n return externals._fetch.call(null, request);\n }\n\n /**\n * Wraps the JS Error object with transaction information\n * @param {Error} e\n * @param {ApiResponse} apiResponse\n * @return {IApiError}\n */\n static makeError(e:Error, apiResponse?:ApiResponse) {\n\n var error = e;\n\n // Wrap only if regular error\n if (!error.hasOwnProperty('apiResponse') && !error.hasOwnProperty('originalMessage')) {\n\n error.apiResponse = apiResponse;\n error.originalMessage = error.message;\n error.message = (apiResponse && apiResponse.error(true)) || error.originalMessage;\n\n }\n\n return error;\n\n }\n\n /**\n * TODO Wait for\n * - https://github.com/github/fetch/issues/185\n * - https://github.com/bitinn/node-fetch/issues/34\n * @param {Response} response\n * @return {Response}\n */\n static cloneResponse(response:Response):Response {\n\n if (core.utils.isFunction(response.clone)) return response.clone();\n\n var body = '';\n\n if (response.hasOwnProperty('_bodyInit')) body = response['_bodyInit'];\n if (response.hasOwnProperty('_bodyText')) body = response['_bodyText'];\n if (response.hasOwnProperty('_bodyBlob')) body = response['_bodyBlob'].slice();\n if (response.hasOwnProperty('_bodyFormData')) body = response['_bodyFormData'];\n\n if (response.hasOwnProperty('_raw')) body = response['_raw'].join('');\n\n var clone = new externals._Response(body, response);\n\n if (response.hasOwnProperty('body')) clone['body'] = response['body']; // accessing non-standard properties\n\n return clone;\n\n }\n\n /**\n * Creates a response\n * @param stringBody\n * @param init\n * @return {Response}\n */\n static createResponse(stringBody?:string, init?:ResponseInit):Response {\n\n init = init || {};\n\n return new externals._Response(stringBody, init);\n\n }\n\n static createRequest(input:string|Request, init?:IClientRequestInit) {\n\n init = init || {};\n\n var body = init.body;\n\n // Assign request with empty body, Github's fetch throws errors if it cannot recognize the body type\n var req = new externals._Request(input, core.utils.extend({}, init, {body: null}));\n\n if (!req.url) throw new Error('Url is not defined');\n if (!req.method) req.method = 'GET';\n if (req.method && allowedMethods.indexOf(req.method) < 0) throw new Error('Method has wrong value: ' + req.method);\n\n if (!req.headers.has('Accept')) req.headers.set('Accept', 'application/json');\n\n // Serialize body\n if (core.utils.isPlainObject(init.body) || !init.body) {\n\n if (!req.headers.has('Content-Type')) req.headers.set('Content-Type', 'application/json');\n\n var contentType = req.headers.get('Content-Type');\n\n if (contentType.indexOf('application/json') > -1) {\n\n body = JSON.stringify(init.body);\n\n } else if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n\n body = core.utils.queryStringify(init.body);\n\n }\n\n }\n\n req.credentials = 'include';\n req.mode = 'cors';\n\n if (init.query) {\n req.url = req.url + (req.url.indexOf('?') > -1 ? '&' : '?') + core.utils.queryStringify(init.query);\n }\n\n // Create another request with encoded body\n req = new externals._Request(req.url, core.utils.extend(req, {body: body}));\n\n // Keep the original body accessible directly (for mocks)\n req.body = init.body;\n\n return req;\n\n }\n\n }\n\n export interface IApiError extends Error {\n stack?:string;\n originalMessage:string;\n apiResponse:ApiResponse;\n }\n\n export interface IClientRequestInit extends RequestInit {\n query?: string;\n }\n\n}","/// \n/// \n/// \n/// \n\nmodule RingCentral.sdk.platform {\n\n export class Queue {\n\n protected _cacheId:string;\n protected _pollInterval:number;\n protected _releaseTimeout:number;\n\n protected _cache:core.Cache;\n protected _promise:Promise;\n\n constructor(cache:core.Cache, cacheId:string) {\n\n this._cache = cache;\n this._cacheId = cacheId;\n\n this.setPollInterval(250);\n this.setReleaseTimeout(5000); // If queue was not released then force it to do so after some timeout\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) < this._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 externals._Promise((resolve, reject) => {\n\n core.utils.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 }, this._pollInterval);\n\n });\n\n return this._promise;\n\n }\n\n releaseTimeout() {\n return this._releaseTimeout;\n }\n\n pollInterval() {\n return this._pollInterval;\n }\n\n setReleaseTimeout(releaseTimeout:number) {\n this._releaseTimeout = releaseTimeout;\n return this;\n }\n\n setPollInterval(pollInterval:number) {\n this._pollInterval = pollInterval;\n return this;\n }\n\n }\n\n}","/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n\nmodule RingCentral.sdk.platform {\n\n export class Platform extends core.Observable {\n\n protected static _urlPrefix:string = '/restapi';\n protected static _apiVersion:string = 'v1.0';\n protected static _accessTokenTtl:number = null; // Platform server by default sets it to 60 * 60 = 1 hour\n protected static _refreshTokenTtl:number = 10 * 60 * 60; // 10 hours\n protected static _refreshTokenTtlRemember:number = 7 * 24 * 60 * 60; // 1 week\n protected static _tokenEndpoint:string = '/restapi/oauth/token';\n protected static _revokeEndpoint:string = '/restapi/oauth/revoke';\n protected static _authorizeEndpoint:string = '/restapi/oauth/authorize';\n\n protected _server:string;\n protected _appKey:string;\n protected _appSecret:string;\n\n protected _refreshDelayMs:number = 100;\n protected _clearCacheOnRefreshError:boolean = true;\n protected _cacheId:string = 'platform';\n\n protected _queue:Queue;\n protected _cache:core.Cache;\n protected _client:http.Client;\n protected _auth:Auth;\n\n public events = {\n accessViolation: 'accessViolation',\n logoutSuccess: 'logoutSuccess',\n logoutError: 'logoutError',\n authorizeSuccess: 'authorizeSuccess',\n authorizeError: 'authorizeError',\n refreshSuccess: 'refreshSuccess',\n refreshError: 'refreshError'\n };\n\n constructor(client:http.Client,\n cache:core.Cache,\n queue:Queue,\n server:string,\n appKey:string,\n appSecret:string) {\n\n super();\n\n this._server = server;\n this._appKey = appKey;\n this._appSecret = appSecret;\n\n this._cache = cache;\n this._client = client;\n this._queue = new Queue(this._cache, this._cacheId + '-refresh');\n this._auth = new Auth(this._cache, this._cacheId);\n\n }\n\n auth():Auth {\n return this._auth;\n }\n\n createUrl(path, options?:{addMethod?: string; addToken?: boolean; addServer?: boolean}):string {\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 authUrl(options:{\n redirectUri:string;\n display?:string; // page|popup|touch|mobile, default 'page'\n prompt?:string; // sso|login|consent, default is 'login sso consent'\n state?:string;\n brandId?:string|number;\n }) {\n\n options = options || {};\n\n return this.createUrl(Platform._authorizeEndpoint + '?' + core.utils.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 parseAuthRedirectUrl(url:string) {\n\n var qs = core.utils.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 loggedIn():Promise {\n\n return this._ensureAuthentication()\n .then(()=> {\n return true;\n })\n .catch(()=> {\n return false;\n });\n\n }\n\n login(options?:{\n username?:string;\n password?: string;\n extension?:string;\n endpointId?:string;\n code?:string;\n redirectUri?:string;\n clientId?:string;\n remember?:boolean\n }):Promise {\n\n options = options || {};\n\n options.remember = options.remember || false;\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 return this._tokenRequest(Platform._tokenEndpoint, body).then((res:http.ApiResponse) => {\n\n this._auth\n .setData(res.json())\n .setRemember(options.remember);\n\n this.emit(this.events.authorizeSuccess, res);\n\n return res;\n\n }).catch((e:http.IApiError):any => {\n\n this._cache.clean();\n\n this.emit(this.events.authorizeError, e);\n\n throw e;\n\n });\n\n }\n\n refresh():Promise {\n\n var refresh = >new externals._Promise((resolve, reject) => {\n\n if (this._queue.isPaused()) {\n return resolve(this._refreshPolling());\n }\n\n this._queue.pause();\n\n // Make sure all existing AJAX calls had a chance to reach the server\n setTimeout(() => {\n\n core.log.debug('Platform.refresh(): Performing token refresh (access token', this._auth.accessToken(), ', refresh token', this._auth.refreshToken(), ')');\n\n // Perform sanity checks\n if (!this._auth.refreshToken()) return reject(new Error('Refresh token is missing'));\n if (!this._auth.refreshTokenValid()) return reject(new Error('Refresh token has expired'));\n if (!this._queue.isPaused()) return reject(new Error('Queue was resumed before refresh call'));\n\n resolve(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 }, this._refreshDelayMs);\n\n });\n\n return refresh.then((res:http.ApiResponse) => {\n\n // This means refresh has happened elsewhere and we are here because of timeout\n if (res && res.json && res.json()) {\n\n var json = res.json();\n\n core.log.info('Platform.refresh(): Token was refreshed', res);\n\n if (!json.refresh_token || !json.access_token) {\n throw http.Client.makeError(new Error('Malformed OAuth response'), res);\n }\n\n this._auth.setData(json);\n this._queue.resume();\n\n }\n\n this.emit(this.events.refreshSuccess, res);\n\n return res;\n\n }).catch((e:http.IApiError):any => {\n\n e = http.Client.makeError(e);\n\n if (this._clearCacheOnRefreshError) {\n this._cache.clean();\n }\n\n this.emit(this.events.accessViolation, e);\n this.emit(this.events.refreshError, e);\n\n throw e;\n\n });\n\n }\n\n /**\n * @returns {Promise}\n */\n logout():Promise {\n\n this._queue.pause();\n\n return this._tokenRequest(Platform._revokeEndpoint, {\n token: this._auth.accessToken()\n }).then((res) => {\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:http.IApiError):any => {\n\n this._queue.resume();\n\n this.emit(this.events.accessViolation, e);\n this.emit(this.events.logoutError, e);\n\n throw e;\n\n });\n\n }\n\n inflateRequest(request:Request, options?:IPlatformOptions):Promise {\n\n options = options || {};\n\n if (options.skipAuthCheck) return externals._Promise.resolve(request);\n\n return this\n ._ensureAuthentication()\n .then(() => {\n\n request.headers.set('Authorization', this._authHeader());\n request.url = this.createUrl(request.url, {addServer: true});\n\n return request;\n\n });\n\n }\n\n sendRequest(request:Request, options?:IPlatformOptions):Promise {\n\n return this\n .inflateRequest(request, options)\n .then((req) => {\n return this._client.sendRequest(req);\n })\n .catch((e:http.IApiError) => {\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 this.sendRequest(request, options);\n\n });\n\n }\n\n /**\n * General purpose function to send anything to server\n */\n send(url:string, options?:IPlatformCombinedOptions):Promise {\n\n try {\n\n // This has to be done here in order to let NodeJS Fetch to create Request\n url = this.createUrl(url, {addServer: true});\n\n return this.sendRequest(http.Client.createRequest(url, options), options);\n\n } catch (e) {\n return externals._Promise.reject(e);\n }\n\n }\n\n get(url:string, options?:IPlatformCombinedOptions) {\n options = options || {};\n options.method = 'GET';\n return this.send(url, options);\n }\n\n post(url:string, options:IPlatformCombinedOptions) {\n options = options || {};\n options.method = 'POST';\n return this.send(url, options);\n }\n\n put(url:string, options:IPlatformCombinedOptions) {\n options = options || {};\n options.method = 'PUT';\n return this.send(url, options);\n }\n\n 'delete'(url:string, options?:IPlatformCombinedOptions) {\n options = options || {};\n options.method = 'DELETE';\n return this.send(url, options);\n }\n\n protected _tokenRequest(path:string, body:any):Promise {\n\n return this.send(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 protected _ensureAuthentication() {\n\n if (this._isAccessTokenValid()) return externals._Promise.resolve(null);\n return this.refresh();\n\n }\n\n protected _isAccessTokenValid():boolean {\n\n return (this._auth.accessTokenValid() && !this._queue.isPaused());\n\n }\n\n protected _refreshPolling():Promise {\n\n core.log.warn('Platform.refresh(): Refresh is already in progress, polling started');\n\n return this._queue.poll().then(()=> {\n\n if (!this._isAccessTokenValid()) {\n throw new Error('Automatic authentification timeout');\n }\n\n return null;\n\n });\n\n }\n\n protected _apiKey() {\n var apiKey = this._appKey + ':' + this._appSecret;\n return (typeof btoa == 'function') ? btoa(apiKey) : new Buffer(apiKey).toString('base64');\n }\n\n protected _authHeader() {\n var token = this._auth.accessToken();\n return this._auth.tokenType() + (token ? ' ' + token : '');\n }\n\n }\n\n export interface IAuthError extends Error {\n error?:string;\n }\n\n export interface IPlatformOptions {\n skipAuthCheck?:boolean;\n }\n\n export interface IPlatformCombinedOptions extends IPlatformOptions, http.IClientRequestInit {}\n\n}","/// \n/// \n/// \n/// \n/// \n/// \n\nmodule RingCentral.sdk.subscription {\n\n\n export class Subscription extends core.Observable {\n\n protected _renewHandicapMs = 2 * 60 * 1000;\n\n protected _subscription:ISubscription|any;\n protected _timeout;\n protected _eventFilters:string[];\n protected _pubnub:PUBNUBInstance;\n\n protected _platform:platform.Platform;\n protected _pubnubFactory:pubnub.PubnubFactory;\n\n public 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:pubnub.PubnubFactory, platform:platform.Platform) {\n\n super();\n\n this._pubnubFactory = pubnubFactory;\n this._platform = platform;\n\n this._pubnub = null;\n this._eventFilters = [];\n this._timeout = null;\n this._subscription = null;\n\n }\n\n alive() {\n\n return this._subscription &&\n this._subscription.id &&\n this._subscription.deliveryMode &&\n this._subscription.deliveryMode.subscriberKey &&\n this._subscription.deliveryMode.address;\n\n }\n\n setSubscription(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():ISubscription {\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 register(options?:{events?:string[]}):Promise {\n\n if (this.alive()) {\n return this.renew(options);\n } else {\n return this.subscribe(options);\n }\n\n }\n\n addEvents(events:string[]) {\n this._eventFilters = this._eventFilters.concat(events);\n return this;\n }\n\n setEvents(events:string[]) {\n this._eventFilters = events;\n return this;\n }\n\n subscribe(options?:{events?:string[]}):Promise {\n\n options = options || {};\n\n if (options.events) this.setEvents(options.events);\n\n this._clearTimeout();\n\n return >new externals._Promise((resolve, reject) => {\n\n if (!this._eventFilters || !this._eventFilters.length) throw new Error('Events are undefined');\n\n resolve(this._platform.post('/restapi/v1.0/subscription', {\n body: {\n eventFilters: this._getFullEventFilters(),\n deliveryMode: {\n transportType: 'PubNub'\n }\n }\n }));\n\n }).then((ajax:http.ApiResponse) => {\n\n this.setSubscription(ajax.json())\n .emit(this.events.subscribeSuccess, ajax);\n\n return ajax;\n\n }).catch((e):any => {\n\n e = http.Client.makeError(e);\n\n this.reset()\n .emit(this.events.subscribeError, e);\n\n throw e;\n\n });\n\n }\n\n renew(options?:{events?:string[]}):Promise {\n\n options = options || {};\n\n if (options.events) this.setEvents(options.events);\n\n this._clearTimeout();\n\n return >new externals._Promise((resolve, reject) => {\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n if (!this._eventFilters || !this._eventFilters.length) throw new Error('Events are undefined');\n\n return this._platform.put('/restapi/v1.0/subscription/' + this._subscription.id, {\n body: {\n eventFilters: this._getFullEventFilters()\n }\n });\n\n })\n .then((ajax:http.ApiResponse) => {\n\n this.setSubscription(ajax.json())\n .emit(this.events.renewSuccess, ajax.json());\n\n return ajax;\n\n })\n .catch((e):any => {\n\n e = http.Client.makeError(e);\n\n this.reset()\n .emit(this.events.renewError, e);\n\n throw e;\n\n });\n\n }\n\n remove():Promise {\n\n return >new externals._Promise((resolve, reject) => {\n\n if (!this._subscription || !this._subscription.id) throw new Error('Subscription ID is required');\n\n resolve(this._platform.delete('/restapi/v1.0/subscription/' + this._subscription.id));\n\n }).then((ajax:http.ApiResponse) => {\n\n this.reset()\n .emit(this.events.removeSuccess, ajax);\n\n return ajax;\n\n }).catch((e):any => {\n\n e = http.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 = null;\n return this;\n }\n\n destroy():Subscription {\n\n this.reset();\n\n core.log.info('RC.subscription.Subscription: Destroyed');\n\n return super.destroy();\n\n }\n\n protected _getFullEventFilters() {\n\n return this._eventFilters.map((event) => {\n return this._platform.createUrl(event);\n });\n\n }\n\n protected _setTimeout() {\n\n this._clearTimeout();\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n var timeToExpiration = (this._subscription.expiresIn * 1000) - this._renewHandicapMs;\n\n this._timeout = setTimeout(() => {\n\n this.renew({});\n\n }, timeToExpiration);\n\n return this;\n\n }\n\n protected _clearTimeout() {\n\n clearTimeout(this._timeout);\n\n return this;\n\n }\n\n protected _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.getPubnub();\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 protected _notify(message:any) {\n\n this.emit(this.events.notification, this._decrypt(message));\n\n return this;\n\n }\n\n protected _subscribeAtPubnub():Subscription {\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n var PUBNUB = this._pubnubFactory.getPubnub();\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: (message, env, channel) => {\n\n core.log.info('RC.core.Subscription: Incoming message', message);\n this._notify(message);\n\n },\n connect: () => {\n core.log.info('RC.core.Subscription: PUBNUB connected');\n }\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/// \n\nmodule RingCentral.sdk.pubnub {\n\n export class PubnubMock extends core.Observable implements PUBNUBInstance {\n\n private options:PUBNUBInitOptions;\n crypto_obj:PUBNUBCryptoObj;\n\n constructor(options:PUBNUBInitOptions) {\n super();\n this.options = options;\n this.crypto_obj = externals._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 export class PubnubMockFactory implements PUBNUB {\n\n crypto_obj:PUBNUBCryptoObj;\n\n constructor() {\n this.crypto_obj = externals._PUBNUB.crypto_obj;\n }\n\n init(options:PUBNUBInitOptions) {\n return new PubnubMock(options);\n }\n\n }\n\n}","/// \n/// \n\nmodule RingCentral.sdk.pubnub {\n\n export class PubnubFactory {\n\n private _useMock:boolean = false;\n private _mock:PubnubMockFactory;\n\n constructor(flag:boolean) {\n this._useMock = !!flag;\n this._mock = new PubnubMockFactory();\n }\n\n getPubnub():PUBNUB {\n return this._useMock ? this._mock : externals._PUBNUB;\n }\n\n }\n\n}","/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n\nmodule RingCentral.sdk {\n\n export 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 private _platform:platform.Platform;\n private _cache:core.Cache;\n private _queue:platform.Queue;\n private _client:http.Client;\n private _pubnubFactory:pubnub.PubnubFactory;\n private _mockRegistry:mocks.Registry;\n\n constructor(options?:{\n server:string;\n appKey:string;\n appSecret:string;\n appName?:string;\n appVersion?:string;\n cachePrefix?:string;\n useHttpMock?:boolean;\n usePubnubMock?:boolean;\n }) {\n\n options = options || {};\n\n externals.get();\n\n this._mockRegistry = new mocks.Registry();\n\n this._cache = new core.Cache(typeof localStorage !== 'undefined' ? localStorage : {}, options.cachePrefix);\n\n this._queue = new platform.Queue(this._cache, 'platform-refresh');\n\n this._client = options.useHttpMock ? new http.ClientMock(this._mockRegistry) : new http.Client();\n\n this._platform = new platform.Platform(this._client, this._cache, this._queue, options.server, options.appKey, options.appSecret);\n\n this._pubnubFactory = new pubnub.PubnubFactory(options.usePubnubMock);\n\n //TODO Link Platform events with Subscriptions and the rest\n\n }\n\n platform():platform.Platform {\n return this._platform;\n }\n\n cache():core.Cache {\n return this._cache;\n }\n\n createSubscription():subscription.Subscription {\n return new subscription.Subscription(this._pubnubFactory, this._platform);\n }\n\n createPageVisibility() {\n return new core.PageVisibility();\n }\n\n createObservable() {\n return new core.Observable();\n }\n\n log() {\n return core.log;\n }\n\n utils() {\n return core.utils;\n }\n\n mockRegistry() { return this._mockRegistry; }\n\n }\n\n}\n\nvar e = RingCentral.sdk.externals.get();\n\nif (typeof define === 'function' && define.amd) {\n\n define(['pubnub'], function(PUBNUB) {\n e._PUBNUB = PUBNUB;\n return RingCentral.sdk;\n });\n\n} else if (typeof module === 'object' && module.exports) {\n\n e._PUBNUB = require('pubnub');\n e._Promise = typeof (Promise) !== 'undefined' ? Promise : require('es6-promise').Promise;\n e._fetch = require('node-fetch');\n e._Request = e._fetch['Request'];\n e._Response = e._fetch['Response'];\n e._Headers = e._fetch['Headers'];\n\n module.exports = RingCentral.sdk;\n\n} else {\n\n //TODO noConflict\n\n}\n","/// \n/// \n/// \n/// \n/// \n/// \n\nmodule RingCentral.sdk.http {\n\n export class ClientMock extends Client {\n\n private _registry:mocks.Registry;\n\n constructor(registry:mocks.Registry) {\n super();\n this._registry = registry;\n }\n\n protected _loadResponse(request:Request):Promise {\n\n return new externals._Promise((resolve) => {\n\n core.log.debug('API REQUEST', request.method, request.url);\n\n var mock = this._registry.find(request);\n\n resolve(mock.getResponse(request));\n\n });\n\n }\n\n }\n\n}","/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n\nmodule RingCentral.sdk.platform {\n\n export class Auth {\n\n static refreshHandicapMs:number = 60 * 1000; // 1 minute\n static forcedTokenType = 'forced';\n\n protected _cacheId:string;\n protected _cache:core.Cache;\n\n constructor(cache:core.Cache, cacheId:string) {\n\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 data():IAuthData {\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 setData(authData:IAuthData) {\n\n var oldAuthData = this.data();\n\n authData = core.utils.extend({}, oldAuthData, authData);\n\n authData.expire_time = Date.now() + (authData.expires_in * 1000);\n authData.refresh_token_expire_time = Date.now() + (authData.refresh_token_expires_in * 1000);\n\n core.log.info('Auth.setData(): Tokens were updated, new:', authData, ', old:', oldAuthData);\n\n this._cache.setItem(this._cacheId, authData);\n\n return this;\n\n }\n\n /**\n * Check if there is a valid (not expired) access token\n */\n accessTokenValid():boolean {\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 */\n refreshTokenValid():boolean {\n\n return (this.data().refresh_token_expire_time > Date.now());\n\n }\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 {Platform}\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 setRemember(remember?:boolean):Auth {\n\n return this.setData({remember: remember});\n\n }\n\n remember():boolean {\n\n return !!this.data().remember;\n\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 * @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","(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"],"sourceRoot":"/source/"} \ No newline at end of file +{"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":"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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 _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 diff --git a/build/ringcentral.d.ts b/build/ringcentral.d.ts deleted file mode 100644 index 5c8ef807..00000000 --- a/build/ringcentral.d.ts +++ /dev/null @@ -1,518 +0,0 @@ -/// -declare module RingCentral.sdk.core { - class Cache { - private _storage; - private _prefix; - constructor(storage: Storage | any, prefix?: string); - setPrefix(prefix?: string): Cache; - setItem(key: any, data: any): Cache; - removeItem(key: any): Cache; - getItem(key: any): any; - clean(): Cache; - protected _prefixKey(key: any): string; - } -} -declare module RingCentral.sdk.core { - /** - * TODO Fix public vars - */ - class Log { - _console: Console; - logDebug: boolean; - logInfo: boolean; - logWarnings: boolean; - logErrors: boolean; - addTimestamps: boolean; - constructor(console?: Console); - disableAll(): void; - enableAll(): void; - debug(...args: any[]): void; - info(...args: any[]): void; - warn(...args: any[]): void; - error(...args: any[]): void; - stack(): any; - protected _parseArguments(args: any): any; - } - var log: Log; -} -declare module RingCentral.sdk.core.utils { - /** - * Ported from jQuery.fn.extend - * Optional first parameter makes deep copy - */ - function extend(targetObject: any, sourceObject: any, ...args: any[]): any; - function forEach(object: any, cb: any): void; - /** - * TODO Replace with something better - * @see https://github.com/joyent/node/blob/master/lib/querystring.js - * @param {object} parameters - * @returns {string} - */ - function queryStringify(parameters: any): string; - /** - * TODO Replace with something better - * @see https://github.com/joyent/node/blob/master/lib/querystring.js - * @param {string} queryString - * @returns {object} - */ - function parseQueryString(queryString: string): any; - /** - * Returns true if the passed value is valid email address. - * Checks multiple comma separated emails according to RFC 2822 if parameter `multiple` is `true` - */ - function isEmail(v: string, multiple: boolean): boolean; - function isPhoneNumber(v: string): boolean; - /** - * @param args - * @returns {Array} - */ - function argumentsToArray(args: any): any; - function isDate(obj: any): boolean; - function isFunction(obj: any): boolean; - function isArray(obj: any): boolean; - function isWindow(obj: any): boolean; - function isNan(obj: any): boolean; - function type(obj: any): string; - function isPlainObject(obj: any): boolean; - function getProperty(obj: any, property: string): any; - function poll(fn: any, interval?: number, timeout?: any): any; - function stopPolling(timeout: any): void; - function parseString(s: any): string; - function parseNumber(n: any): number; - function isNodeJS(): boolean; - function isBrowser(): boolean; -} -declare module RingCentral.sdk.core { - /** - * @see https://github.com/Microsoft/TypeScript/issues/275 - */ - class Observable> { - private _listeners; - constructor(); - hasListeners(event: any): boolean; - on(events: any, callback: (...args) => any): T; - emit(event: string, ...args: any[]): any; - off(event?: string, callback?: any): T; - destroy(): T; - } -} -declare module RingCentral.sdk.core { - class PageVisibility extends Observable { - events: { - change: string; - }; - protected _visible: boolean; - constructor(); - visible(): boolean; - } -} -declare module RingCentral.sdk.mocks { - class Mock { - protected _method: string; - protected _path: string; - protected _delay: number; - protected _json: any; - protected _status: number; - protected _statusText: string; - constructor(method: string, path: string, json?: any, status?: number, statusText?: string, delay?: number); - path(): string; - method(): string; - test(request: Request): boolean; - getResponse(request: Request): Response | Promise; - createResponse(json?: any, init?: ResponseInit | any): Response; - } -} -declare module RingCentral.sdk.mocks { - class Registry { - protected _mocks: Mock[]; - constructor(); - add(mock: Mock): Registry; - clear(): Registry; - find(request: Request): Mock; - apiCall(method: string, path: string, response: any, status?: number, statusText?: string): Registry; - authentication(): Registry; - logout(): Registry; - presenceLoad(id: any): Registry; - subscribeGeneric(expiresIn?: number): Registry; - subscribeOnPresence(id?: string, detailed?: boolean): Registry; - tokenRefresh(failure?: boolean): Registry; - } -} -declare module RingCentral.sdk.externals { - var _Promise: typeof Promise; - var _fetch: Fetch; - var _Response: typeof Response; - var _Request: typeof Request; - var _Headers: typeof Headers; - var _PUBNUB: PUBNUB; - function get(): typeof externals; -} -declare module RingCentral.sdk.http { - /** - * @TODO Bring back tests - */ - class ApiResponse { - static contentType: string; - static jsonContentType: string; - static multipartContentType: string; - static urlencodedContentType: string; - static headerSeparator: string; - static bodySeparator: string; - static boundarySeparator: string; - protected _json: any; - protected _text: string; - protected _request: Request; - protected _response: Response; - protected _multipartTransactions: ApiResponse[]; - constructor(request?: Request, response?: Response, responseText?: string); - response(): Response; - request(): Request; - ok(): boolean; - text(): string; - json(): any; - error(skipOKCheck?: boolean): string; - multipart(): ApiResponse[]; - /** - * Short-hand method to get only JSON content of responses - */ - multipartJson(): any[]; - protected _isContentType(contentType: string): boolean; - protected _getContentType(): string; - protected _isMultipart(): boolean; - protected _isUrlEncoded(): boolean; - protected _isJson(): boolean; - /** - * Method is used to create Transaction objects from string parts of multipart/mixed response - * @param text - * @param status - * @param statusText - * @return {ApiResponse} - */ - static create(text?: string, status?: number, statusText?: string): ApiResponse; - } -} -declare module RingCentral.sdk.http { - class Client extends core.Observable { - events: { - beforeRequest: string; - requestSuccess: string; - requestError: string; - }; - sendRequest(request: Request): Promise; - protected _loadResponse(request: Request): Promise; - /** - * Wraps the JS Error object with transaction information - * @param {Error} e - * @param {ApiResponse} apiResponse - * @return {IApiError} - */ - static makeError(e: Error, apiResponse?: ApiResponse): IApiError; - /** - * TODO Wait for - * - https://github.com/github/fetch/issues/185 - * - https://github.com/bitinn/node-fetch/issues/34 - * @param {Response} response - * @return {Response} - */ - static cloneResponse(response: Response): Response; - /** - * Creates a response - * @param stringBody - * @param init - * @return {Response} - */ - static createResponse(stringBody?: string, init?: ResponseInit): Response; - static createRequest(input: string | Request, init?: IClientRequestInit): Request; - } - interface IApiError extends Error { - stack?: string; - originalMessage: string; - apiResponse: ApiResponse; - } - interface IClientRequestInit extends RequestInit { - query?: string; - } -} -declare module RingCentral.sdk.platform { - class Queue { - protected _cacheId: string; - protected _pollInterval: number; - protected _releaseTimeout: number; - protected _cache: core.Cache; - protected _promise: Promise; - constructor(cache: core.Cache, cacheId: string); - isPaused(): boolean; - pause(): Queue; - resume(): Queue; - poll(): Promise; - releaseTimeout(): number; - pollInterval(): number; - setReleaseTimeout(releaseTimeout: number): Queue; - setPollInterval(pollInterval: number): Queue; - } -} -declare module RingCentral.sdk.platform { - class Platform extends core.Observable { - protected static _urlPrefix: string; - protected static _apiVersion: string; - protected static _accessTokenTtl: number; - protected static _refreshTokenTtl: number; - protected static _refreshTokenTtlRemember: number; - protected static _tokenEndpoint: string; - protected static _revokeEndpoint: string; - protected static _authorizeEndpoint: string; - protected _server: string; - protected _appKey: string; - protected _appSecret: string; - protected _refreshDelayMs: number; - protected _clearCacheOnRefreshError: boolean; - protected _cacheId: string; - protected _queue: Queue; - protected _cache: core.Cache; - protected _client: http.Client; - protected _auth: Auth; - events: { - accessViolation: string; - logoutSuccess: string; - logoutError: string; - authorizeSuccess: string; - authorizeError: string; - refreshSuccess: string; - refreshError: string; - }; - constructor(client: http.Client, cache: core.Cache, server: string, appKey: string, appSecret: string); - auth(): Auth; - createUrl(path: any, options?: { - addMethod?: string; - addToken?: boolean; - addServer?: boolean; - }): string; - authUrl(options: { - redirectUri: string; - display?: string; - prompt?: string; - state?: string; - brandId?: string | number; - }): string; - parseAuthRedirectUrl(url: string): any; - loggedIn(): Promise; - login(options?: { - username?: string; - password?: string; - extension?: string; - endpointId?: string; - code?: string; - redirectUri?: string; - clientId?: string; - remember?: boolean; - }): Promise; - refresh(): Promise; - /** - * @returns {Promise} - */ - logout(): Promise; - inflateRequest(request: Request, options?: IPlatformOptions): Promise; - sendRequest(request: Request, options?: IPlatformOptions): Promise; - /** - * General purpose function to send anything to server - */ - send(url: string, options?: IPlatformCombinedOptions): Promise; - get(url: string, options?: IPlatformCombinedOptions): Promise; - post(url: string, options: IPlatformCombinedOptions): Promise; - put(url: string, options: IPlatformCombinedOptions): Promise; - 'delete'(url: string, options?: IPlatformCombinedOptions): Promise; - protected _tokenRequest(path: string, body: any): Promise; - protected _ensureAuthentication(): Promise; - protected _isAccessTokenValid(): boolean; - protected _refreshPolling(): Promise; - protected _apiKey(): string; - protected _authHeader(): string; - } - interface IAuthError extends Error { - error?: string; - } - interface IPlatformOptions { - skipAuthCheck?: boolean; - } - interface IPlatformCombinedOptions extends IPlatformOptions, http.IClientRequestInit { - } -} -declare module RingCentral.sdk.subscription { - class Subscription extends core.Observable { - protected _renewHandicapMs: number; - protected _subscription: ISubscription | any; - protected _timeout: any; - protected _eventFilters: string[]; - protected _pubnub: PUBNUBInstance; - protected _platform: platform.Platform; - protected _pubnubFactory: pubnub.PubnubFactory; - events: { - notification: string; - removeSuccess: string; - removeError: string; - renewSuccess: string; - renewError: string; - subscribeSuccess: string; - subscribeError: string; - }; - constructor(pubnubFactory: pubnub.PubnubFactory, platform: platform.Platform); - alive(): any; - setSubscription(subscription: any): Subscription; - subscription(): ISubscription; - /** - * Creates or updates subscription if there is an active one - * @param {{events?:string[]}} [options] New array of events - * @returns {Promise} - */ - register(options?: { - events?: string[]; - }): Promise; - addEvents(events: string[]): Subscription; - setEvents(events: string[]): Subscription; - subscribe(options?: { - events?: string[]; - }): Promise; - renew(options?: { - events?: string[]; - }): Promise; - remove(): Promise; - /** - * Remove subscription and disconnect from PUBNUB - * This method resets subscription at client side but backend is not notified - */ - reset(): Subscription; - destroy(): Subscription; - protected _getFullEventFilters(): string[]; - protected _setTimeout(): Subscription; - protected _clearTimeout(): Subscription; - protected _decrypt(message: any): any; - protected _notify(message: any): Subscription; - protected _subscribeAtPubnub(): Subscription; - } - interface ISubscription { - id?: string; - uri?: string; - eventFilters?: string[]; - expirationTime?: string; - expiresIn?: number; - deliveryMode?: { - transportType?: string; - encryption?: boolean; - address?: string; - subscriberKey?: string; - encryptionKey?: string; - secretKey?: string; - }; - creationTime?: string; - status?: string; - } -} -declare module RingCentral.sdk.pubnub { - class PubnubMock extends core.Observable implements PUBNUBInstance { - private options; - crypto_obj: PUBNUBCryptoObj; - constructor(options: PUBNUBInitOptions); - ready(): void; - subscribe(options: PUBNUBSubscribeOptions): void; - unsubscribe(options: PUBNUBUnsubscribeOptions): void; - receiveMessage(msg: any, channel: any): void; - } - class PubnubMockFactory implements PUBNUB { - crypto_obj: PUBNUBCryptoObj; - constructor(); - init(options: PUBNUBInitOptions): PubnubMock; - } -} -declare module RingCentral.sdk.pubnub { - class PubnubFactory { - private _useMock; - private _mock; - constructor(flag: boolean); - getPubnub(): PUBNUB; - } -} -declare module RingCentral.sdk { - class SDK { - static version: string; - static server: { - sandbox: string; - production: string; - }; - private _platform; - private _cache; - private _queue; - private _client; - private _pubnubFactory; - private _mockRegistry; - constructor(options?: { - server: string; - appKey: string; - appSecret: string; - appName?: string; - appVersion?: string; - cachePrefix?: string; - useHttpMock?: boolean; - usePubnubMock?: boolean; - }); - platform(): platform.Platform; - cache(): core.Cache; - createSubscription(): subscription.Subscription; - createPageVisibility(): core.PageVisibility; - createObservable(): core.Observable>; - log(): core.Log; - utils(): typeof core.utils; - mockRegistry(): mocks.Registry; - } -} -declare var e: typeof RingCentral.sdk.externals; -declare module RingCentral.sdk.http { - class ClientMock extends Client { - private _registry; - constructor(registry: mocks.Registry); - protected _loadResponse(request: Request): Promise; - } -} -declare module RingCentral.sdk.platform { - class Auth { - static refreshHandicapMs: number; - static forcedTokenType: string; - protected _cacheId: string; - protected _cache: core.Cache; - constructor(cache: core.Cache, cacheId: string); - accessToken(): string; - refreshToken(): string; - tokenType(): string; - data(): IAuthData; - setData(authData: IAuthData): Auth; - /** - * Check if there is a valid (not expired) access token - */ - accessTokenValid(): boolean; - /** - * Check if there is a valid (not expired) access token - */ - refreshTokenValid(): boolean; - cancelAccessToken(): Auth; - /** - * This method sets a special authentication mode used in Service Web - * @return {Platform} - */ - forceAuthentication(): Auth; - setRemember(remember?: boolean): Auth; - remember(): boolean; - } - interface IAuthData { - remember?: boolean; - token_type?: string; - access_token?: string; - expires_in?: number; - expire_time?: number; - refresh_token?: string; - refresh_token_expires_in?: number; - refresh_token_expire_time?: number; - scope?: string; - } -} -declare module "ringcentral" { - export = RingCentral; -} \ No newline at end of file diff --git a/build/ringcentral.js b/build/ringcentral.js index 420732d9..a3c3f862 100644 --- a/build/ringcentral.js +++ b/build/ringcentral.js @@ -1,1899 +1,3750 @@ -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var core; - (function (core) { - var Cache = (function () { - function Cache(storage, prefix) { - this.setPrefix(prefix); - this._storage = storage; - } - Cache.prototype.setPrefix = function (prefix) { - this._prefix = prefix || 'rc-'; - return this; - }; - Cache.prototype.setItem = function (key, data) { - this._storage[this._prefixKey(key)] = JSON.stringify(data); - return this; - }; - Cache.prototype.removeItem = function (key) { - delete this._storage[this._prefixKey(key)]; - return this; - }; - Cache.prototype.getItem = function (key) { - var item = this._storage[this._prefixKey(key)]; - if (!item) - return null; - return JSON.parse(item); - }; - Cache.prototype.clean = function () { - for (var key in this._storage) { - if (!this._storage.hasOwnProperty(key)) - continue; - if (key.indexOf(this._prefix) === 0) { - delete this._storage[key]; - } - } - return this; - }; - Cache.prototype._prefixKey = function (key) { - return this._prefix + key; - }; - return Cache; - })(); - core.Cache = Cache; - })(core = sdk.core || (sdk.core = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var core; - (function (core) { - /** - * TODO Fix public vars - */ - var Log = (function () { - function Log(console) { - if (!console) { - console = { - log: function () { }, - warn: function () { }, - info: function () { }, - error: function () { } - }; - } - this._console = console; - this.logDebug = false; - this.logInfo = false; - this.logWarnings = false; - this.logErrors = false; - this.addTimestamps = false; - } - Log.prototype.disableAll = function () { - this.logDebug = false; - this.logInfo = false; - this.logWarnings = false; - this.logErrors = false; - }; - Log.prototype.enableAll = function () { - this.logDebug = true; - this.logInfo = true; - this.logWarnings = true; - this.logErrors = true; - }; - Log.prototype.debug = function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i - 0] = arguments[_i]; - } - if (this.logDebug) - this._console.log.apply(this._console, this._parseArguments(arguments)); - }; - Log.prototype.info = function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i - 0] = arguments[_i]; - } - if (this.logInfo) - this._console.info.apply(this._console, this._parseArguments(arguments)); - }; - Log.prototype.warn = function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i - 0] = arguments[_i]; - } - if (this.logWarnings) - this._console.warn.apply(this._console, this._parseArguments(arguments)); - }; - Log.prototype.error = function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i - 0] = arguments[_i]; - } - if (this.logErrors) - this._console.error.apply(this._console, this._parseArguments(arguments)); - }; - Log.prototype.stack = function () { - var e = new Error(); - if (e.hasOwnProperty('stack')) { - return e.stack.replace('Error\n', 'Stack Trace\n'); - } - }; - Log.prototype._parseArguments = function (args) { - args = core.utils.argumentsToArray(args); - if (this.addTimestamps) - args.unshift(new Date().toLocaleString(), '-'); - return args; - }; - return Log; - })(); - core.Log = Log; - core.log = new Log(); - })(core = sdk.core || (sdk.core = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var core; - (function (core) { - var utils; - (function (utils) { - var hasOwn = Object.prototype.hasOwnProperty, toString = Object.prototype.toString, rdigit = /\d/, class2type = {}; - // Populate the class2type map - 'Boolean Number String Function Array Date RegExp Object'.split(' ').forEach(function (name) { - class2type["[object " + name + "]"] = name.toLowerCase(); +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(require("es6-promise"), require("node-fetch"), require("pubnub")); + else if(typeof define === 'function' && define.amd) + define([, , "pubnub"], factory); + else if(typeof exports === 'object') + exports["SDK"] = factory(require("es6-promise"), require("node-fetch"), require("pubnub")); + else + root["RingCentral"] = root["RingCentral"] || {}, root["RingCentral"]["SDK"] = factory(root[undefined], root[undefined], root[undefined]); +})(this, function(__WEBPACK_EXTERNAL_MODULE_4__, __WEBPACK_EXTERNAL_MODULE_5__, __WEBPACK_EXTERNAL_MODULE_6__) { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; +/******/ +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.loaded = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = "/build/"; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(1); + + +/***/ }, +/* 1 */ +/***/ 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 _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; } } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + +var _coreUtils = __webpack_require__(2); + +var Utils = _interopRequireWildcard(_coreUtils); + +var _coreCache = __webpack_require__(7); + +var _coreCache2 = _interopRequireDefault(_coreCache); + +var _coreExternals = __webpack_require__(3); + +var Externals = _interopRequireWildcard(_coreExternals); + +var _coreObservable = __webpack_require__(8); + +var _coreObservable2 = _interopRequireDefault(_coreObservable); + +var _httpClient = __webpack_require__(9); + +var _httpClient2 = _interopRequireDefault(_httpClient); + +var _httpApiResponse = __webpack_require__(11); + +var _httpApiResponse2 = _interopRequireDefault(_httpApiResponse); + +var _httpUtils = __webpack_require__(10); + +var HttpUtils = _interopRequireWildcard(_httpUtils); + +var _mocksClientMock = __webpack_require__(12); + +var _mocksClientMock2 = _interopRequireDefault(_mocksClientMock); + +var _mocksMock = __webpack_require__(14); + +var _mocksMock2 = _interopRequireDefault(_mocksMock); + +var _mocksRegistry = __webpack_require__(13); + +var _mocksRegistry2 = _interopRequireDefault(_mocksRegistry); + +var _platformPlatform = __webpack_require__(15); + +var _platformPlatform2 = _interopRequireDefault(_platformPlatform); + +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); + +var _subscriptionSubscription = __webpack_require__(20); + +var _subscriptionSubscription2 = _interopRequireDefault(_subscriptionSubscription); + +__webpack_require__(21); + +var SDK = (function () { + _createClass(SDK, null, [{ + key: 'version', + value: '2.0.0', + enumerable: true + }, { + key: 'server', + value: { + sandbox: 'https://platform.devtest.ringcentral.com', + production: 'https://platform.ringcentral.com' + }, + + /** + * @constructor + * @param {object} [options] + * @param {string} [options.server] + * @param {string} [options.cachePrefix] + * @param {string} [options.appSecret] + * @param {string} [options.appKey] + * @param {string} [options.appName] + * @param {string} [options.appVersion] + * @param {string} [options.pubnubFactory] + * @param {string} [options.client] + */ + enumerable: true + }]); + + function SDK(options) { + _classCallCheck(this, SDK); + + options = options || {}; + + this._cache = new _coreCache2['default'](Externals.localStorage, options.cachePrefix); + + this._client = options.client || new _httpClient2['default'](); + + this._platform = new _platformPlatform2['default'](this._client, this._cache, options.server, options.appKey, options.appSecret); + + this._pubnubFactory = options.pubnubFactory || Externals.PUBNUB; + } + + /** + * @return {Platform} + */ + + SDK.prototype.platform = function platform() { + return this._platform; + }; + + /** + * @return {Subscription} + */ + + SDK.prototype.createSubscription = function createSubscription() { + return new _subscriptionSubscription2['default'](this._pubnubFactory, this._platform, this._cache); + }; + + /** + * @return {Cache} + */ + + SDK.prototype.cache = function cache() { + return this._cache; + }; + + _createClass(SDK, null, [{ + key: 'core', + value: { + Cache: _coreCache2['default'], + Observable: _coreObservable2['default'], + Utils: Utils, + Externals: Externals + }, + enumerable: true + }, { + key: 'http', + value: { + Client: _httpClient2['default'], + ApiResponse: _httpApiResponse2['default'], + Utils: HttpUtils + }, + enumerable: true + }, { + key: 'platform', + value: { + Auth: _platformAuth2['default'], + Platform: _platformPlatform2['default'], + Queue: _platformQueue2['default'] + }, + enumerable: true + }, { + key: 'subscription', + value: { + Subscription: _subscriptionSubscription2['default'] + }, + enumerable: true + }, { + key: 'mocks', + value: { + Client: _mocksClientMock2['default'], + Registry: _mocksRegistry2['default'], + Mock: _mocksMock2['default'] + }, + enumerable: true + }, { + key: 'pubnub', + value: { + PubnubMockFactory: _pubnubPubnubFactory2['default'] + }, + enumerable: true + }]); + + return SDK; +})(); + +exports['default'] = SDK; +module.exports = exports['default']; + +/***/ }, +/* 2 */ +/***/ function(module, exports, __webpack_require__) { + +'use strict'; + +exports.__esModule = true; +exports.queryStringify = queryStringify; +exports.parseQueryString = parseQueryString; +exports.isFunction = isFunction; +exports.isArray = isArray; +exports.poll = poll; +exports.stopPolling = stopPolling; +exports.isNodeJS = isNodeJS; +exports.isBrowser = isBrowser; +exports.delay = delay; + +var _ExternalsJs = __webpack_require__(3); + +/** + * TODO Replace with something better + * @see https://github.com/joyent/node/blob/master/lib/querystring.js + * @param {object} parameters + * @returns {string} + */ + +function queryStringify(parameters) { + + var array = []; + + parameters = parameters || {}; + + Object.keys(parameters).forEach(function (k) { + + var v = parameters[k]; + + if (isArray(v)) { + v.forEach(function (vv) { + array.push(encodeURIComponent(k) + '=' + encodeURIComponent(vv)); + }); + } else { + array.push(encodeURIComponent(k) + '=' + encodeURIComponent(v)); + } + }); + + return array.join('&'); +} + +/** + * TODO Replace with something better + * @see https://github.com/joyent/node/blob/master/lib/querystring.js + * @param {string} queryString + * @returns {object} + */ + +function parseQueryString(queryString) { + + var argsParsed = {}; + + queryString.split('&').forEach(function (arg) { + + arg = decodeURIComponent(arg); + + if (arg.indexOf('=') == -1) { + + argsParsed[arg.trim()] = true; + } else { + + var pair = arg.split('='), + key = pair[0].trim(), + value = pair[1].trim(); + + if (key in argsParsed) { + if (key in argsParsed && !isArray(argsParsed[key])) argsParsed[key] = [argsParsed[key]]; + argsParsed[key].push(value); + } else { + argsParsed[key] = value; + } + } + }); + + return argsParsed; +} + +/** + * @param obj + * @return {boolean} + */ + +function isFunction(obj) { + return typeof obj === "function"; +} + +/** + * @param obj + * @return {boolean} + */ + +function isArray(obj) { + return Array.isArray ? Array.isArray(obj) : typeof obj === "array"; +} + +/** + * @param fn + * @param interval + * @param timeout + */ + +function poll(fn, interval, timeout) { + //NodeJS.Timer|number + + module.exports.stopPolling(timeout); + + interval = interval || 1000; + + var next = function next(delay) { + + delay = delay || interval; + + interval = delay; + + return setTimeout(function () { + + fn(next, delay); + }, delay); + }; + + return next(); +} + +function stopPolling(timeout) { + if (timeout) clearTimeout(timeout); +} + +function isNodeJS() { + return typeof process !== 'undefined'; +} + +function isBrowser() { + return typeof window !== 'undefined'; +} + +function delay(timeout) { + return new _ExternalsJs.Promise(function (resolve, reject) { + setTimeout(function () { + resolve(null); + }, timeout); + }); +} + +/***/ }, +/* 3 */ +/***/ function(module, exports, __webpack_require__) { + +'use strict'; + +exports.__esModule = true; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _es6Promise = __webpack_require__(4); + +var _es6Promise2 = _interopRequireDefault(_es6Promise); + +var _nodeFetch = __webpack_require__(5); + +var _nodeFetch2 = _interopRequireDefault(_nodeFetch); + +var _pubnub = __webpack_require__(6); + +var _pubnub2 = _interopRequireDefault(_pubnub); + +var Promise = _es6Promise2['default'] && _es6Promise2['default'].Promise || window.Promise; + +exports.Promise = Promise; +var fetch = _nodeFetch2['default'] || window.fetch; +exports.fetch = fetch; +var Request = fetch.Request || window.Request; +exports.Request = Request; +var Response = fetch.Response || window.Response; +exports.Response = Response; +var Headers = fetch.Headers || window.Headers; + +exports.Headers = Headers; +var PUBNUB = _pubnub2['default'] || window.PUBNUB; + +exports.PUBNUB = PUBNUB; +var localStorage = typeof window !== 'undefined' && typeof window.localStorage !== 'undefined' ? window.localStorage : {}; +exports.localStorage = localStorage; + +/***/ }, +/* 4 */ +/***/ function(module, exports) { + +module.exports = __WEBPACK_EXTERNAL_MODULE_4__; + +/***/ }, +/* 5 */ +/***/ function(module, exports) { + +module.exports = __WEBPACK_EXTERNAL_MODULE_5__; + +/***/ }, +/* 6 */ +/***/ function(module, exports) { + +module.exports = __WEBPACK_EXTERNAL_MODULE_6__; + +/***/ }, +/* 7 */ +/***/ function(module, exports) { + +'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 Cache = (function () { + _createClass(Cache, null, [{ + key: 'defaultPrefix', + value: 'rc-', + enumerable: true + }]); + + function Cache(storage, prefix) { + _classCallCheck(this, Cache); + + this.setPrefix(prefix); + this._storage = storage; + } + + Cache.prototype.setPrefix = function setPrefix(prefix) { + this._prefix = prefix || Cache.defaultPrefix; + return this; + }; + + Cache.prototype.setItem = function setItem(key, data) { + this._storage[this._prefixKey(key)] = JSON.stringify(data); + return this; + }; + + Cache.prototype.removeItem = function removeItem(key) { + delete this._storage[this._prefixKey(key)]; + return this; + }; + + Cache.prototype.getItem = function getItem(key) { + var item = this._storage[this._prefixKey(key)]; + if (!item) return null; + return JSON.parse(item); + }; + + Cache.prototype.clean = function clean() { + + for (var key in this._storage) { + + if (!this._storage.hasOwnProperty(key)) continue; + + if (key.indexOf(this._prefix) === 0) { + delete this._storage[key]; + } + } + + return this; + }; + + Cache.prototype._prefixKey = function _prefixKey(key) { + return this._prefix + key; + }; + + return Cache; +})(); + +exports['default'] = Cache; +module.exports = exports['default']; + +/***/ }, +/* 8 */ +/***/ function(module, exports) { + +'use strict'; + +exports.__esModule = true; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + +var Observable = (function () { + function Observable() { + _classCallCheck(this, Observable); + + this.off(); + } + + Observable.prototype.hasListeners = function hasListeners(event) { + return event in this._listeners; + }; + + Observable.prototype.on = function on(events, callback) { + var _this = this; + + if (typeof events == 'string') events = [events]; + if (!events) throw new Error('No events to subscribe to'); + if (typeof callback !== 'function') throw new Error('Callback must be a function'); + + events.forEach(function (event) { + + if (!_this.hasListeners(event)) _this._listeners[event] = []; + + _this._listeners[event].push(callback); + }); + + return this; + }; + + Observable.prototype.emit = function emit(event) { + var _this2 = this; + + for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + var result = null; + + if (!this.hasListeners(event)) return null; + + this._listeners[event].some(function (callback) { + + result = callback.apply(_this2, args); + return result === false; + }); + + return result; + }; + + Observable.prototype.off = function off(event, callback) { + var _this3 = this; + + if (!event) { + + this._listeners = {}; + } else { + + if (!callback) { + + delete this._listeners[event]; + } else { + + if (!this.hasListeners(event)) return this; + + this._listeners[event].forEach(function (cb, i) { + + if (cb === callback) delete _this3._listeners[event][i]; }); - /** - * Ported from jQuery.fn.extend - * Optional first parameter makes deep copy - */ - function extend(targetObject, sourceObject) { - var args = []; - for (var _i = 2; _i < arguments.length; _i++) { - args[_i - 2] = arguments[_i]; - } - var options, name, src, copy, copyIsArray, clone, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false; - // Handle a deep copy situation - if (typeof target === "boolean") { - deep = target; - // skip the boolean and the target - target = arguments[i] || {}; - i++; - } - // Handle case when target is a string or something (possible in deep copy) - if (typeof target !== "object" && !isFunction(target)) { - target = {}; - } - for (; i < length; i++) { - // Only deal with non-null/undefined values - if ((options = arguments[i]) !== null) { - // Extend the base object - for (name in options) { - src = target[name]; - copy = options[name]; - // Prevent never-ending loop - if (target === copy) { - continue; - } - // Recurse if we're merging plain objects or arrays - if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) { - if (copyIsArray) { - copyIsArray = false; - clone = src && isArray(src) ? src : []; - } - else { - clone = src && isPlainObject(src) ? src : {}; - } - // Never move original objects, clone them - target[name] = extend(deep, clone, copy); - } - else if (copy !== undefined) { - target[name] = copy; - } - } - } - } - // Return the modified object - return target; - } - utils.extend = extend; - function forEach(object, cb) { - for (var i in object) { - if (!object.hasOwnProperty(i)) - continue; - var res = cb(object[i], i); - if (res === false) - break; + } + } + + return this; + }; + + return Observable; +})(); + +exports['default'] = Observable; +module.exports = exports['default']; + +/***/ }, +/* 9 */ +/***/ 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'); } } + +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 _coreExternals = __webpack_require__(3); + +var _coreUtils = __webpack_require__(2); + +var _Utils = __webpack_require__(10); + +var _coreObservable = __webpack_require__(8); + +var _coreObservable2 = _interopRequireDefault(_coreObservable); + +var _ApiResponse = __webpack_require__(11); + +var _ApiResponse2 = _interopRequireDefault(_ApiResponse); + +var Client = (function (_Observable) { + _inherits(Client, _Observable); + + function Client() { + _classCallCheck(this, Client); + + _Observable.apply(this, arguments); + + this.events = { + beforeRequest: 'beforeRequest', + requestSuccess: 'requestSuccess', + requestError: 'requestError' + }; + } + + /** + * @name IApiError + * @property {string} stack + * @property {string} originalMessage + * @property {ApiResponse} apiResponse + */ + + /** + * @param {Request} request + * @return {Promise} + */ + + Client.prototype.sendRequest = function sendRequest(request) { + var apiResponse; + return regeneratorRuntime.async(function sendRequest$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + apiResponse = new _ApiResponse2['default'](request); + context$2$0.prev = 1; + + //TODO Stop request if listeners return false + this.emit(this.events.beforeRequest, apiResponse); + + context$2$0.next = 5; + return regeneratorRuntime.awrap(this._loadResponse(request)); + + case 5: + apiResponse._response = context$2$0.sent; + + if (!(apiResponse._isMultipart() || apiResponse._isJson())) { + context$2$0.next = 10; + break; } - } - utils.forEach = forEach; - /** - * TODO Replace with something better - * @see https://github.com/joyent/node/blob/master/lib/querystring.js - * @param {object} parameters - * @returns {string} - */ - function queryStringify(parameters) { - var array = []; - forEach(parameters, function (v, i) { - if (isArray(v)) { - v.forEach(function (vv) { - array.push(encodeURIComponent(i) + '=' + encodeURIComponent(vv)); - }); - } - else { - array.push(encodeURIComponent(i) + '=' + encodeURIComponent(v)); - } - }); - return array.join('&'); - } - utils.queryStringify = queryStringify; - /** - * TODO Replace with something better - * @see https://github.com/joyent/node/blob/master/lib/querystring.js - * @param {string} queryString - * @returns {object} - */ - function parseQueryString(queryString) { - var argsParsed = {}, self = this; - queryString.split('&').forEach(function (arg) { - arg = decodeURIComponent(arg); - if (arg.indexOf('=') == -1) { - argsParsed[arg.trim()] = true; - } - else { - var pair = arg.split('='), key = pair[0].trim(), value = pair[1].trim(); - if (key in argsParsed) { - if (key in argsParsed && !self.isArray(argsParsed[key])) - argsParsed[key] = [argsParsed[key]]; - argsParsed[key].push(value); - } - else { - argsParsed[key] = value; - } - } - }); - return argsParsed; - } - utils.parseQueryString = parseQueryString; - /** - * Returns true if the passed value is valid email address. - * Checks multiple comma separated emails according to RFC 2822 if parameter `multiple` is `true` - */ - function isEmail(v, multiple) { - if (!!multiple) { - //this Regexp is also suitable for multiple emails (comma separated) - return /^(?:[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?[ ,;]*)+$/i.test(v); + + context$2$0.next = 9; + return regeneratorRuntime.awrap(apiResponse.response().text()); + + case 9: + apiResponse._text = context$2$0.sent; + + case 10: + if (apiResponse.ok()) { + context$2$0.next = 12; + break; } - else { - return /^[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i.test(v); + + throw new Error('Response has unsuccessful status'); + + case 12: + + this.emit(this.events.requestSuccess, apiResponse); + + return context$2$0.abrupt('return', apiResponse); + + case 16: + context$2$0.prev = 16; + context$2$0.t0 = context$2$0['catch'](1); + + if (!context$2$0.t0.apiResponse) context$2$0.t0 = this.makeError(context$2$0.t0, apiResponse); + + this.emit(this.events.requestError, context$2$0.t0); + + throw context$2$0.t0; + + case 21: + case 'end': + return context$2$0.stop(); + } + }, null, this, [[1, 16]]); + }; + + /** + * @param {Request} request + * @return {Promise} + * @private + */ + + Client.prototype._loadResponse = function _loadResponse(request) { + return regeneratorRuntime.async(function _loadResponse$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + context$2$0.next = 2; + return regeneratorRuntime.awrap(_coreExternals.fetch.call(null, request)); + + case 2: + return context$2$0.abrupt('return', context$2$0.sent); + + case 3: + case 'end': + return context$2$0.stop(); + } + }, null, this); + }; + + /** + * Wraps the JS Error object with transaction information + * @param {Error|IApiError} e + * @param {ApiResponse} apiResponse + * @return {IApiError} + */ + + Client.prototype.makeError = function makeError(e, apiResponse) { + + // Wrap only if regular error + if (!e.hasOwnProperty('apiResponse') && !e.hasOwnProperty('originalMessage')) { + + e.apiResponse = apiResponse; + e.originalMessage = e.message; + e.message = apiResponse && apiResponse.error(true) || e.originalMessage; + } + + return e; + }; + + /** + * + * @param {object} init + * @param {object} [init.url] + * @param {object} [init.body] + * @param {string} [init.method] + * @param {object} [init.query] + * @param {object} [init.headers] + * @return {Request} + */ + + Client.prototype.createRequest = function createRequest(init) { + + init = init || {}; + init.headers = init.headers || {}; + + // Sanity checks + if (!init.url) throw new Error('Url is not defined'); + if (!init.method) init.method = 'GET'; + if (init.method && Client._allowedMethods.indexOf(init.method) < 0) throw new Error('Method has wrong value: ' + init.method); + + // Defaults + init.credentials = init.credentials || 'include'; + init.mode = init.mode || 'cors'; + + // Append Query String + if (init.query) { + init.url = init.url + (init.url.indexOf('?') > -1 ? '&' : '?') + _coreUtils.queryStringify(init.query); + } + + if (!_Utils.findHeaderName('Accept', init.headers)) { + init.headers['Accept'] = _ApiResponse2['default']._jsonContentType; + } + + // Serialize body + //TODO Check that body is a plain object + if (typeof init.body !== 'string' || !init.body) { + + var contentTypeHeaderName = _Utils.findHeaderName(_ApiResponse2['default']._contentType, init.headers); + + if (!contentTypeHeaderName) { + contentTypeHeaderName = _ApiResponse2['default']._contentType; + init.headers[contentTypeHeaderName] = _ApiResponse2['default']._jsonContentType; + } + + var contentType = init.headers[contentTypeHeaderName]; + + // Assign a new encoded body + if (contentType.indexOf(_ApiResponse2['default']._jsonContentType) > -1) { + init.body = JSON.stringify(init.body); + } else if (contentType.indexOf(_ApiResponse2['default']._urlencodedContentType) > -1) { + init.body = _coreUtils.queryStringify(init.body); + } + } + + // Create a request with encoded body + var req = new _coreExternals.Request(init.url, init); + + // Keep the original body accessible directly (for mocks) + req.originalBody = init.body; + + return req; + }; + + _createClass(Client, null, [{ + key: '_allowedMethods', + value: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'], + enumerable: true + }]); + + return Client; +})(_coreObservable2['default']); + +exports['default'] = Client; +module.exports = exports['default']; + +/***/ }, +/* 10 */ +/***/ function(module, exports, __webpack_require__) { + +'use strict'; + +exports.__esModule = true; +exports.createResponse = createResponse; +exports.findHeaderName = findHeaderName; + +function _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; } } + +var _coreExternals = __webpack_require__(3); + +var _coreUtils = __webpack_require__(2); + +var utils = _interopRequireWildcard(_coreUtils); + +/** + * Creates a response + * @param stringBody + * @param init + * @return {Response} + */ + +function createResponse(stringBody, init) { + + init = init || {}; + + var response = new _coreExternals.Response(stringBody, init); + + //TODO Wait for https://github.com/bitinn/node-fetch/issues/38 + if (utils.isNodeJS()) { + + response._text = stringBody; + response._decode = function () { + return this._text; + }; + } + + return response; +} + +function findHeaderName(name, headers) { + name = name.toLowerCase(); + return Object.keys(headers).reduce(function (res, key) { + if (res) return res; + if (name == key.toLowerCase()) return key; + return res; + }, null); +} + +/***/ }, +/* 11 */ +/***/ 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 _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; } } + +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__(10); + +var utils = _interopRequireWildcard(_Utils); + +var ApiResponse = (function () { + _createClass(ApiResponse, null, [{ + key: '_contentType', + value: 'Content-Type', + enumerable: true + }, { + key: '_jsonContentType', + value: 'application/json', + enumerable: true + }, { + key: '_multipartContentType', + value: 'multipart/mixed', + enumerable: true + }, { + key: '_urlencodedContentType', + value: 'application/x-www-form-urlencoded', + enumerable: true + }, { + key: '_headerSeparator', + value: ':', + enumerable: true + }, { + key: '_bodySeparator', + value: '\n\n', + enumerable: true + }, { + key: '_boundarySeparator', + value: '--', + + /** + * @param {Request} request + * @param {Response} response + * @param {string} responseText + */ + enumerable: true + }]); + + function ApiResponse(request, response, responseText) { + _classCallCheck(this, ApiResponse); + + /** @type {Request} */ + this._request = request; + + /** @type {Response} */ + this._response = response; + + this._text = responseText; + this._json = null; + this._multipart = []; + } + + /** + * @return {Response} + */ + + ApiResponse.prototype.response = function response() { + return this._response; + }; + + /** + * @return {Request} + */ + + ApiResponse.prototype.request = function request() { + return this._request; + }; + + /** + * @return {boolean} + */ + + ApiResponse.prototype.ok = function ok() { + return this._response && this._response.ok; + }; + + /** + * @return {string} + */ + + ApiResponse.prototype.text = function text() { + if (!this._isJson() && !this._isMultipart()) throw new Error('Response is not text'); + return this._text; + }; + + /** + * @return {object} + */ + + ApiResponse.prototype.json = function json() { + if (!this._isJson()) throw new Error('Response is not JSON'); + if (!this._json) { + this._json = this._text ? JSON.parse(this._text) : null; + } + return this._json; + }; + + /** + * @param [skipOKCheck] + * @return {string} + */ + + ApiResponse.prototype.error = function error(skipOKCheck) { + + if (this.ok() && !skipOKCheck) return null; + + var message = (this._response && this._response.status ? this._response.status + ' ' : '') + (this._response && this._response.statusText ? this._response.statusText : ''); + + try { + + if (this.json().message) message = this.json().message; + if (this.json().error_description) message = this.json().error_description; + if (this.json().description) message = this.json().description; + } catch (e) {} + + return message; + }; + + /** + * @return {ApiResponse[]} + */ + + ApiResponse.prototype.multipart = function multipart() { + + if (!this._isMultipart()) throw new Error('Response is not multipart'); + + if (!this._multipart.length) { + + // Step 1. Split multipart response + + var text = this.text(); + + if (!text) throw new Error('No response body'); + + var boundary = this._getContentType().match(/boundary=([^;]+)/i)[1]; + + if (!boundary) throw new Error('Cannot find boundary'); + + var parts = text.toString().split(ApiResponse._boundarySeparator + boundary); + + if (parts[0].trim() === '') parts.shift(); + if (parts[parts.length - 1].trim() == ApiResponse._boundarySeparator) parts.pop(); + + if (parts.length < 1) throw new Error('No parts in body'); + + // Step 2. Parse status info + + var statusInfo = ApiResponse.create(parts.shift(), this._response.status, this._response.statusText).json(); + + // Step 3. Parse all other parts + + this._multipart = parts.map(function (part, i) { + + var status = statusInfo.response[i].status; + + return ApiResponse.create(part, status); + }); + } + + return this._multipart; + }; + + ApiResponse.prototype._isContentType = function _isContentType(contentType) { + return this._getContentType().indexOf(contentType) > -1; + }; + + ApiResponse.prototype._getContentType = function _getContentType() { + return this._response.headers.get(ApiResponse._contentType) || ''; + }; + + ApiResponse.prototype._isMultipart = function _isMultipart() { + return this._isContentType(ApiResponse._multipartContentType); + }; + + ApiResponse.prototype._isUrlEncoded = function _isUrlEncoded() { + return this._isContentType(ApiResponse._urlencodedContentType); + }; + + ApiResponse.prototype._isJson = function _isJson() { + return this._isContentType(ApiResponse._jsonContentType); + }; + + /** + * Method is used to create ApiResponse object from string parts of multipart/mixed response + * @param {string} [text] + * @param {number} [status] + * @param {string} [statusText] + * @return {ApiResponse} + */ + + ApiResponse.create = function create(text, status, statusText) { + + text = text || ''; + status = status || 200; + statusText = statusText || 'OK'; + + text = text.replace(/\r/g, ''); + + var headers = new _coreExternals.Headers(), + headersAndBody = text.split(ApiResponse._bodySeparator), + headersText = headersAndBody.length > 1 ? headersAndBody.shift() : ''; + + text = headersAndBody.join(ApiResponse._bodySeparator); + + (headersText || '').split('\n').forEach(function (header) { + + var split = header.trim().split(ApiResponse._headerSeparator), + key = split.shift().trim(), + value = split.join(ApiResponse._headerSeparator).trim(); + + if (key) headers.append(key, value); + }); + + return new ApiResponse(null, utils.createResponse(text, { + headers: headers, + status: status, + statusText: statusText + }), text); + }; + + return ApiResponse; +})(); + +exports['default'] = ApiResponse; +module.exports = exports['default']; + +/***/ }, +/* 12 */ +/***/ function(module, exports, __webpack_require__) { + +'use strict'; + +exports.__esModule = true; + +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 _Registry = __webpack_require__(13); + +var _Registry2 = _interopRequireDefault(_Registry); + +var _httpClient = __webpack_require__(9); + +var _httpClient2 = _interopRequireDefault(_httpClient); + +var Client = (function (_HttpClient) { + _inherits(Client, _HttpClient); + + function Client() { + _classCallCheck(this, Client); + + _HttpClient.call(this); + this._registry = new _Registry2['default'](); + } + + Client.prototype.registry = function registry() { + return this._registry; + }; + + Client.prototype._loadResponse = function _loadResponse(request) { + var mock; + return regeneratorRuntime.async(function _loadResponse$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + mock = this._registry.find(request); + context$2$0.next = 3; + return regeneratorRuntime.awrap(mock.getResponse(request)); + + case 3: + return context$2$0.abrupt('return', context$2$0.sent); + + case 4: + case 'end': + return context$2$0.stop(); + } + }, null, this); + }; + + return Client; +})(_httpClient2['default']); + +exports['default'] = Client; +module.exports = exports['default']; + +/***/ }, +/* 13 */ +/***/ function(module, exports, __webpack_require__) { + +'use strict'; + +exports.__esModule = true; + +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'); } } + +var _Mock = __webpack_require__(14); + +var _Mock2 = _interopRequireDefault(_Mock); + +var Registry = (function () { + function Registry() { + _classCallCheck(this, Registry); + + this._mocks = []; + } + + Registry.prototype.add = function add(mock) { + this._mocks.push(mock); + return this; + }; + + Registry.prototype.clear = function clear() { + this._mocks = []; + return this; + }; + + Registry.prototype.find = function find(request) { + + //console.log('Registry is looking for', request); + + var mock = this._mocks.shift(); + + if (!mock) throw new Error('No mock in registry for request ' + request.method + ' ' + request.url); + + if (!mock.test(request)) throw new Error('Wrong request ' + request.method + ' ' + request.url + ' for expected mock ' + mock.method() + ' ' + mock.path()); + + return mock; + }; + + Registry.prototype.apiCall = function apiCall(method, path, response, status, statusText) { + + this.add(new _Mock2['default'](method, path, response, status, statusText)); + + return this; + }; + + Registry.prototype.authentication = function authentication() { + + 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() + 3600000 + }); + + return this; + }; + + Registry.prototype.logout = function logout() { + + this.apiCall('POST', '/restapi/oauth/revoke', {}); + + return this; + }; + + Registry.prototype.presenceLoad = function presenceLoad(id) { + + this.apiCall('GET', '/restapi/v1.0/account/~/extension/' + id + '/presence', { + "uri": "https://platform.ringcentral.com/restapi/v1.0/account/123/extension/" + id + "/presence", + "extension": { + "uri": "https://platform.ringcentral.com/restapi/v1.0/account/123/extension/" + id, + "id": id, + "extensionNumber": "101" + }, + "activeCalls": [], + "presenceStatus": "Available", + "telephonyStatus": "Ringing", + "userStatus": "Available", + "dndStatus": "TakeAllCalls", + "extensionId": id + }); + + return this; + }; + + Registry.prototype.subscribeGeneric = function subscribeGeneric(expiresIn) { + + expiresIn = expiresIn || 15 * 60 * 60; + + var date = new Date(); + + this.apiCall('POST', '/restapi/v1.0/subscription', { + 'eventFilters': ['/restapi/v1.0/account/~/extension/~/presence'], + 'expirationTime': new Date(date.getTime() + expiresIn * 1000).toISOString(), + 'expiresIn': expiresIn, + 'deliveryMode': { + 'transportType': 'PubNub', + 'encryption': false, + 'address': '123_foo', + 'subscriberKey': 'sub-c-foo', + 'secretKey': 'sec-c-bar' + }, + 'id': 'foo-bar-baz', + 'creationTime': date.toISOString(), + 'status': 'Active', + 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz' + }); + + return this; + }; + + Registry.prototype.subscribeOnPresence = function subscribeOnPresence(id, detailed) { + + id = id || '1'; + + var date = new Date(); + + this.apiCall('POST', '/restapi/v1.0/subscription', { + 'eventFilters': ['/restapi/v1.0/account/~/extension/' + id + '/presence' + (detailed ? '?detailedTelephonyState=true' : '')], + 'expirationTime': new Date(date.getTime() + 15 * 60 * 60 * 1000).toISOString(), + 'deliveryMode': { + 'transportType': 'PubNub', + 'encryption': true, + 'address': '123_foo', + 'subscriberKey': 'sub-c-foo', + 'secretKey': 'sec-c-bar', + 'encryptionAlgorithm': 'AES', + 'encryptionKey': 'VQwb6EVNcQPBhE/JgFZ2zw==' + }, + 'creationTime': date.toISOString(), + 'id': 'foo-bar-baz', + 'status': 'Active', + 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz' + }); + + return this; + }; + + Registry.prototype.tokenRefresh = function tokenRefresh(failure) { + + if (!failure) { + + 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' + }); + } else { + + this.apiCall('POST', '/restapi/oauth/token', { + 'message': 'Wrong token', + 'error_description': 'Wrong token', + 'description': 'Wrong token' + }, 400); + } + + return this; + }; + + return Registry; +})(); + +exports['default'] = Registry; +module.exports = exports['default']; + +/***/ }, +/* 14 */ +/***/ function(module, exports, __webpack_require__) { + +'use strict'; + +exports.__esModule = true; + +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'); } } + +var _httpApiResponse = __webpack_require__(11); + +var _httpApiResponse2 = _interopRequireDefault(_httpApiResponse); + +var _coreUtils = __webpack_require__(2); + +var _httpUtils = __webpack_require__(10); + +var Mock = (function () { + function Mock(method, path, json, status, statusText, delay) { + _classCallCheck(this, Mock); + + this._method = method.toUpperCase(); + this._path = path; + this._json = json || {}; + this._delay = delay || 10; + this._status = status || 200; + this._statusText = statusText || 'OK'; + } + + Mock.prototype.path = function path() { + return this._path; + }; + + Mock.prototype.method = function method() { + return this._method; + }; + + Mock.prototype.test = function test(request) { + + return request.url.indexOf(this._path) > -1 && request.method.toUpperCase() == this._method; + }; + + Mock.prototype.getResponse = function getResponse(request) { + return regeneratorRuntime.async(function getResponse$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + context$2$0.next = 2; + return regeneratorRuntime.awrap(_coreUtils.delay(this._delay)); + + case 2: + return context$2$0.abrupt('return', this.createResponse(this._json)); + + case 3: + case 'end': + return context$2$0.stop(); + } + }, null, this); + }; + + Mock.prototype.createResponse = function createResponse(json, init) { + + init = init || {}; + + init.status = init.status || this._status; + init.statusText = init.statusText || this._statusText; + + var str = JSON.stringify(json), + res = _httpUtils.createResponse(str, init); + + res.headers.set(_httpApiResponse2['default']._contentType, _httpApiResponse2['default']._jsonContentType); + + return res; + }; + + return Mock; +})(); + +exports['default'] = Mock; +module.exports = exports['default']; + +/***/ }, +/* 15 */ +/***/ 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'); } } + +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 _coreObservable = __webpack_require__(8); + +var _coreObservable2 = _interopRequireDefault(_coreObservable); + +var _Queue = __webpack_require__(16); + +var _Queue2 = _interopRequireDefault(_Queue); + +var _Auth = __webpack_require__(17); + +var _Auth2 = _interopRequireDefault(_Auth); + +var _coreExternals = __webpack_require__(3); + +var _coreUtils = __webpack_require__(2); + +var Platform = (function (_Observable) { + _inherits(Platform, _Observable); + + _createClass(Platform, null, [{ + key: '_urlPrefix', + value: '/restapi', + enumerable: true + }, { + key: '_apiVersion', + value: 'v1.0', + enumerable: true + }, { + key: '_accessTokenTtl', + value: null, + // Platform server by default sets it to 60 * 60 = 1 hour + enumerable: true + }, { + key: '_refreshTokenTtl', + value: 10 * 60 * 60, + // 10 hours + enumerable: true + }, { + key: '_refreshTokenTtlRemember', + value: 7 * 24 * 60 * 60, + // 1 week + enumerable: true + }, { + key: '_tokenEndpoint', + value: '/restapi/oauth/token', + enumerable: true + }, { + key: '_revokeEndpoint', + value: '/restapi/oauth/revoke', + enumerable: true + }, { + key: '_authorizeEndpoint', + value: '/restapi/oauth/authorize', + enumerable: true + }, { + key: '_refreshDelayMs', + value: 100, + enumerable: true + }, { + key: '_cacheId', + value: 'platform', + enumerable: true + }, { + key: '_clearCacheOnRefreshError', + value: true, + enumerable: true + }]); + + function Platform(client, cache, server, appKey, appSecret) { + _classCallCheck(this, Platform); + + _Observable.call(this); + + this.events = { + beforeLogin: 'beforeLogin', + loginSuccess: 'loginSuccess', + loginError: 'loginError', + beforeRefresh: 'beforeRefresh', + refreshSuccess: 'refreshSuccess', + refreshError: 'refreshError', + beforeLogout: 'beforeLogout', + logoutSuccess: 'logoutSuccess', + logoutError: 'logoutError' + }; + this._server = server; + this._appKey = appKey; + this._appSecret = appSecret; + + /** @type {Cache} */ + this._cache = cache; + + /** @type {Client} */ + this._client = client; + + this._queue = new _Queue2['default'](this._cache, Platform._cacheId + '-refresh'); + + this._auth = new _Auth2['default'](this._cache, Platform._cacheId); + } + + /** + * @return {Auth} + */ + + Platform.prototype.auth = function auth() { + return this._auth; + }; + + /** + * @return {Client} + */ + + Platform.prototype.client = function client() { + return this._client; + }; + + /** + * @param {string} path + * @param {object} [options] + * @param {boolean} [options.addServer] + * @param {string} [options.addMethod] + * @param {boolean} [options.addToken] + * @return {string} + */ + + Platform.prototype.createUrl = function createUrl(path, options) { + + path = path || ''; + options = options || {}; + + var builtUrl = '', + hasHttp = path.indexOf('http://') != -1 || path.indexOf('https://') != -1; + + if (options.addServer && !hasHttp) builtUrl += this._server; + + if (path.indexOf(Platform._urlPrefix) == -1 && !hasHttp) builtUrl += Platform._urlPrefix + '/' + Platform._apiVersion; + + builtUrl += path; + + if (options.addMethod || options.addToken) builtUrl += path.indexOf('?') > -1 ? '&' : '?'; + + if (options.addMethod) builtUrl += '_method=' + options.addMethod; + if (options.addToken) builtUrl += (options.addMethod ? '&' : '') + 'access_token=' + this._auth.accessToken(); + + return builtUrl; + }; + + /** + * @param {string} options.redirectUri + * @param {string} options.state + * @param {string} options.brandId + * @param {string} options.display + * @param {string} options.prompt + * @return {string} + */ + + Platform.prototype.authUrl = function authUrl(options) { + + options = options || {}; + + return this.createUrl(Platform._authorizeEndpoint + '?' + _coreUtils.queryStringify({ + 'response_type': 'code', + 'redirect_uri': options.redirectUri || '', + 'client_id': this._appKey, + 'state': options.state || '', + 'brand_id': options.brandId || '', + 'display': options.display || '', + 'prompt': options.prompt || '' + }), { addServer: true }); + }; + + /** + * @param {string} url + * @return {Object} + */ + + Platform.prototype.parseAuthRedirectUrl = function parseAuthRedirectUrl(url) { + + var qs = _coreUtils.parseQueryString(url.split('?').reverse()[0]), + error = qs.error_description || qs.error; + + if (error) { + var e = new Error(error); + e.error = qs.error; + throw e; + } + + return qs; + }; + + /** + * @return {Promise} + */ + + Platform.prototype.loggedIn = function loggedIn() { + return regeneratorRuntime.async(function loggedIn$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + context$2$0.prev = 0; + context$2$0.next = 3; + return regeneratorRuntime.awrap(this._ensureAuthentication()); + + case 3: + return context$2$0.abrupt('return', true); + + case 6: + context$2$0.prev = 6; + context$2$0.t0 = context$2$0['catch'](0); + return context$2$0.abrupt('return', false); + + case 9: + case 'end': + return context$2$0.stop(); + } + }, null, this, [[0, 6]]); + }; + + /** + * @param {string} options.username + * @param {string} options.password + * @param {string} options.extension + * @param {string} options.code + * @param {string} options.redirectUri + * @param {string} options.endpointId + * @returns {Promise} + */ + + Platform.prototype.login = function login(options) { + var body, apiResponse, json; + return regeneratorRuntime.async(function login$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + context$2$0.prev = 0; + + options = options || {}; + + options.remember = options.remember || false; + + this.emit(this.events.beforeLogin); + + body = { + "access_token_ttl": Platform._accessTokenTtl, + "refresh_token_ttl": options.remember ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl + }; + + if (!options.code) { + + body.grant_type = 'password'; + body.username = options.username; + body.password = options.password; + body.extension = options.extension || ''; + } else if (options.code) { + + body.grant_type = 'authorization_code'; + body.code = options.code; + body.redirect_uri = options.redirectUri; + //body.client_id = this.getCredentials().key; // not needed } - } - utils.isEmail = isEmail; - function isPhoneNumber(v) { - return (/\+?1[0-9]{3}[0-9a-z]{7}/im.test(v.toString().split(/[^0-9a-z\+]/im).join(''))); - } - utils.isPhoneNumber = isPhoneNumber; - /** - * @param args - * @returns {Array} - */ - function argumentsToArray(args) { - return Array.prototype.slice.call(args || [], 0); - } - utils.argumentsToArray = argumentsToArray; - function isDate(obj) { - return type(obj) === "date"; - } - utils.isDate = isDate; - function isFunction(obj) { - return type(obj) === "function"; - } - utils.isFunction = isFunction; - function isArray(obj) { - return Array.isArray ? Array.isArray(obj) : type(obj) === "array"; - } - utils.isArray = isArray; - // A crude way of determining if an object is a window - function isWindow(obj) { - return obj && typeof obj === "object" && "setInterval" in obj; - } - utils.isWindow = isWindow; - function isNan(obj) { - return obj === null || !rdigit.test(obj) || isNaN(obj); - } - utils.isNan = isNan; - function type(obj) { - return obj === null - ? String(obj) - : class2type[toString.call(obj)] || "object"; - } - utils.type = type; - function isPlainObject(obj) { - // Must be an Object. - // Because of IE, we also have to check the presence of the constructor property. - // Make sure that DOM nodes and window objects don't pass through, as well - if (!obj || type(obj) !== "object" || obj.nodeType || isWindow(obj)) { - return false; + + if (options.endpointId) body.endpoint_id = options.endpointId; + + context$2$0.next = 9; + return regeneratorRuntime.awrap(this._tokenRequest(Platform._tokenEndpoint, body)); + + case 9: + apiResponse = context$2$0.sent; + json = apiResponse.json(); + + this._auth.setData(json).setRemember(options.remember); + + this.emit(this.events.loginSuccess, apiResponse); + + return context$2$0.abrupt('return', apiResponse); + + case 16: + context$2$0.prev = 16; + context$2$0.t0 = context$2$0['catch'](0); + + this._cache.clean(); + + this.emit(this.events.loginError, context$2$0.t0); + + throw context$2$0.t0; + + case 21: + case 'end': + return context$2$0.stop(); + } + }, null, this, [[0, 16]]); + }; + + /** + * @returns {Promise} + */ + + Platform.prototype.refresh = function refresh() { + var res, json; + return regeneratorRuntime.async(function refresh$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + context$2$0.prev = 0; + + this.emit(this.events.beforeRefresh); + + if (!this._queue.isPaused()) { + context$2$0.next = 9; + break; } - // Not own constructor property must be Object - if (obj.constructor && !hasOwn.call(obj, "constructor") && !hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) { - return false; + + context$2$0.next = 5; + return regeneratorRuntime.awrap(this._queue.poll()); + + case 5: + if (this._isAccessTokenValid()) { + context$2$0.next = 7; + break; } - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own. - var key; - for (key in obj) { } - return key === undefined || hasOwn.call(obj, key); - } - utils.isPlainObject = isPlainObject; - function getProperty(obj, property) { - return property - .split(/[.[\]]/) - .reduce(function (res, part) { - if (!res) - return undefined; - return part ? res[part] : res; - }, obj); - } - utils.getProperty = getProperty; - function poll(fn, interval, timeout) { - stopPolling(timeout); - interval = interval || 1000; - var next = function (delay) { - delay = delay || interval; - interval = delay; - return setTimeout(function () { - fn(next, delay); - }, delay); - }; - return next(); - } - utils.poll = poll; - function stopPolling(timeout) { - if (timeout) - clearTimeout(timeout); - } - utils.stopPolling = stopPolling; - function parseString(s) { - return s ? s.toString() : ''; - } - utils.parseString = parseString; - function parseNumber(n) { - if (!n) - return 0; - n = parseFloat(n); - return isNan(n) ? 0 : n; - } - utils.parseNumber = parseNumber; - function isNodeJS() { - return (typeof process !== 'undefined'); - } - utils.isNodeJS = isNodeJS; - function isBrowser() { - return (typeof window !== 'undefined'); - } - utils.isBrowser = isBrowser; - })(utils = core.utils || (core.utils = {})); - })(core = sdk.core || (sdk.core = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -/// -/// -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var core; - (function (core) { - /** - * @see https://github.com/Microsoft/TypeScript/issues/275 - */ - var Observable = (function () { - function Observable() { - if (!(this instanceof Observable)) - throw new Error('Observable(): New operator was omitted'); - this.off(); - } - Observable.prototype.hasListeners = function (event) { - return (event in this._listeners); - }; - Observable.prototype.on = function (events, callback) { - var _this = this; - if (typeof events == 'string') - events = [events]; - if (!events) - throw new Error('No events to subscribe to'); - if (typeof callback !== 'function') - throw new Error('Callback must be a function'); - events.forEach(function (event) { - if (!_this.hasListeners(event)) - _this._listeners[event] = []; - _this._listeners[event].push(callback); - }); - return this; - }; - Observable.prototype.emit = function (event) { - var _this = this; - var args = []; - for (var _i = 1; _i < arguments.length; _i++) { - args[_i - 1] = arguments[_i]; + + throw new Error('Automatic authentification timeout'); + + case 7: + + this.emit(this.events.refreshSuccess, null); + + return context$2$0.abrupt('return', null); + + case 9: + + this._queue.pause(); + + // Make sure all existing AJAX calls had a chance to reach the server + context$2$0.next = 12; + return regeneratorRuntime.awrap(_coreUtils.delay(Platform._refreshDelayMs)); + + case 12: + if (this._auth.refreshToken()) { + context$2$0.next = 14; + break; } - var result = null; - if (!this.hasListeners(event)) - return null; - this._listeners[event].some(function (callback) { - result = callback.apply(_this, args); - return (result === false); - }); - return result; - }; - Observable.prototype.off = function (event, callback) { - var _this = this; - if (!event) { - this._listeners = {}; + + throw new Error('Refresh token is missing'); + + case 14: + if (this._auth.refreshTokenValid()) { + context$2$0.next = 16; + break; } - else { - if (!callback) { - delete this._listeners[event]; - } - else { - if (!this.hasListeners(event)) - return this; - this._listeners[event].forEach(function (cb, i) { - if (cb === callback) - delete _this._listeners[event][i]; - }); - } + + throw new Error('Refresh token has expired'); + + case 16: + if (this._queue.isPaused()) { + context$2$0.next = 18; + break; } - return this; - }; - Observable.prototype.destroy = function () { - this.off(); - core.log.debug('Observable.destroy(): Listeners were destroyed'); - return this; - }; - return Observable; - })(); - core.Observable = Observable; - })(core = sdk.core || (sdk.core = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -/// -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - __.prototype = b.prototype; - d.prototype = new __(); -}; -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var core; - (function (core) { - var PageVisibility = (function (_super) { - __extends(PageVisibility, _super); - function PageVisibility() { - var _this = this; - _super.call(this); - this.events = { - change: 'change' - }; - var hidden = "hidden", onchange = function (evt) { - evt = evt || window.event; - var v = 'visible', h = 'hidden', evtMap = { - focus: v, focusin: v, pageshow: v, blur: h, focusout: h, pagehide: h - }; - _this._visible = (evt.type in evtMap) ? evtMap[evt.type] == v : !document[hidden]; - _this.emit(_this.events.change, _this._visible); - }; - this._visible = true; - if (typeof document == 'undefined' || typeof window == 'undefined') - return; - // Standards: - if (hidden in document) - document.addEventListener("visibilitychange", onchange); - else if ((hidden = "mozHidden") in document) - document.addEventListener("mozvisibilitychange", onchange); - else if ((hidden = "webkitHidden") in document) - document.addEventListener("webkitvisibilitychange", onchange); - else if ((hidden = "msHidden") in document) - document.addEventListener("msvisibilitychange", onchange); - else if ('onfocusin' in document) - document.onfocusin = document.onfocusout = onchange; - else - window.onpageshow = window.onpagehide = window.onfocus = window.onblur = onchange; - } - PageVisibility.prototype.visible = function () { - return this._visible; - }; - return PageVisibility; - })(core.Observable); - core.PageVisibility = PageVisibility; - })(core = sdk.core || (sdk.core = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -/// -/// -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var mocks; - (function (mocks) { - var Mock = (function () { - function Mock(method, path, json, status, statusText, delay) { - this._method = method.toUpperCase(); - this._path = path; - this._json = json || {}; - this._delay = delay || 10; - this._status = status || 200; - this._statusText = statusText || 'OK'; - } - Mock.prototype.path = function () { - return this._path; - }; - Mock.prototype.method = function () { - return this._method; - }; - Mock.prototype.test = function (request) { - return request.url.indexOf(this._path) > -1 && - request.method.toUpperCase() == this._method; - }; - Mock.prototype.getResponse = function (request) { - var _this = this; - return new sdk.externals._Promise(function (resolve, reject) { - setTimeout(function () { - resolve(_this.createResponse(_this._json)); - }, _this._delay); - }); - }; - Mock.prototype.createResponse = function (json, init) { - init = init || {}; - init.status = init.status || this._status; - init.statusText = init.statusText || this._statusText; - var str = JSON.stringify(json), res = sdk.http.Client.createResponse(str, init); - res.headers.set(sdk.http.ApiResponse.contentType, sdk.http.ApiResponse.jsonContentType); - return res; - }; - return Mock; - })(); - mocks.Mock = Mock; - })(mocks = sdk.mocks || (sdk.mocks = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -/// -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var mocks; - (function (mocks) { - var Registry = (function () { - function Registry() { - this._mocks = []; - } - Registry.prototype.add = function (mock) { - this._mocks.push(mock); - return this; - }; - Registry.prototype.clear = function () { - this._mocks = []; - return this; - }; - Registry.prototype.find = function (request) { - //console.log('Registry is looking for', request); - var mock = this._mocks.shift(); - if (!mock) - throw new Error('No mock in registry for request ' + request.method + ' ' + request.url); - if (!mock.test(request)) - throw new Error('Wrong request ' + request.method + ' ' + request.url + - ' for expected mock ' + mock.method() + ' ' + mock.path()); - return mock; - }; - Registry.prototype.apiCall = function (method, path, response, status, statusText) { - this.add(new mocks.Mock(method, path, response, status, statusText)); - return this; - }; - Registry.prototype.authentication = function () { - 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() + 3600000 - }); - return this; - }; - Registry.prototype.logout = function () { - this.apiCall('POST', '/restapi/oauth/revoke', {}); - return this; - }; - Registry.prototype.presenceLoad = function (id) { - this.apiCall('GET', '/restapi/v1.0/account/~/extension/' + id + '/presence', { - "uri": "https://platform.ringcentral.com/restapi/v1.0/account/123/extension/" + id + "/presence", - "extension": { - "uri": "https://platform.ringcentral.com/restapi/v1.0/account/123/extension/" + id, - "id": id, - "extensionNumber": "101" - }, - "activeCalls": [], - "presenceStatus": "Available", - "telephonyStatus": "Ringing", - "userStatus": "Available", - "dndStatus": "TakeAllCalls", - "extensionId": id - }); - return this; - }; - Registry.prototype.subscribeGeneric = function (expiresIn) { - expiresIn = expiresIn || 15 * 60 * 60; - var date = new Date(); - this.apiCall('POST', '/restapi/v1.0/subscription', { - 'eventFilters': [ - '/restapi/v1.0/account/~/extension/~/presence' - ], - 'expirationTime': new Date(date.getTime() + (expiresIn * 1000)).toISOString(), - 'expiresIn': expiresIn, - 'deliveryMode': { - 'transportType': 'PubNub', - 'encryption': false, - 'address': '123_foo', - 'subscriberKey': 'sub-c-foo', - 'secretKey': 'sec-c-bar' - }, - 'id': 'foo-bar-baz', - 'creationTime': date.toISOString(), - 'status': 'Active', - 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz' - }); - return this; - }; - Registry.prototype.subscribeOnPresence = function (id, detailed) { - id = id || '1'; - var date = new Date(); - this.apiCall('POST', '/restapi/v1.0/subscription', { - 'eventFilters': ['/restapi/v1.0/account/~/extension/' + id + '/presence' + (detailed ? '?detailedTelephonyState=true' : '')], - 'expirationTime': new Date(date.getTime() + (15 * 60 * 60 * 1000)).toISOString(), - 'deliveryMode': { - 'transportType': 'PubNub', - 'encryption': true, - 'address': '123_foo', - 'subscriberKey': 'sub-c-foo', - 'secretKey': 'sec-c-bar', - 'encryptionAlgorithm': 'AES', - 'encryptionKey': 'VQwb6EVNcQPBhE/JgFZ2zw==' - }, - 'creationTime': date.toISOString(), - 'id': 'foo-bar-baz', - 'status': 'Active', - 'uri': 'https://platform.ringcentral.com/restapi/v1.0/subscription/foo-bar-baz' - }); - return this; - }; - Registry.prototype.tokenRefresh = function (failure) { - if (!failure) { - 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' - }); + + throw new Error('Queue was resumed before refresh call'); + + case 18: + context$2$0.next = 20; + return regeneratorRuntime.awrap(this._tokenRequest(Platform._tokenEndpoint, { + "grant_type": "refresh_token", + "refresh_token": this._auth.refreshToken(), + "access_token_ttl": Platform._accessTokenTtl, + "refresh_token_ttl": this._auth.remember() ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl + })); + + case 20: + res = context$2$0.sent; + json = res.json(); + + if (json.access_token) { + context$2$0.next = 24; + break; } - else { - this.apiCall('POST', '/restapi/oauth/token', { - 'message': 'Wrong token', - 'error_description': 'Wrong token', - 'description': 'Wrong token' - }, 400); + + throw this._client.makeError(new Error('Malformed OAuth response'), res); + + case 24: + + this._auth.setData(json); + this._queue.resume(); + + this.emit(this.events.refreshSuccess, res); + + return context$2$0.abrupt('return', res); + + case 30: + context$2$0.prev = 30; + context$2$0.t0 = context$2$0['catch'](0); + + context$2$0.t0 = this._client.makeError(context$2$0.t0); + + if (Platform._clearCacheOnRefreshError) { + this._cache.clean(); } - return this; - }; - return Registry; - })(); - mocks.Registry = Registry; - })(mocks = sdk.mocks || (sdk.mocks = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -/// -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var externals; - (function (externals) { - externals._Promise; - externals._fetch; - externals._Response; - externals._Request; - externals._Headers; - externals._PUBNUB; - function get() { - var root = Function('return this')(); - if (!externals._PUBNUB) - externals._PUBNUB = root.PUBNUB; - if (!externals._Promise) - externals._Promise = root.Promise; - if (!externals._fetch) - externals._fetch = root.fetch; - if (!externals._Headers) - externals._Headers = root.Headers; - if (!externals._Request) - externals._Request = root.Request; - if (!externals._Response) - externals._Response = root.Response; - return externals; + + this.emit(this.events.refreshError, context$2$0.t0); + + throw context$2$0.t0; + + case 36: + case 'end': + return context$2$0.stop(); } - externals.get = get; - })(externals = sdk.externals || (sdk.externals = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -/// -/// -/// -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var http; - (function (http) { - /** - * @TODO Bring back tests - */ - var ApiResponse = (function () { - function ApiResponse(request, response, responseText) { - this._text = responseText; - this._request = request; - this._response = response; - this._json = null; - this._multipartTransactions = null; - } - ApiResponse.prototype.response = function () { - return this._response; - }; - ApiResponse.prototype.request = function () { - return this._request; - }; - ApiResponse.prototype.ok = function () { - return this._response && this._response.ok; - }; - ApiResponse.prototype.text = function () { - return this._text; - }; - ApiResponse.prototype.json = function () { - if (!this._isJson()) - throw new Error('Response is not JSON'); - if (!this._json) { - this._json = this._text ? JSON.parse(this._text) : null; - } - return this._json; - }; - ApiResponse.prototype.error = function (skipOKCheck) { - if (this.ok() && !skipOKCheck) - return null; - var message = (this._response && this._response.status ? this._response.status + ' ' : '') + - (this._response && this._response.statusText ? this._response.statusText : ''); - try { - var json = this.json(); - if (json.message) - message = json.message; - if (json.error_description) - message = json.error_description; - if (json.description) - message = json.description; - } - catch (ex) { } - return message; - }; - ApiResponse.prototype.multipart = function () { - if (!this._isMultipart()) - throw new Error('Response is not multipart'); - if (null === this._multipartTransactions) { - // Step 1. Split multipart response - if (!this._text) - throw new Error('No response body'); - var boundary = this._response.headers.get('Content-Type').match(/boundary=([^;]+)/i)[1]; - if (!boundary) - throw new Error('Cannot find boundary'); - var parts = this._text.toString().split(ApiResponse.boundarySeparator + boundary); - if (parts[0].trim() === '') - parts.shift(); - if (parts[parts.length - 1].trim() == ApiResponse.boundarySeparator) - parts.pop(); - if (parts.length < 1) - throw new Error('No parts in body'); - // Step 2. Parse status info - var statusInfo = ApiResponse.create(parts.shift(), this._response.status, this._response.statusText); - // Step 3. Parse all other parts - this._multipartTransactions = parts.map(function (part, i) { - var status = statusInfo.json().response[i].status; - return ApiResponse.create(part, status); - }); - } - return this._multipartTransactions; - }; - /** - * Short-hand method to get only JSON content of responses - */ - ApiResponse.prototype.multipartJson = function () { - return this.multipart().map(function (res) { - return res.json(); - }); - }; - ApiResponse.prototype._isContentType = function (contentType) { - return this._getContentType().indexOf(contentType) > -1; - }; - ApiResponse.prototype._getContentType = function () { - return this._response.headers.get(ApiResponse.contentType) || ''; - }; - ApiResponse.prototype._isMultipart = function () { - return this._isContentType(ApiResponse.multipartContentType); - }; - ApiResponse.prototype._isUrlEncoded = function () { - return this._isContentType(ApiResponse.urlencodedContentType); - }; - ApiResponse.prototype._isJson = function () { - return this._isContentType(ApiResponse.jsonContentType); - }; - /** - * Method is used to create Transaction objects from string parts of multipart/mixed response - * @param text - * @param status - * @param statusText - * @return {ApiResponse} - */ - ApiResponse.create = function (text, status, statusText) { - status = status || 200; - statusText = statusText || 'OK'; - text = text.replace(/\r/g, ''); - var headers = new sdk.externals._Headers(), headersAndBody = text.split(ApiResponse.bodySeparator), headersText = (headersAndBody.length > 1) ? headersAndBody.shift() : ''; - text = headersAndBody.join(ApiResponse.bodySeparator); - (headersText || '') - .split('\n') - .forEach(function (header) { - var split = header.trim().split(ApiResponse.headerSeparator), key = split.shift().trim(), value = split.join(ApiResponse.headerSeparator).trim(); - if (key) - headers.append(key, value); - }); - return new ApiResponse(null, http.Client.createResponse(text, { - headers: headers, - status: status, - statusText: statusText - }), text); - }; - ApiResponse.contentType = 'Content-Type'; - ApiResponse.jsonContentType = 'application/json'; - ApiResponse.multipartContentType = 'multipart/mixed'; - ApiResponse.urlencodedContentType = 'application/x-www-form-urlencoded'; - ApiResponse.headerSeparator = ':'; - ApiResponse.bodySeparator = '\n\n'; - ApiResponse.boundarySeparator = '--'; - return ApiResponse; - })(); - http.ApiResponse = ApiResponse; - })(http = sdk.http || (sdk.http = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -/// -/// -/// -/// -/// -/// -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var http; - (function (http) { - var allowedMethods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD']; - var Client = (function (_super) { - __extends(Client, _super); - function Client() { - _super.apply(this, arguments); - this.events = { - beforeRequest: 'beforeRequest', - requestSuccess: 'requestSuccess', - requestError: 'requestError' // means that request failed completely - }; - } - Client.prototype.sendRequest = function (request) { - var _this = this; - var res = new http.ApiResponse(request); //FIXME Potential leak - return new sdk.externals._Promise(function (resolve) { - //TODO Stop request if listeners return false - _this.emit(_this.events.beforeRequest, res); - resolve(_this._loadResponse(request)); - }) - .then(function (response) { - res['_response'] = Client.cloneResponse(response); - return response.text(); - }) - .then(function (text) { - res['_text'] = text; - if (!res.ok()) - throw Client.makeError(new Error('Response has unsuccessful status'), res); - _this.emit(_this.events.requestSuccess, res); - return res; - }) - .catch(function (e) { - if (!e.apiResponse) { - // we don't pass response since most likely it's parsing caused an error - e = Client.makeError(e, res); - } - _this.emit(_this.events.requestError, e); - throw e; - }); - }; - Client.prototype._loadResponse = function (request) { - return sdk.externals._fetch.call(null, request); - }; - /** - * Wraps the JS Error object with transaction information - * @param {Error} e - * @param {ApiResponse} apiResponse - * @return {IApiError} - */ - Client.makeError = function (e, apiResponse) { - var error = e; - // Wrap only if regular error - if (!error.hasOwnProperty('apiResponse') && !error.hasOwnProperty('originalMessage')) { - error.apiResponse = apiResponse; - error.originalMessage = error.message; - error.message = (apiResponse && apiResponse.error(true)) || error.originalMessage; - } - return error; - }; - /** - * TODO Wait for - * - https://github.com/github/fetch/issues/185 - * - https://github.com/bitinn/node-fetch/issues/34 - * @param {Response} response - * @return {Response} - */ - Client.cloneResponse = function (response) { - if (sdk.core.utils.isFunction(response.clone)) - return response.clone(); - var body = ''; - if (response.hasOwnProperty('_bodyInit')) - body = response['_bodyInit']; - if (response.hasOwnProperty('_bodyText')) - body = response['_bodyText']; - if (response.hasOwnProperty('_bodyBlob')) - body = response['_bodyBlob'].slice(); - if (response.hasOwnProperty('_bodyFormData')) - body = response['_bodyFormData']; - if (response.hasOwnProperty('_raw')) - body = response['_raw'].join(''); - var clone = new sdk.externals._Response(body, response); - if (response.hasOwnProperty('body')) - clone['body'] = response['body']; // accessing non-standard properties - return clone; - }; - /** - * Creates a response - * @param stringBody - * @param init - * @return {Response} - */ - Client.createResponse = function (stringBody, init) { - init = init || {}; - return new sdk.externals._Response(stringBody, init); - }; - Client.createRequest = function (input, init) { - init = init || {}; - var body = init.body; - // Assign request with empty body, Github's fetch throws errors if it cannot recognize the body type - var req = new sdk.externals._Request(input, sdk.core.utils.extend({}, init, { body: null })); - if (!req.url) - throw new Error('Url is not defined'); - if (!req.method) - req.method = 'GET'; - if (req.method && allowedMethods.indexOf(req.method) < 0) - throw new Error('Method has wrong value: ' + req.method); - if (!req.headers.has('Accept')) - req.headers.set('Accept', 'application/json'); - // Serialize body - if (sdk.core.utils.isPlainObject(init.body) || !init.body) { - if (!req.headers.has('Content-Type')) - req.headers.set('Content-Type', 'application/json'); - var contentType = req.headers.get('Content-Type'); - if (contentType.indexOf('application/json') > -1) { - body = JSON.stringify(init.body); - } - else if (contentType.indexOf('application/x-www-form-urlencoded') > -1) { - body = sdk.core.utils.queryStringify(init.body); - } + }, null, this, [[0, 30]]); + }; + + /** + * @returns {Promise} + */ + + Platform.prototype.logout = function logout() { + var res; + return regeneratorRuntime.async(function logout$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + context$2$0.prev = 0; + + this.emit(this.events.beforeLogout); + + this._queue.pause(); + + context$2$0.next = 5; + return regeneratorRuntime.awrap(this._tokenRequest(Platform._revokeEndpoint, { + token: this._auth.accessToken() + })); + + case 5: + res = context$2$0.sent; + + this._queue.resume(); + this._cache.clean(); + + this.emit(this.events.logoutSuccess, res); + + return context$2$0.abrupt('return', res); + + case 12: + context$2$0.prev = 12; + context$2$0.t0 = context$2$0['catch'](0); + + this._queue.resume(); + + this.emit(this.events.logoutError, context$2$0.t0); + + throw context$2$0.t0; + + case 17: + case 'end': + return context$2$0.stop(); + } + }, null, this, [[0, 12]]); + }; + + /** + * @param {Request} request + * @param {object} [options] + * @param {boolean} [options.skipAuthCheck] + * @return {Promise} + */ + + Platform.prototype.inflateRequest = function inflateRequest(request, options) { + return regeneratorRuntime.async(function inflateRequest$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + + options = options || {}; + + if (!options.skipAuthCheck) { + context$2$0.next = 3; + break; } - req.credentials = 'include'; - req.mode = 'cors'; - if (init.query) { - req.url = req.url + (req.url.indexOf('?') > -1 ? '&' : '?') + sdk.core.utils.queryStringify(init.query); + + return context$2$0.abrupt('return', request); + + case 3: + context$2$0.next = 5; + return regeneratorRuntime.awrap(this._ensureAuthentication()); + + case 5: + + request.headers.set('Authorization', this._authHeader()); + //request.url = this.createUrl(request.url, {addServer: true}); //FIXME Spec prevents this... + + //TODO Add User-Agent here + + return context$2$0.abrupt('return', request); + + case 7: + case 'end': + return context$2$0.stop(); + } + }, null, this); + }; + + /** + * @param {Request} request + * @param {object} [options] + * @param {boolean} [options.skipAuthCheck] + * @return {Promise} + */ + + Platform.prototype.sendRequest = function sendRequest(request, options) { + return regeneratorRuntime.async(function sendRequest$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + context$2$0.prev = 0; + context$2$0.next = 3; + return regeneratorRuntime.awrap(this.inflateRequest(request, options)); + + case 3: + request = context$2$0.sent; + context$2$0.next = 6; + return regeneratorRuntime.awrap(this._client.sendRequest(request)); + + case 6: + return context$2$0.abrupt('return', context$2$0.sent); + + case 9: + context$2$0.prev = 9; + context$2$0.t0 = context$2$0['catch'](0); + + if (!(!context$2$0.t0.apiResponse || !context$2$0.t0.apiResponse.response() || context$2$0.t0.apiResponse.response().status != 401)) { + context$2$0.next = 13; + break; } - // Create another request with encoded body - req = new sdk.externals._Request(req.url, sdk.core.utils.extend(req, { body: body })); - // Keep the original body accessible directly (for mocks) - req.body = init.body; - return req; - }; - return Client; - })(sdk.core.Observable); - http.Client = Client; - })(http = sdk.http || (sdk.http = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -/// -/// -/// -/// -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var platform; - (function (platform) { - var Queue = (function () { - function Queue(cache, cacheId) { - this._cache = cache; - this._cacheId = cacheId; - this.setPollInterval(250); - this.setReleaseTimeout(5000); // If queue was not released then force it to do so after some timeout - } - Queue.prototype.isPaused = function () { - var storage = this._cache, cacheId = this._cacheId, time = storage.getItem(cacheId); - return !!time && Date.now() - parseInt(time) < this._releaseTimeout; - }; - Queue.prototype.pause = function () { - this._cache.setItem(this._cacheId, Date.now()); - return this; - }; - Queue.prototype.resume = function () { - this._cache.removeItem(this._cacheId); - return this; - }; - Queue.prototype.poll = function () { - var _this = this; - if (this._promise) - return this._promise; - this._promise = new sdk.externals._Promise(function (resolve, reject) { - sdk.core.utils.poll(function (next) { - if (_this.isPaused()) - return next(); - _this._promise = null; - _this.resume(); // this is actually not needed but why not - resolve(null); - }, _this._pollInterval); - }); - return this._promise; - }; - Queue.prototype.releaseTimeout = function () { - return this._releaseTimeout; - }; - Queue.prototype.pollInterval = function () { - return this._pollInterval; - }; - Queue.prototype.setReleaseTimeout = function (releaseTimeout) { - this._releaseTimeout = releaseTimeout; - return this; - }; - Queue.prototype.setPollInterval = function (pollInterval) { - this._pollInterval = pollInterval; - return this; - }; - return Queue; - })(); - platform.Queue = Queue; - })(platform = sdk.platform || (sdk.platform = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -/// -/// -/// -/// -/// -/// -/// -/// -/// -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var platform; - (function (platform) { - var Platform = (function (_super) { - __extends(Platform, _super); - function Platform(client, cache, server, appKey, appSecret) { - _super.call(this); - this._refreshDelayMs = 100; - this._clearCacheOnRefreshError = true; - this._cacheId = 'platform'; - this.events = { - accessViolation: 'accessViolation', - logoutSuccess: 'logoutSuccess', - logoutError: 'logoutError', - authorizeSuccess: 'authorizeSuccess', - authorizeError: 'authorizeError', - refreshSuccess: 'refreshSuccess', - refreshError: 'refreshError' - }; - this._server = server; - this._appKey = appKey; - this._appSecret = appSecret; - this._cache = cache; - this._client = client; - this._queue = new platform.Queue(this._cache, this._cacheId + '-refresh'); - this._auth = new platform.Auth(this._cache, this._cacheId); - } - Platform.prototype.auth = function () { - return this._auth; - }; - Platform.prototype.createUrl = function (path, options) { - path = path || ''; + + throw context$2$0.t0; + + case 13: + + this._auth.cancelAccessToken(); + + context$2$0.next = 16; + return regeneratorRuntime.awrap(this.sendRequest(request, options)); + + case 16: + return context$2$0.abrupt('return', context$2$0.sent); + + case 17: + case 'end': + return context$2$0.stop(); + } + }, null, this, [[0, 9]]); + }; + + /** + * General purpose function to send anything to server + * @param {object} [options.body] + * @param {string} [options.url] + * @param {string} [options.method] + * @param {object} [options.query] + * @param {object} [options.headers] + * @param {boolean} [options.skipAuthCheck] + * @return {Promise} + */ + + Platform.prototype.send = function send() { + var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; + return regeneratorRuntime.async(function send$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + + //FIXME https://github.com/bitinn/node-fetch/issues/43 + options.url = this.createUrl(options.url, { addServer: true }); + + context$2$0.next = 3; + return regeneratorRuntime.awrap(this.sendRequest(this._client.createRequest(options), options)); + + case 3: + return context$2$0.abrupt('return', context$2$0.sent); + + case 4: + case 'end': + return context$2$0.stop(); + } + }, null, this); + }; + + /** + * @param {string} url + * @param {object} query + * @param {object} [options] + * @param {object} [options.headers] + * @param {boolean} [options.skipAuthCheck] + * @return {Promise} + */ + + Platform.prototype.get = function get(url, query, options) { + return regeneratorRuntime.async(function get$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + options = options || {}; + options.method = 'GET'; + options.url = url; + options.query = query; + context$2$0.next = 6; + return regeneratorRuntime.awrap(this.send(options)); + + case 6: + return context$2$0.abrupt('return', context$2$0.sent); + + case 7: + case 'end': + return context$2$0.stop(); + } + }, null, this); + }; + + /** + * @param {string} url + * @param {object} body + * @param {object} query + * @param {object} [options] + * @param {object} [options.headers] + * @param {boolean} [options.skipAuthCheck] + * @return {Promise} + */ + + Platform.prototype.post = function post(url, body, query, options) { + return regeneratorRuntime.async(function post$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + options = options || {}; + options.method = 'POST'; + options.url = url; + options.query = query; + options.body = body; + context$2$0.next = 7; + return regeneratorRuntime.awrap(this.send(options)); + + case 7: + return context$2$0.abrupt('return', context$2$0.sent); + + case 8: + case 'end': + return context$2$0.stop(); + } + }, null, this); + }; + + /** + * @param {string} url + * @param {object} body + * @param {object} query + * @param {object} [options] + * @param {object} [options.headers] + * @param {boolean} [options.skipAuthCheck] + * @return {Promise} + */ + + Platform.prototype.put = function put(url, body, query, options) { + return regeneratorRuntime.async(function put$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: options = options || {}; - var builtUrl = '', hasHttp = path.indexOf('http://') != -1 || path.indexOf('https://') != -1; - if (options.addServer && !hasHttp) - builtUrl += this._server; - if (path.indexOf(Platform._urlPrefix) == -1 && !hasHttp) - builtUrl += Platform._urlPrefix + '/' + Platform._apiVersion; - builtUrl += path; - if (options.addMethod || options.addToken) - builtUrl += (path.indexOf('?') > -1 ? '&' : '?'); - if (options.addMethod) - builtUrl += '_method=' + options.addMethod; - if (options.addToken) - builtUrl += (options.addMethod ? '&' : '') + 'access_token=' + this._auth.accessToken(); - return builtUrl; - }; - Platform.prototype.authUrl = function (options) { + options.method = 'PUT'; + options.url = url; + options.query = query; + options.body = body; + context$2$0.next = 7; + return regeneratorRuntime.awrap(this.send(options)); + + case 7: + return context$2$0.abrupt('return', context$2$0.sent); + + case 8: + case 'end': + return context$2$0.stop(); + } + }, null, this); + }; + + /** + * @param {string} url + * @param {string} query + * @param {object} [options] + * @param {object} [options.headers] + * @param {boolean} [options.skipAuthCheck] + * @return {Promise} + */ + + Platform.prototype['delete'] = function _delete(url, query, options) { + return regeneratorRuntime.async(function _delete$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: options = options || {}; - return this.createUrl(Platform._authorizeEndpoint + '?' + sdk.core.utils.queryStringify({ - 'response_type': 'code', - 'redirect_uri': options.redirectUri || '', - 'client_id': this._appKey, - 'state': options.state || '', - 'brand_id': options.brandId || '', - 'display': options.display || '', - 'prompt': options.prompt || '' - }), { addServer: true }); - }; - Platform.prototype.parseAuthRedirectUrl = function (url) { - var qs = sdk.core.utils.parseQueryString(url.split('?').reverse()[0]), error = qs.error_description || qs.error; - if (error) { - var e = new Error(error); - e.error = qs.error; - throw e; + options.method = 'DELETE'; + options.url = url; + options.query = query; + context$2$0.next = 6; + return regeneratorRuntime.awrap(this.send(options)); + + case 6: + return context$2$0.abrupt('return', context$2$0.sent); + + case 7: + case 'end': + return context$2$0.stop(); + } + }, null, this); + }; + + Platform.prototype._tokenRequest = function _tokenRequest(path, body) { + return regeneratorRuntime.async(function _tokenRequest$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + context$2$0.next = 2; + return regeneratorRuntime.awrap(this.send({ + url: path, + skipAuthCheck: true, + body: body, + method: 'POST', + headers: { + 'Authorization': 'Basic ' + this._apiKey(), + 'Content-Type': 'application/x-www-form-urlencoded' + } + })); + + case 2: + return context$2$0.abrupt('return', context$2$0.sent); + + case 3: + case 'end': + return context$2$0.stop(); + } + }, null, this); + }; + + Platform.prototype._ensureAuthentication = function _ensureAuthentication() { + return regeneratorRuntime.async(function _ensureAuthentication$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + if (!this._isAccessTokenValid()) { + context$2$0.next = 2; + break; + } + + return context$2$0.abrupt('return', null); + + case 2: + context$2$0.next = 4; + return regeneratorRuntime.awrap(this.refresh()); + + case 4: + return context$2$0.abrupt('return', context$2$0.sent); + + case 5: + case 'end': + return context$2$0.stop(); + } + }, null, this); + }; + + Platform.prototype._isAccessTokenValid = function _isAccessTokenValid() { + + return this._auth.accessTokenValid() && !this._queue.isPaused(); + }; + + Platform.prototype._apiKey = function _apiKey() { + var apiKey = this._appKey + ':' + this._appSecret; + return typeof btoa == 'function' ? btoa(apiKey) : new Buffer(apiKey).toString('base64'); + }; + + Platform.prototype._authHeader = function _authHeader() { + var token = this._auth.accessToken(); + return this._auth.tokenType() + (token ? ' ' + token : ''); + }; + + return Platform; +})(_coreObservable2['default']); + +exports['default'] = Platform; +module.exports = exports['default']; + +// Perform sanity checks + +/** @type {ApiResponse} */ + +// 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) { + +'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 Auth = (function () { + _createClass(Auth, null, [{ + key: 'refreshHandicapMs', + value: 60 * 1000, + // 1 minute + enumerable: true + }, { + key: 'forcedTokenType', + value: 'forced', + enumerable: true + }]); + + function Auth(cache, cacheId) { + _classCallCheck(this, Auth); + + /** @type {Cache} */ + this._cache = cache; + this._cacheId = cacheId; + } + + //export interface IAuthData { + // remember?:boolean; + // token_type?:string; + // access_token?:string; + // expires_in?:number; // actually it's string + // expire_time?:number; + // refresh_token?:string; + // refresh_token_expires_in?:number; // actually it's string + // refresh_token_expire_time?:number; + // scope?:string; + //} + + Auth.prototype.accessToken = function accessToken() { + return this.data().access_token; + }; + + Auth.prototype.refreshToken = function refreshToken() { + return this.data().refresh_token; + }; + + Auth.prototype.tokenType = function tokenType() { + return this.data().token_type; + }; + + /** + * @return {{token_type: string, access_token: string, expires_in: number, refresh_token: string, refresh_token_expires_in: number}} + */ + + Auth.prototype.data = function data() { + + return this._cache.getItem(this._cacheId) || { + token_type: '', + access_token: '', + expires_in: 0, + refresh_token: '', + refresh_token_expires_in: 0 + }; + }; + + /** + * @param {object} newData + * @return {Auth} + */ + + Auth.prototype.setData = function setData(newData) { + + newData = newData || {}; + + var data = this.data(); + + Object.keys(newData).forEach(function (key) { + data[key] = newData[key]; + }); + + data.expire_time = Date.now() + data.expires_in * 1000; + data.refresh_token_expire_time = Date.now() + data.refresh_token_expires_in * 1000; + + this._cache.setItem(this._cacheId, data); + + return this; + }; + + /** + * Check if there is a valid (not expired) access token + * @return {boolean} + */ + + Auth.prototype.accessTokenValid = function accessTokenValid() { + + var authData = this.data(); + return authData.token_type === Auth.forcedTokenType || authData.expire_time - Auth.refreshHandicapMs > Date.now(); + }; + + /** + * Check if there is a valid (not expired) access token + * @return {boolean} + */ + + Auth.prototype.refreshTokenValid = function refreshTokenValid() { + + return this.data().refresh_token_expire_time > Date.now(); + }; + + /** + * @return {Auth} + */ + + Auth.prototype.cancelAccessToken = function cancelAccessToken() { + + return this.setData({ + access_token: '', + expires_in: 0 + }); + }; + + /** + * This method sets a special authentication mode used in Service Web + * @return {Auth} + */ + + Auth.prototype.forceAuthentication = function forceAuthentication() { + + this.setData({ + token_type: Auth.forcedTokenType, + access_token: '', + expires_in: 0, + refresh_token: '', + refresh_token_expires_in: 0 + }); + + return this; + }; + + /** + * @param remember + * @return {Auth} + */ + + Auth.prototype.setRemember = function setRemember(remember) { + + return this.setData({ remember: remember }); + }; + + /** + * @return {boolean} + */ + + Auth.prototype.remember = function remember() { + + return !!this.data().remember; + }; + + return Auth; +})(); + +exports['default'] = Auth; +module.exports = exports['default']; + +/***/ }, +/* 18 */ +/***/ function(module, exports, __webpack_require__) { + +'use strict'; + +exports.__esModule = true; + +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'); } } + +var _PubnubMockJs = __webpack_require__(19); + +var _PubnubMockJs2 = _interopRequireDefault(_PubnubMockJs); + +var _coreExternals = __webpack_require__(3); + +var PubnubMockFactory = (function () { + function PubnubMockFactory() { + _classCallCheck(this, PubnubMockFactory); + + this.crypto_obj = _coreExternals.PUBNUB.crypto_obj; + } + + PubnubMockFactory.prototype.init = function init(options) { + return new _PubnubMockJs2['default'](options); + }; + + return PubnubMockFactory; +})(); + +exports['default'] = PubnubMockFactory; +module.exports = exports['default']; + +/***/ }, +/* 19 */ +/***/ function(module, exports, __webpack_require__) { + +'use strict'; + +exports.__esModule = true; + +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 _coreObservable = __webpack_require__(8); + +var _coreObservable2 = _interopRequireDefault(_coreObservable); + +var _coreExternals = __webpack_require__(3); + +var PubnubMock = (function (_Observable) { + _inherits(PubnubMock, _Observable); + + function PubnubMock(options) { + _classCallCheck(this, PubnubMock); + + _Observable.call(this); + this.options = options; + this.crypto_obj = _coreExternals.PUBNUB.crypto_obj; + } + + PubnubMock.prototype.ready = function ready() {}; + + PubnubMock.prototype.subscribe = function subscribe(options) { + this.on('message-' + options.channel, options.message); + }; + + PubnubMock.prototype.unsubscribe = function unsubscribe(options) { + this.off('message-' + options.channel); + }; + + PubnubMock.prototype.receiveMessage = function receiveMessage(msg, channel) { + this.emit('message-' + channel, msg, 'env', channel); + }; + + return PubnubMock; +})(_coreObservable2['default']); + +exports['default'] = PubnubMock; +module.exports = exports['default']; + +/***/ }, +/* 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 _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 _coreObservable = __webpack_require__(8); + +var _coreObservable2 = _interopRequireDefault(_coreObservable); + +var _httpClient = __webpack_require__(9); + +var _httpClient2 = _interopRequireDefault(_httpClient); + +var _coreUtils = __webpack_require__(2); + +var Subscription = (function (_Observable) { + _inherits(Subscription, _Observable); + + _createClass(Subscription, null, [{ + key: '_renewHandicapMs', + value: 2 * 60 * 1000, + enumerable: true + }, { + key: '_pollInterval', + value: 10 * 1000, + enumerable: true + }]); + + function Subscription(pubnubFactory, platform, cache) { + _classCallCheck(this, Subscription); + + _Observable.call(this); + + this.events = { + notification: 'notification', + removeSuccess: 'removeSuccess', + removeError: 'removeError', + renewSuccess: 'renewSuccess', + renewError: 'renewError', + subscribeSuccess: 'subscribeSuccess', + subscribeError: 'subscribeError' + }; + this._pubnubFactory = pubnubFactory; + this._platform = platform; + this._cache = cache; + this._pubnub = null; + this._timeout = null; + this._subscription = {}; + } + + //export interface ISubscription { + // id?:string; + // uri?: string; + // eventFilters?:string[]; + // expirationTime?:string; // 2014-03-12T19:54:35.613Z + // expiresIn?:number; + // deliveryMode?: { + // transportType?:string; + // encryption?:boolean; + // address?:string; + // subscriberKey?:string; + // encryptionKey?:string; + // secretKey?:string; + // }; + // creationTime?:string; // 2014-03-12T19:54:35.613Z + // status?:string; // Active + //} + + /** + * @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()); + }; + + Subscription.prototype.expirationTime = function expirationTime() { + return new Date(this._subscription.expirationTime || 0).getTime() - Subscription._renewHandicapMs; + }; + + Subscription.prototype.setSubscription = function setSubscription(subscription) { + + subscription = subscription || {}; + + this._clearTimeout(); + + this._subscription = subscription; + + if (!this._pubnub) this._subscribeAtPubnub(); + + this._setTimeout(); + + return this; + }; + + Subscription.prototype.subscription = function subscription() { + return this._subscription; + }; + + /** + * 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) { + return regeneratorRuntime.async(function register$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + if (!this.alive()) { + context$2$0.next = 6; + break; } - return qs; - }; - Platform.prototype.loggedIn = function () { - return this._ensureAuthentication() - .then(function () { - return true; - }) - .catch(function () { - return false; - }); - }; - Platform.prototype.login = function (options) { - var _this = this; + + context$2$0.next = 3; + return regeneratorRuntime.awrap(this.renew(options)); + + 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)); + + case 8: + return context$2$0.abrupt('return', context$2$0.sent); + + case 9: + case 'end': + return context$2$0.stop(); + } + }, null, this); + }; + + Subscription.prototype.eventFilters = function eventFilters() { + return this._subscription.eventFilters || []; + }; + + /** + * @param {string[]} events + * @return {Subscription} + */ + + Subscription.prototype.addEventFilters = function addEventFilters(events) { + this.setEventFilters(this.eventFilters().concat(events)); + return this; + }; + + /** + * @param {string[]} events + * @return {Subscription} + */ + + Subscription.prototype.setEventFilters = function setEventFilters(events) { + this._subscription.eventFilters = events; + return this; + }; + + /** + * @param {{events?:string[]}} [options] New array of events + * @returns {Promise} + */ + + Subscription.prototype.subscribe = function subscribe(options) { + 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 || {}; - options.remember = options.remember || false; - var body = { - "access_token_ttl": Platform._accessTokenTtl, - "refresh_token_ttl": options.remember ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl - }; - if (!options.code) { - body.grant_type = 'password'; - body.username = options.username; - body.password = options.password; - body.extension = options.extension || ''; - } - else if (options.code) { - body.grant_type = 'authorization_code'; - body.code = options.code; - body.redirect_uri = options.redirectUri; + + if (options.events) this.setEventFilters(options.events); + + this._clearTimeout(); + + if (this.eventFilters().length) { + context$2$0.next = 6; + break; } - if (options.endpointId) - body.endpoint_id = options.endpointId; - return this._tokenRequest(Platform._tokenEndpoint, body).then(function (res) { - _this._auth - .setData(res.json()) - .setRemember(options.remember); - _this.emit(_this.events.authorizeSuccess, res); - return res; - }).catch(function (e) { - _this._cache.clean(); - _this.emit(_this.events.authorizeError, e); - throw e; - }); - }; - Platform.prototype.refresh = function () { - var _this = this; - var refresh = new sdk.externals._Promise(function (resolve, reject) { - if (_this._queue.isPaused()) { - return resolve(_this._refreshPolling()); - } - _this._queue.pause(); - // Make sure all existing AJAX calls had a chance to reach the server - setTimeout(function () { - sdk.core.log.debug('Platform.refresh(): Performing token refresh (access token', _this._auth.accessToken(), ', refresh token', _this._auth.refreshToken(), ')'); - // Perform sanity checks - if (!_this._auth.refreshToken()) - return reject(new Error('Refresh token is missing')); - if (!_this._auth.refreshTokenValid()) - return reject(new Error('Refresh token has expired')); - if (!_this._queue.isPaused()) - return reject(new Error('Queue was resumed before refresh call')); - resolve(_this._tokenRequest(Platform._tokenEndpoint, { - "grant_type": "refresh_token", - "refresh_token": _this._auth.refreshToken(), - "access_token_ttl": Platform._accessTokenTtl, - "refresh_token_ttl": _this._auth.remember() ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl - })); - }, _this._refreshDelayMs); - }); - return refresh.then(function (res) { - // This means refresh has happened elsewhere and we are here because of timeout - if (res && res.json && res.json()) { - var json = res.json(); - sdk.core.log.info('Platform.refresh(): Token was refreshed', res); - if (!json.refresh_token || !json.access_token) { - throw sdk.http.Client.makeError(new Error('Malformed OAuth response'), res); - } - _this._auth.setData(json); - _this._queue.resume(); - } - _this.emit(_this.events.refreshSuccess, res); - return res; - }).catch(function (e) { - e = sdk.http.Client.makeError(e); - if (_this._clearCacheOnRefreshError) { - _this._cache.clean(); + + throw new Error('Events are undefined'); + + case 6: + context$2$0.next = 8; + return regeneratorRuntime.awrap(this._platform.post('/restapi/v1.0/subscription', { + eventFilters: this._getFullEventFilters(), + deliveryMode: { + transportType: 'PubNub' } - _this.emit(_this.events.accessViolation, e); - _this.emit(_this.events.refreshError, e); - throw e; - }); - }; - /** - * @returns {Promise} - */ - Platform.prototype.logout = function () { - var _this = this; - this._queue.pause(); - return this._tokenRequest(Platform._revokeEndpoint, { - token: this._auth.accessToken() - }).then(function (res) { - _this._queue.resume(); - _this._cache.clean(); - _this.emit(_this.events.logoutSuccess, res); - return res; - }).catch(function (e) { - _this._queue.resume(); - _this.emit(_this.events.accessViolation, e); - _this.emit(_this.events.logoutError, e); - throw e; - }); - }; - Platform.prototype.inflateRequest = function (request, options) { - var _this = this; - options = options || {}; - if (options.skipAuthCheck) - return sdk.externals._Promise.resolve(request); - return this - ._ensureAuthentication() - .then(function () { - request.headers.set('Authorization', _this._authHeader()); - request.url = _this.createUrl(request.url, { addServer: true }); - //TODO Add User-Agent here - return request; - }); - }; - Platform.prototype.sendRequest = function (request, options) { - var _this = this; - return this - .inflateRequest(request, options) - .then(function (req) { - return _this._client.sendRequest(req); - }) - .catch(function (e) { - // Guard is for errors that come from polling - if (!e.apiResponse || !e.apiResponse.response() || (e.apiResponse.response().status != 401)) - throw e; - _this._auth.cancelAccessToken(); - return _this.sendRequest(request, options); - }); - }; - /** - * General purpose function to send anything to server - */ - Platform.prototype.send = function (url, options) { - try { - //FIXME https://github.com/bitinn/node-fetch/issues/43 - url = this.createUrl(url, { addServer: true }); - return this.sendRequest(sdk.http.Client.createRequest(url, options), options); - } - catch (e) { - return sdk.externals._Promise.reject(e); - } - }; - Platform.prototype.get = function (url, options) { - options = options || {}; - options.method = 'GET'; - return this.send(url, options); - }; - Platform.prototype.post = function (url, options) { - options = options || {}; - options.method = 'POST'; - return this.send(url, options); - }; - Platform.prototype.put = function (url, options) { - options = options || {}; - options.method = 'PUT'; - return this.send(url, options); - }; - Platform.prototype['delete'] = function (url, options) { + })); + + case 8: + response = context$2$0.sent; + json = response.json(); + + this.setSubscription(json).emit(this.events.subscribeSuccess, response); + + return context$2$0.abrupt('return', response); + + 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); + + this.reset().emit(this.events.subscribeError, context$2$0.t0); + + throw context$2$0.t0; + + case 19: + case 'end': + return context$2$0.stop(); + } + }, null, this, [[0, 14]]); + }; + + /** + * @param {{events?:string[]}} [options] New array of events + * @returns {Promise} + */ + + Subscription.prototype.renew = function renew(options) { + 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 || {}; - options.method = 'DELETE'; - return this.send(url, options); - }; - Platform.prototype._tokenRequest = function (path, body) { - return this.send(path, { - skipAuthCheck: true, - body: body, - method: 'POST', - headers: { - 'Authorization': 'Basic ' + this._apiKey(), - 'Content-Type': 'application/x-www-form-urlencoded' - } - }); - }; - Platform.prototype._ensureAuthentication = function () { - if (this._isAccessTokenValid()) - return sdk.externals._Promise.resolve(null); - return this.refresh(); - }; - Platform.prototype._isAccessTokenValid = function () { - return (this._auth.accessTokenValid() && !this._queue.isPaused()); - }; - Platform.prototype._refreshPolling = function () { - var _this = this; - sdk.core.log.warn('Platform.refresh(): Refresh is already in progress, polling started'); - return this._queue.poll().then(function () { - if (!_this._isAccessTokenValid()) { - throw new Error('Automatic authentification timeout'); - } - return null; - }); - }; - Platform.prototype._apiKey = function () { - var apiKey = this._appKey + ':' + this._appSecret; - return (typeof btoa == 'function') ? btoa(apiKey) : new Buffer(apiKey).toString('base64'); - }; - Platform.prototype._authHeader = function () { - var token = this._auth.accessToken(); - return this._auth.tokenType() + (token ? ' ' + token : ''); - }; - Platform._urlPrefix = '/restapi'; - Platform._apiVersion = 'v1.0'; - Platform._accessTokenTtl = null; // Platform server by default sets it to 60 * 60 = 1 hour - Platform._refreshTokenTtl = 10 * 60 * 60; // 10 hours - Platform._refreshTokenTtlRemember = 7 * 24 * 60 * 60; // 1 week - Platform._tokenEndpoint = '/restapi/oauth/token'; - Platform._revokeEndpoint = '/restapi/oauth/revoke'; - Platform._authorizeEndpoint = '/restapi/oauth/authorize'; - return Platform; - })(sdk.core.Observable); - platform.Platform = Platform; - })(platform = sdk.platform || (sdk.platform = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -/// -/// -/// -/// -/// -/// -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var subscription; - (function (subscription_1) { - var Subscription = (function (_super) { - __extends(Subscription, _super); - function Subscription(pubnubFactory, platform) { - _super.call(this); - this._renewHandicapMs = 2 * 60 * 1000; - this.events = { - notification: 'notification', - removeSuccess: 'removeSuccess', - removeError: 'removeError', - renewSuccess: 'renewSuccess', - renewError: 'renewError', - subscribeSuccess: 'subscribeSuccess', - subscribeError: 'subscribeError' - }; - this._pubnubFactory = pubnubFactory; - this._platform = platform; - this._pubnub = null; - this._eventFilters = []; - this._timeout = null; - this._subscription = null; - } - Subscription.prototype.alive = function () { - return this._subscription && - this._subscription.id && - this._subscription.deliveryMode && - this._subscription.deliveryMode.subscriberKey && - this._subscription.deliveryMode.address; - }; - Subscription.prototype.setSubscription = function (subscription) { + + if (options.events) this.setEventFilters(options.events); + this._clearTimeout(); - this._subscription = subscription; - if (!this._pubnub) - this._subscribeAtPubnub(); - this._setTimeout(); - return this; - }; - Subscription.prototype.subscription = function () { - return this._subscription; - }; - /** - * Creates or updates subscription if there is an active one - * @param {{events?:string[]}} [options] New array of events - * @returns {Promise} - */ - Subscription.prototype.register = function (options) { + if (this.alive()) { - return this.renew(options); + context$2$0.next = 6; + break; } - else { - return this.subscribe(options); + + throw new Error('Subscription is not alive'); + + case 6: + if (this.eventFilters().length) { + context$2$0.next = 8; + break; } - }; - Subscription.prototype.addEvents = function (events) { - this._eventFilters = this._eventFilters.concat(events); - return this; - }; - Subscription.prototype.setEvents = function (events) { - this._eventFilters = events; - return this; - }; - Subscription.prototype.subscribe = function (options) { - var _this = this; - options = options || {}; - if (options.events) - this.setEvents(options.events); - this._clearTimeout(); - return new sdk.externals._Promise(function (resolve, reject) { - if (!_this._eventFilters || !_this._eventFilters.length) - throw new Error('Events are undefined'); - resolve(_this._platform.post('/restapi/v1.0/subscription', { - body: { - eventFilters: _this._getFullEventFilters(), - deliveryMode: { - transportType: 'PubNub' - } - } - })); - }).then(function (ajax) { - _this.setSubscription(ajax.json()) - .emit(_this.events.subscribeSuccess, ajax); - return ajax; - }).catch(function (e) { - e = sdk.http.Client.makeError(e); - _this.reset() - .emit(_this.events.subscribeError, e); - throw e; - }); - }; - Subscription.prototype.renew = function (options) { - var _this = this; - options = options || {}; - if (options.events) - this.setEvents(options.events); - this._clearTimeout(); - return new sdk.externals._Promise(function (resolve, reject) { - if (!_this.alive()) - throw new Error('Subscription is not alive'); - if (!_this._eventFilters || !_this._eventFilters.length) - throw new Error('Events are undefined'); - return _this._platform.put('/restapi/v1.0/subscription/' + _this._subscription.id, { - body: { - eventFilters: _this._getFullEventFilters() - } - }); - }) - .then(function (ajax) { - _this.setSubscription(ajax.json()) - .emit(_this.events.renewSuccess, ajax.json()); - return ajax; - }) - .catch(function (e) { - e = sdk.http.Client.makeError(e); - _this.reset() - .emit(_this.events.renewError, e); - throw e; - }); - }; - Subscription.prototype.remove = function () { - var _this = this; - return new sdk.externals._Promise(function (resolve, reject) { - if (!_this._subscription || !_this._subscription.id) - throw new Error('Subscription ID is required'); - resolve(_this._platform.delete('/restapi/v1.0/subscription/' + _this._subscription.id)); - }).then(function (ajax) { - _this.reset() - .emit(_this.events.removeSuccess, ajax); - return ajax; - }).catch(function (e) { - e = sdk.http.Client.makeError(e); - _this.emit(_this.events.removeError, e); - throw e; - }); - }; - /** - * Remove subscription and disconnect from PUBNUB - * This method resets subscription at client side but backend is not notified - */ - Subscription.prototype.reset = function () { - this._clearTimeout(); - if (this.alive() && this._pubnub) - this._pubnub.unsubscribe({ channel: this._subscription.deliveryMode.address }); - this._subscription = null; - return this; - }; - Subscription.prototype.destroy = function () { - this.reset(); - sdk.core.log.info('RC.subscription.Subscription: Destroyed'); - return _super.prototype.destroy.call(this); - }; - Subscription.prototype._getFullEventFilters = function () { - var _this = this; - return this._eventFilters.map(function (event) { - return _this._platform.createUrl(event); - }); - }; - Subscription.prototype._setTimeout = function () { - var _this = this; - this._clearTimeout(); - if (!this.alive()) - throw new Error('Subscription is not alive'); - var timeToExpiration = (this._subscription.expiresIn * 1000) - this._renewHandicapMs; - this._timeout = setTimeout(function () { - _this.renew({}); - }, timeToExpiration); - return this; - }; - Subscription.prototype._clearTimeout = function () { - clearTimeout(this._timeout); - return this; - }; - Subscription.prototype._decrypt = function (message) { - if (!this.alive()) - throw new Error('Subscription is not alive'); - if (this._subscription.deliveryMode.encryptionKey) { - var PUBNUB = this._pubnubFactory.getPubnub(); - message = PUBNUB.crypto_obj.decrypt(message, this._subscription.deliveryMode.encryptionKey, { - encryptKey: false, - keyEncoding: 'base64', - keyLength: 128, - mode: 'ecb' - }); + + throw new Error('Events are undefined'); + + case 8: + context$2$0.next = 10; + return regeneratorRuntime.awrap(this._platform.put('/restapi/v1.0/subscription/' + this._subscription.id, { + eventFilters: this._getFullEventFilters() + })); + + case 10: + response = context$2$0.sent; + json = response.json(); + + this.setSubscription(json).emit(this.events.renewSuccess, response); + + return context$2$0.abrupt('return', response); + + case 16: + context$2$0.prev = 16; + context$2$0.t0 = context$2$0['catch'](0); + + context$2$0.t0 = this._platform.client().makeError(context$2$0.t0); + + this.reset().emit(this.events.renewError, context$2$0.t0); + + throw context$2$0.t0; + + case 21: + case 'end': + return context$2$0.stop(); + } + }, null, this, [[0, 16]]); + }; + + /** + * @returns {Promise} + */ + + Subscription.prototype.remove = function remove() { + var response; + return regeneratorRuntime.async(function remove$(context$2$0) { + while (1) switch (context$2$0.prev = context$2$0.next) { + case 0: + context$2$0.prev = 0; + + if (this.alive()) { + context$2$0.next = 3; + break; } - return message; - }; - Subscription.prototype._notify = function (message) { - this.emit(this.events.notification, this._decrypt(message)); - return this; - }; - Subscription.prototype._subscribeAtPubnub = function () { - var _this = this; - if (!this.alive()) - throw new Error('Subscription is not alive'); - var PUBNUB = this._pubnubFactory.getPubnub(); - this._pubnub = PUBNUB.init({ - ssl: true, - subscribe_key: this._subscription.deliveryMode.subscriberKey - }); - this._pubnub.ready(); - this._pubnub.subscribe({ - channel: this._subscription.deliveryMode.address, - message: function (message, env, channel) { - sdk.core.log.info('RC.core.Subscription: Incoming message', message); - _this._notify(message); - }, - connect: function () { - sdk.core.log.info('RC.core.Subscription: PUBNUB connected'); - } - }); - return this; - }; - return Subscription; - })(sdk.core.Observable); - subscription_1.Subscription = Subscription; - })(subscription = sdk.subscription || (sdk.subscription = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -/// -/// -/// -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var pubnub; - (function (pubnub) { - var PubnubMock = (function (_super) { - __extends(PubnubMock, _super); - function PubnubMock(options) { - _super.call(this); - this.options = options; - this.crypto_obj = sdk.externals._PUBNUB.crypto_obj; - } - PubnubMock.prototype.ready = function () { }; - PubnubMock.prototype.subscribe = function (options) { - this.on('message-' + options.channel, options.message); - }; - PubnubMock.prototype.unsubscribe = function (options) { - this.off('message-' + options.channel); - }; - PubnubMock.prototype.receiveMessage = function (msg, channel) { - this.emit('message-' + channel, msg, 'env', channel); - }; - return PubnubMock; - })(sdk.core.Observable); - pubnub.PubnubMock = PubnubMock; - var PubnubMockFactory = (function () { - function PubnubMockFactory() { - this.crypto_obj = sdk.externals._PUBNUB.crypto_obj; - } - PubnubMockFactory.prototype.init = function (options) { - return new PubnubMock(options); - }; - return PubnubMockFactory; - })(); - pubnub.PubnubMockFactory = PubnubMockFactory; - })(pubnub = sdk.pubnub || (sdk.pubnub = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -/// -/// -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var pubnub; - (function (pubnub) { - var PubnubFactory = (function () { - function PubnubFactory(flag) { - this._useMock = false; - this._useMock = !!flag; - this._mock = new pubnub.PubnubMockFactory(); - } - PubnubFactory.prototype.getPubnub = function () { - return this._useMock ? this._mock : sdk.externals._PUBNUB; - }; - return PubnubFactory; - })(); - pubnub.PubnubFactory = PubnubFactory; - })(pubnub = sdk.pubnub || (sdk.pubnub = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var SDK = (function () { - function SDK(options) { - options = options || {}; - sdk.externals.get(); - this._mockRegistry = new sdk.mocks.Registry(); - this._cache = new sdk.core.Cache(typeof localStorage !== 'undefined' ? localStorage : {}, options.cachePrefix); - this._client = options.useHttpMock ? new sdk.http.ClientMock(this._mockRegistry) : new sdk.http.Client(); - this._platform = new sdk.platform.Platform(this._client, this._cache, options.server, options.appKey, options.appSecret); - this._pubnubFactory = new sdk.pubnub.PubnubFactory(options.usePubnubMock); - //TODO Link Platform events with Subscriptions and the rest + + throw new Error('Subscription is not alive'); + + case 3: + context$2$0.next = 5; + return regeneratorRuntime.awrap(this._platform['delete']('/restapi/v1.0/subscription/' + this._subscription.id)); + + case 5: + response = context$2$0.sent; + + this.reset().emit(this.events.removeSuccess, response); + + return context$2$0.abrupt('return', response); + + case 10: + context$2$0.prev = 10; + context$2$0.t0 = context$2$0['catch'](0); + + context$2$0.t0 = this._platform.client().makeError(context$2$0.t0); + + this.emit(this.events.removeError, context$2$0.t0); + + throw context$2$0.t0; + + case 15: + case 'end': + return context$2$0.stop(); } - SDK.prototype.platform = function () { - return this._platform; - }; - SDK.prototype.cache = function () { - return this._cache; - }; - SDK.prototype.createSubscription = function () { - return new sdk.subscription.Subscription(this._pubnubFactory, this._platform); - }; - SDK.prototype.createPageVisibility = function () { - return new sdk.core.PageVisibility(); - }; - SDK.prototype.createObservable = function () { - return new sdk.core.Observable(); - }; - SDK.prototype.log = function () { - return sdk.core.log; - }; - SDK.prototype.utils = function () { - return sdk.core.utils; - }; - SDK.prototype.mockRegistry = function () { return this._mockRegistry; }; - SDK.version = '2.0.0'; - SDK.server = { - sandbox: 'https://platform.devtest.ringcentral.com', - production: 'https://platform.ringcentral.com' - }; - return SDK; - })(); - sdk.SDK = SDK; - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -var e = RingCentral.sdk.externals.get(); -if (typeof define === 'function' && define.amd) { - define(['pubnub'], function (PUBNUB) { - e._PUBNUB = PUBNUB; - return RingCentral.sdk; + }, null, this, [[0, 10]]); + }; + + /** + * Remove subscription and disconnect from PUBNUB + * This method resets subscription at client side but backend is not notified + */ + + Subscription.prototype.reset = function reset() { + this._clearTimeout(); + if (this.alive() && this._pubnub) this._pubnub.unsubscribe({ channel: this._subscription.deliveryMode.address }); + this._subscription = {}; + return this; + }; + + /** + * + * @param {string} cacheKey + * @param {string[]} events + * @return {Subscription} + */ + + 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); + } + + return this; + }; + + Subscription.prototype._getFullEventFilters = function _getFullEventFilters() { + var _this2 = this; + + return this.eventFilters().map(function (event) { + return _this2._platform.createUrl(event); + }); + }; + + Subscription.prototype._setTimeout = function _setTimeout() { + var _this3 = this; + + this._clearTimeout(); + + if (!this.alive()) throw new Error('Subscription is not alive'); + + _coreUtils.poll(function (next) { + + if (_this3.alive()) return next(); + + _this3.renew(); + }, Subscription._pollInterval, this._timeout); + + return this; + }; + + Subscription.prototype._clearTimeout = function _clearTimeout() { + + _coreUtils.stopPolling(this._timeout); + + return this; + }; + + Subscription.prototype._decrypt = function _decrypt(message) { + + if (!this.alive()) throw new Error('Subscription is not alive'); + + if (this._subscription.deliveryMode.encryptionKey) { + + var PUBNUB = this._pubnubFactory; + + message = PUBNUB.crypto_obj.decrypt(message, this._subscription.deliveryMode.encryptionKey, { + encryptKey: false, + keyEncoding: 'base64', + keyLength: 128, + mode: 'ecb' + }); + } + + return message; + }; + + Subscription.prototype._notify = function _notify(message) { + + this.emit(this.events.notification, this._decrypt(message)); + + return this; + }; + + Subscription.prototype._subscribeAtPubnub = function _subscribeAtPubnub() { + + if (!this.alive()) throw new Error('Subscription is not alive'); + + var PUBNUB = this._pubnubFactory; + + this._pubnub = PUBNUB.init({ + ssl: true, + subscribe_key: this._subscription.deliveryMode.subscriberKey + }); + + this._pubnub.ready(); + + this._pubnub.subscribe({ + channel: this._subscription.deliveryMode.address, + message: this._notify.bind(this), + connect: function connect() {} + }); + + return this; + }; + + return Subscription; +})(_coreObservable2['default']); + +exports['default'] = Subscription; +module.exports = exports['default']; + +/***/ }, +/* 21 */ +/***/ function(module, exports) { + +/* WEBPACK VAR INJECTION */(function(global) {/** + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * https://raw.github.com/facebook/regenerator/master/LICENSE file. An + * additional grant of patent rights can be found in the PATENTS file in + * the same directory. + */ + +!(function(global) { + "use strict"; + + var hasOwn = Object.prototype.hasOwnProperty; + var undefined; // More compressible than void 0. + var iteratorSymbol = + typeof Symbol === "function" && Symbol.iterator || "@@iterator"; + + var inModule = typeof module === "object"; + var runtime = global.regeneratorRuntime; + if (runtime) { + if (inModule) { + // If regeneratorRuntime is defined globally and we're in a module, + // make the exports object identical to regeneratorRuntime. + module.exports = runtime; + } + // Don't bother evaluating the rest of this file if the runtime was + // already defined globally. + return; + } + + // Define the runtime globally (as expected by generated code) as either + // module.exports (if we're in a module) or a new, empty object. + runtime = global.regeneratorRuntime = inModule ? module.exports : {}; + + function wrap(innerFn, outerFn, self, tryLocsList) { + // If outerFn provided, then outerFn.prototype instanceof Generator. + var generator = Object.create((outerFn || Generator).prototype); + var context = new Context(tryLocsList || []); + + // The ._invoke method unifies the implementations of the .next, + // .throw, and .return methods. + generator._invoke = makeInvokeMethod(innerFn, self, context); + + return generator; + } + runtime.wrap = wrap; + + // Try/catch helper to minimize deoptimizations. Returns a completion + // record like context.tryEntries[i].completion. This interface could + // have been (and was previously) designed to take a closure to be + // invoked without arguments, but in all the cases we care about we + // already have an existing method we want to call, so there's no need + // to create a new function object. We can even get away with assuming + // the method takes exactly one argument, since that happens to be true + // in every case, so we don't have to touch the arguments object. The + // only additional allocation required is the completion record, which + // has a stable shape and so hopefully should be cheap to allocate. + function tryCatch(fn, obj, arg) { + try { + return { type: "normal", arg: fn.call(obj, arg) }; + } catch (err) { + return { type: "throw", arg: err }; + } + } + + var GenStateSuspendedStart = "suspendedStart"; + var GenStateSuspendedYield = "suspendedYield"; + var GenStateExecuting = "executing"; + var GenStateCompleted = "completed"; + + // Returning this object from the innerFn has the same effect as + // breaking out of the dispatch switch statement. + var ContinueSentinel = {}; + + // Dummy constructor functions that we use as the .constructor and + // .constructor.prototype properties for functions that return Generator + // objects. For full spec compliance, you may wish to configure your + // minifier not to mangle the names of these two functions. + function Generator() {} + function GeneratorFunction() {} + function GeneratorFunctionPrototype() {} + + var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype; + GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype; + GeneratorFunctionPrototype.constructor = GeneratorFunction; + GeneratorFunction.displayName = "GeneratorFunction"; + + // Helper for defining the .next, .throw, and .return methods of the + // Iterator interface in terms of a single ._invoke method. + function defineIteratorMethods(prototype) { + ["next", "throw", "return"].forEach(function(method) { + prototype[method] = function(arg) { + return this._invoke(method, arg); + }; }); -} -else if (typeof module === 'object' && module.exports) { - e._PUBNUB = require('pubnub'); - e._Promise = typeof (Promise) !== 'undefined' ? Promise : require('es6-promise').Promise; - e._fetch = require('node-fetch'); - e._Request = e._fetch['Request']; - e._Response = e._fetch['Response']; - e._Headers = e._fetch['Headers']; - module.exports = RingCentral.sdk; -} -else { -} -/// -/// -/// -/// -/// -/// -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var http; - (function (http) { - var ClientMock = (function (_super) { - __extends(ClientMock, _super); - function ClientMock(registry) { - _super.call(this); - this._registry = registry; - } - ClientMock.prototype._loadResponse = function (request) { - var _this = this; - return new sdk.externals._Promise(function (resolve) { - sdk.core.log.debug('API REQUEST', request.method, request.url); - var mock = _this._registry.find(request); - resolve(mock.getResponse(request)); - }); - }; - return ClientMock; - })(http.Client); - http.ClientMock = ClientMock; - })(http = sdk.http || (sdk.http = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); -/// -/// -/// -/// -/// -/// -/// -/// -/// -var RingCentral; -(function (RingCentral) { - var sdk; - (function (sdk) { - var platform; - (function (platform) { - var Auth = (function () { - function Auth(cache, cacheId) { - this._cache = cache; - this._cacheId = cacheId; - } - Auth.prototype.accessToken = function () { - return this.data().access_token; - }; - Auth.prototype.refreshToken = function () { - return this.data().refresh_token; - }; - Auth.prototype.tokenType = function () { - return this.data().token_type; - }; - Auth.prototype.data = function () { - return this._cache.getItem(this._cacheId) || { - token_type: '', - access_token: '', - expires_in: 0, - refresh_token: '', - refresh_token_expires_in: 0 - }; - }; - Auth.prototype.setData = function (authData) { - var oldAuthData = this.data(); - authData = sdk.core.utils.extend({}, oldAuthData, authData); - authData.expire_time = Date.now() + (authData.expires_in * 1000); - authData.refresh_token_expire_time = Date.now() + (authData.refresh_token_expires_in * 1000); - sdk.core.log.info('Auth.setData(): Tokens were updated, new:', authData, ', old:', oldAuthData); - this._cache.setItem(this._cacheId, authData); - return this; - }; - /** - * Check if there is a valid (not expired) access token - */ - Auth.prototype.accessTokenValid = function () { - var authData = this.data(); - return (authData.token_type === Auth.forcedTokenType || (authData.expire_time - Auth.refreshHandicapMs > Date.now())); - }; - /** - * Check if there is a valid (not expired) access token - */ - Auth.prototype.refreshTokenValid = function () { - return (this.data().refresh_token_expire_time > Date.now()); - }; - Auth.prototype.cancelAccessToken = function () { - return this.setData({ - access_token: '', - expires_in: 0 - }); - }; - /** - * This method sets a special authentication mode used in Service Web - * @return {Platform} - */ - Auth.prototype.forceAuthentication = function () { - this.setData({ - token_type: Auth.forcedTokenType, - access_token: '', - expires_in: 0, - refresh_token: '', - refresh_token_expires_in: 0 - }); - return this; - }; - Auth.prototype.setRemember = function (remember) { - return this.setData({ remember: remember }); - }; - Auth.prototype.remember = function () { - return !!this.data().remember; - }; - Auth.refreshHandicapMs = 60 * 1000; // 1 minute - Auth.forcedTokenType = 'forced'; - return Auth; - })(); - platform.Auth = Auth; - })(platform = sdk.platform || (sdk.platform = {})); - })(sdk = RingCentral.sdk || (RingCentral.sdk = {})); -})(RingCentral || (RingCentral = {})); + } + + runtime.isGeneratorFunction = function(genFun) { + var ctor = typeof genFun === "function" && genFun.constructor; + return ctor + ? ctor === GeneratorFunction || + // For the native GeneratorFunction constructor, the best we can + // do is to check its .name property. + (ctor.displayName || ctor.name) === "GeneratorFunction" + : false; + }; + + runtime.mark = function(genFun) { + if (Object.setPrototypeOf) { + Object.setPrototypeOf(genFun, GeneratorFunctionPrototype); + } else { + genFun.__proto__ = GeneratorFunctionPrototype; + } + genFun.prototype = Object.create(Gp); + return genFun; + }; + + // Within the body of any async function, `await x` is transformed to + // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test + // `value instanceof AwaitArgument` to determine if the yielded value is + // meant to be awaited. Some may consider the name of this method too + // cutesy, but they are curmudgeons. + runtime.awrap = function(arg) { + return new AwaitArgument(arg); + }; + + function AwaitArgument(arg) { + this.arg = arg; + } + + function AsyncIterator(generator) { + // This invoke function is written in a style that assumes some + // calling function (or Promise) will handle exceptions. + function invoke(method, arg) { + var result = generator[method](arg); + var value = result.value; + return value instanceof AwaitArgument + ? Promise.resolve(value.arg).then(invokeNext, invokeThrow) + : Promise.resolve(value).then(function(unwrapped) { + // When a yielded Promise is resolved, its final value becomes + // the .value of the Promise<{value,done}> result for the + // current iteration. If the Promise is rejected, however, the + // result for this iteration will be rejected with the same + // reason. Note that rejections of yielded Promises are not + // thrown back into the generator function, as is the case + // when an awaited Promise is rejected. This difference in + // behavior between yield and await is important, because it + // allows the consumer to decide what to do with the yielded + // rejection (swallow it and continue, manually .throw it back + // into the generator, abandon iteration, whatever). With + // await, by contrast, there is no opportunity to examine the + // rejection reason outside the generator function, so the + // only option is to throw it from the await expression, and + // let the generator function handle the exception. + result.value = unwrapped; + return result; + }); + } + + if (typeof process === "object" && process.domain) { + invoke = process.domain.bind(invoke); + } + + var invokeNext = invoke.bind(generator, "next"); + var invokeThrow = invoke.bind(generator, "throw"); + var invokeReturn = invoke.bind(generator, "return"); + var previousPromise; + + function enqueue(method, arg) { + function callInvokeWithMethodAndArg() { + return invoke(method, arg); + } + + return previousPromise = + // If enqueue has been called before, then we want to wait until + // all previous Promises have been resolved before calling invoke, + // so that results are always delivered in the correct order. If + // enqueue has not been called before, then it is important to + // call invoke immediately, without waiting on a callback to fire, + // so that the async generator function has the opportunity to do + // any necessary setup in a predictable way. This predictability + // is why the Promise constructor synchronously invokes its + // executor callback, and why async functions synchronously + // execute code before the first await. Since we implement simple + // async functions in terms of async generators, it is especially + // important to get this right, even though it requires care. + previousPromise ? previousPromise.then( + callInvokeWithMethodAndArg, + // Avoid propagating failures to Promises returned by later + // invocations of the iterator. + callInvokeWithMethodAndArg + ) : new Promise(function (resolve) { + resolve(callInvokeWithMethodAndArg()); + }); + } + + // Define the unified helper method that is used to implement .next, + // .throw, and .return (see defineIteratorMethods). + this._invoke = enqueue; + } + + defineIteratorMethods(AsyncIterator.prototype); + + // Note that simple async functions are implemented on top of + // AsyncIterator objects; they just return a Promise for the value of + // the final result produced by the iterator. + runtime.async = function(innerFn, outerFn, self, tryLocsList) { + var iter = new AsyncIterator( + wrap(innerFn, outerFn, self, tryLocsList) + ); + + return runtime.isGeneratorFunction(outerFn) + ? iter // If outerFn is a generator, return the full iterator. + : iter.next().then(function(result) { + return result.done ? result.value : iter.next(); + }); + }; + + function makeInvokeMethod(innerFn, self, context) { + var state = GenStateSuspendedStart; + + return function invoke(method, arg) { + if (state === GenStateExecuting) { + throw new Error("Generator is already running"); + } + + if (state === GenStateCompleted) { + if (method === "throw") { + throw arg; + } + + // Be forgiving, per 25.3.3.3.3 of the spec: + // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume + return doneResult(); + } + + while (true) { + var delegate = context.delegate; + if (delegate) { + if (method === "return" || + (method === "throw" && delegate.iterator[method] === undefined)) { + // A return or throw (when the delegate iterator has no throw + // method) always terminates the yield* loop. + context.delegate = null; + + // If the delegate iterator has a return method, give it a + // chance to clean up. + var returnMethod = delegate.iterator["return"]; + if (returnMethod) { + var record = tryCatch(returnMethod, delegate.iterator, arg); + if (record.type === "throw") { + // If the return method threw an exception, let that + // exception prevail over the original return or throw. + method = "throw"; + arg = record.arg; + continue; + } + } + + if (method === "return") { + // Continue with the outer return, now that the delegate + // iterator has been terminated. + continue; + } + } + + var record = tryCatch( + delegate.iterator[method], + delegate.iterator, + arg + ); + + if (record.type === "throw") { + context.delegate = null; + + // Like returning generator.throw(uncaught), but without the + // overhead of an extra function call. + method = "throw"; + arg = record.arg; + continue; + } + + // Delegate generator ran and handled its own exceptions so + // regardless of what the method was, we continue as if it is + // "next" with an undefined arg. + method = "next"; + arg = undefined; + + var info = record.arg; + if (info.done) { + context[delegate.resultName] = info.value; + context.next = delegate.nextLoc; + } else { + state = GenStateSuspendedYield; + return info; + } + + context.delegate = null; + } + + if (method === "next") { + if (state === GenStateSuspendedYield) { + context.sent = arg; + } else { + context.sent = undefined; + } + + } else if (method === "throw") { + if (state === GenStateSuspendedStart) { + state = GenStateCompleted; + throw arg; + } + + if (context.dispatchException(arg)) { + // If the dispatched exception was caught by a catch block, + // then let that catch block handle the exception normally. + method = "next"; + arg = undefined; + } + + } else if (method === "return") { + context.abrupt("return", arg); + } + + state = GenStateExecuting; + + var record = tryCatch(innerFn, self, context); + if (record.type === "normal") { + // If an exception is thrown from innerFn, we leave state === + // GenStateExecuting and loop back for another invocation. + state = context.done + ? GenStateCompleted + : GenStateSuspendedYield; + + var info = { + value: record.arg, + done: context.done + }; + + if (record.arg === ContinueSentinel) { + if (context.delegate && method === "next") { + // Deliberately forget the last sent value so that we don't + // accidentally pass it on to the delegate. + arg = undefined; + } + } else { + return info; + } + + } else if (record.type === "throw") { + state = GenStateCompleted; + // Dispatch the exception by looping back around to the + // context.dispatchException(arg) call above. + method = "throw"; + arg = record.arg; + } + } + }; + } + + // Define Generator.prototype.{next,throw,return} in terms of the + // unified ._invoke helper method. + defineIteratorMethods(Gp); + + Gp[iteratorSymbol] = function() { + return this; + }; + + Gp.toString = function() { + return "[object Generator]"; + }; + + function pushTryEntry(locs) { + var entry = { tryLoc: locs[0] }; + + if (1 in locs) { + entry.catchLoc = locs[1]; + } + + if (2 in locs) { + entry.finallyLoc = locs[2]; + entry.afterLoc = locs[3]; + } + + this.tryEntries.push(entry); + } + + function resetTryEntry(entry) { + var record = entry.completion || {}; + record.type = "normal"; + delete record.arg; + entry.completion = record; + } + + function Context(tryLocsList) { + // The root entry object (effectively a try statement without a catch + // or a finally block) gives us a place to store values thrown from + // locations where there is no enclosing try statement. + this.tryEntries = [{ tryLoc: "root" }]; + tryLocsList.forEach(pushTryEntry, this); + this.reset(true); + } + + runtime.keys = function(object) { + var keys = []; + for (var key in object) { + keys.push(key); + } + keys.reverse(); + + // Rather than returning an object with a next method, we keep + // things simple and return the next function itself. + return function next() { + while (keys.length) { + var key = keys.pop(); + if (key in object) { + next.value = key; + next.done = false; + return next; + } + } + + // To avoid creating an additional object, we just hang the .value + // and .done properties off the next function object itself. This + // also ensures that the minifier will not anonymize the function. + next.done = true; + return next; + }; + }; + + function values(iterable) { + if (iterable) { + var iteratorMethod = iterable[iteratorSymbol]; + if (iteratorMethod) { + return iteratorMethod.call(iterable); + } + + if (typeof iterable.next === "function") { + return iterable; + } + + if (!isNaN(iterable.length)) { + var i = -1, next = function next() { + while (++i < iterable.length) { + if (hasOwn.call(iterable, i)) { + next.value = iterable[i]; + next.done = false; + return next; + } + } + + next.value = undefined; + next.done = true; + + return next; + }; + + return next.next = next; + } + } + + // Return an iterator with no values. + return { next: doneResult }; + } + runtime.values = values; + + function doneResult() { + return { value: undefined, done: true }; + } + + Context.prototype = { + constructor: Context, + + reset: function(skipTempReset) { + this.prev = 0; + this.next = 0; + this.sent = undefined; + this.done = false; + this.delegate = null; + + this.tryEntries.forEach(resetTryEntry); + + if (!skipTempReset) { + for (var name in this) { + // Not sure about the optimal order of these conditions: + if (name.charAt(0) === "t" && + hasOwn.call(this, name) && + !isNaN(+name.slice(1))) { + this[name] = undefined; + } + } + } + }, + + stop: function() { + this.done = true; + + var rootEntry = this.tryEntries[0]; + var rootRecord = rootEntry.completion; + if (rootRecord.type === "throw") { + throw rootRecord.arg; + } + + return this.rval; + }, + + dispatchException: function(exception) { + if (this.done) { + throw exception; + } + + var context = this; + function handle(loc, caught) { + record.type = "throw"; + record.arg = exception; + context.next = loc; + return !!caught; + } + + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + var record = entry.completion; + + if (entry.tryLoc === "root") { + // Exception thrown outside of any try block that could handle + // it, so set the completion value of the entire function to + // throw the exception. + return handle("end"); + } + + if (entry.tryLoc <= this.prev) { + var hasCatch = hasOwn.call(entry, "catchLoc"); + var hasFinally = hasOwn.call(entry, "finallyLoc"); + + if (hasCatch && hasFinally) { + if (this.prev < entry.catchLoc) { + return handle(entry.catchLoc, true); + } else if (this.prev < entry.finallyLoc) { + return handle(entry.finallyLoc); + } + + } else if (hasCatch) { + if (this.prev < entry.catchLoc) { + return handle(entry.catchLoc, true); + } + + } else if (hasFinally) { + if (this.prev < entry.finallyLoc) { + return handle(entry.finallyLoc); + } + + } else { + throw new Error("try statement without catch or finally"); + } + } + } + }, + + abrupt: function(type, arg) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.tryLoc <= this.prev && + hasOwn.call(entry, "finallyLoc") && + this.prev < entry.finallyLoc) { + var finallyEntry = entry; + break; + } + } + + if (finallyEntry && + (type === "break" || + type === "continue") && + finallyEntry.tryLoc <= arg && + arg <= finallyEntry.finallyLoc) { + // Ignore the finally entry if control is not jumping to a + // location outside the try/catch block. + finallyEntry = null; + } + + var record = finallyEntry ? finallyEntry.completion : {}; + record.type = type; + record.arg = arg; + + if (finallyEntry) { + this.next = finallyEntry.finallyLoc; + } else { + this.complete(record); + } + + return ContinueSentinel; + }, + + complete: function(record, afterLoc) { + if (record.type === "throw") { + throw record.arg; + } + + if (record.type === "break" || + record.type === "continue") { + this.next = record.arg; + } else if (record.type === "return") { + this.rval = record.arg; + this.next = "end"; + } else if (record.type === "normal" && afterLoc) { + this.next = afterLoc; + } + }, + + finish: function(finallyLoc) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.finallyLoc === finallyLoc) { + this.complete(entry.completion, entry.afterLoc); + resetTryEntry(entry); + return ContinueSentinel; + } + } + }, + + "catch": function(tryLoc) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.tryLoc === tryLoc) { + var record = entry.completion; + if (record.type === "throw") { + var thrown = record.arg; + resetTryEntry(entry); + } + return thrown; + } + } + + // The context.catch method must only be called with a location + // argument that corresponds to a known catch block. + throw new Error("illegal catch attempt"); + }, + + delegateYield: function(iterable, resultName, nextLoc) { + this.delegate = { + iterator: values(iterable), + resultName: resultName, + nextLoc: nextLoc + }; + + return ContinueSentinel; + } + }; +})( + // Among the various tricks for obtaining a reference to the global + // object, this seems to be the most reliable technique that does not + // use indirect eval (which violates Content Security Policy). + typeof global === "object" ? global : + typeof window === "object" ? window : + typeof self === "object" ? self : this +); + +/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) +/***/ } +/******/ ]) +}); +; //# sourceMappingURL=ringcentral.js.map \ No newline at end of file diff --git a/build/ringcentral.js.map b/build/ringcentral.js.map index 76e6930a..c0771739 100644 --- a/build/ringcentral.js.map +++ b/build/ringcentral.js.map @@ -1 +1 @@ -{"version":3,"sources":["core/Cache.ts","core/Log.ts","core/Utils.ts","core/Observable.ts","core/PageVisibility.ts","mocks/Mock.ts","mocks/Registry.ts","externals/Externals.ts","http/ApiResponse.ts","http/Client.ts","platform/Queue.ts","platform/Platform.ts","subscription/Subscription.ts","pubnub/PubnubMock.ts","pubnub/PubnubFactory.ts","SDK.ts","http/ClientMock.ts","platform/Auth.ts"],"names":["RingCentral","RingCentral.sdk","RingCentral.sdk.core","RingCentral.sdk.core.Cache","RingCentral.sdk.core.Cache.constructor","RingCentral.sdk.core.Cache.setPrefix","RingCentral.sdk.core.Cache.setItem","RingCentral.sdk.core.Cache.removeItem","RingCentral.sdk.core.Cache.getItem","RingCentral.sdk.core.Cache.clean","RingCentral.sdk.core.Cache._prefixKey","RingCentral.sdk.core.Log","RingCentral.sdk.core.Log.constructor","RingCentral.sdk.core.Log.disableAll","RingCentral.sdk.core.Log.enableAll","RingCentral.sdk.core.Log.debug","RingCentral.sdk.core.Log.info","RingCentral.sdk.core.Log.warn","RingCentral.sdk.core.Log.error","RingCentral.sdk.core.Log.stack","RingCentral.sdk.core.Log._parseArguments","RingCentral.sdk.core.utils","RingCentral.sdk.core.utils.extend","RingCentral.sdk.core.utils.forEach","RingCentral.sdk.core.utils.queryStringify","RingCentral.sdk.core.utils.parseQueryString","RingCentral.sdk.core.utils.isEmail","RingCentral.sdk.core.utils.isPhoneNumber","RingCentral.sdk.core.utils.argumentsToArray","RingCentral.sdk.core.utils.isDate","RingCentral.sdk.core.utils.isFunction","RingCentral.sdk.core.utils.isArray","RingCentral.sdk.core.utils.isWindow","RingCentral.sdk.core.utils.isNan","RingCentral.sdk.core.utils.type","RingCentral.sdk.core.utils.isPlainObject","RingCentral.sdk.core.utils.getProperty","RingCentral.sdk.core.utils.poll","RingCentral.sdk.core.utils.stopPolling","RingCentral.sdk.core.utils.parseString","RingCentral.sdk.core.utils.parseNumber","RingCentral.sdk.core.utils.isNodeJS","RingCentral.sdk.core.utils.isBrowser","RingCentral.sdk.core.Observable","RingCentral.sdk.core.Observable.constructor","RingCentral.sdk.core.Observable.hasListeners","RingCentral.sdk.core.Observable.on","RingCentral.sdk.core.Observable.emit","RingCentral.sdk.core.Observable.off","RingCentral.sdk.core.Observable.destroy","RingCentral.sdk.core.PageVisibility","RingCentral.sdk.core.PageVisibility.constructor","RingCentral.sdk.core.PageVisibility.visible","RingCentral.sdk.mocks","RingCentral.sdk.mocks.Mock","RingCentral.sdk.mocks.Mock.constructor","RingCentral.sdk.mocks.Mock.path","RingCentral.sdk.mocks.Mock.method","RingCentral.sdk.mocks.Mock.test","RingCentral.sdk.mocks.Mock.getResponse","RingCentral.sdk.mocks.Mock.createResponse","RingCentral.sdk.mocks.Registry","RingCentral.sdk.mocks.Registry.constructor","RingCentral.sdk.mocks.Registry.add","RingCentral.sdk.mocks.Registry.clear","RingCentral.sdk.mocks.Registry.find","RingCentral.sdk.mocks.Registry.apiCall","RingCentral.sdk.mocks.Registry.authentication","RingCentral.sdk.mocks.Registry.logout","RingCentral.sdk.mocks.Registry.presenceLoad","RingCentral.sdk.mocks.Registry.subscribeGeneric","RingCentral.sdk.mocks.Registry.subscribeOnPresence","RingCentral.sdk.mocks.Registry.tokenRefresh","RingCentral.sdk.externals","RingCentral.sdk.externals.get","RingCentral.sdk.http","RingCentral.sdk.http.ApiResponse","RingCentral.sdk.http.ApiResponse.constructor","RingCentral.sdk.http.ApiResponse.response","RingCentral.sdk.http.ApiResponse.request","RingCentral.sdk.http.ApiResponse.ok","RingCentral.sdk.http.ApiResponse.text","RingCentral.sdk.http.ApiResponse.json","RingCentral.sdk.http.ApiResponse.error","RingCentral.sdk.http.ApiResponse.multipart","RingCentral.sdk.http.ApiResponse.multipartJson","RingCentral.sdk.http.ApiResponse._isContentType","RingCentral.sdk.http.ApiResponse._getContentType","RingCentral.sdk.http.ApiResponse._isMultipart","RingCentral.sdk.http.ApiResponse._isUrlEncoded","RingCentral.sdk.http.ApiResponse._isJson","RingCentral.sdk.http.ApiResponse.create","RingCentral.sdk.http.Client","RingCentral.sdk.http.Client.constructor","RingCentral.sdk.http.Client.sendRequest","RingCentral.sdk.http.Client._loadResponse","RingCentral.sdk.http.Client.makeError","RingCentral.sdk.http.Client.cloneResponse","RingCentral.sdk.http.Client.createResponse","RingCentral.sdk.http.Client.createRequest","RingCentral.sdk.platform","RingCentral.sdk.platform.Queue","RingCentral.sdk.platform.Queue.constructor","RingCentral.sdk.platform.Queue.isPaused","RingCentral.sdk.platform.Queue.pause","RingCentral.sdk.platform.Queue.resume","RingCentral.sdk.platform.Queue.poll","RingCentral.sdk.platform.Queue.releaseTimeout","RingCentral.sdk.platform.Queue.pollInterval","RingCentral.sdk.platform.Queue.setReleaseTimeout","RingCentral.sdk.platform.Queue.setPollInterval","RingCentral.sdk.platform.Platform","RingCentral.sdk.platform.Platform.constructor","RingCentral.sdk.platform.Platform.auth","RingCentral.sdk.platform.Platform.createUrl","RingCentral.sdk.platform.Platform.authUrl","RingCentral.sdk.platform.Platform.parseAuthRedirectUrl","RingCentral.sdk.platform.Platform.loggedIn","RingCentral.sdk.platform.Platform.login","RingCentral.sdk.platform.Platform.refresh","RingCentral.sdk.platform.Platform.logout","RingCentral.sdk.platform.Platform.inflateRequest","RingCentral.sdk.platform.Platform.sendRequest","RingCentral.sdk.platform.Platform.send","RingCentral.sdk.platform.Platform.get","RingCentral.sdk.platform.Platform.post","RingCentral.sdk.platform.Platform.put","RingCentral.sdk.platform.Platform.delete","RingCentral.sdk.platform.Platform._tokenRequest","RingCentral.sdk.platform.Platform._ensureAuthentication","RingCentral.sdk.platform.Platform._isAccessTokenValid","RingCentral.sdk.platform.Platform._refreshPolling","RingCentral.sdk.platform.Platform._apiKey","RingCentral.sdk.platform.Platform._authHeader","RingCentral.sdk.subscription","RingCentral.sdk.subscription.Subscription","RingCentral.sdk.subscription.Subscription.constructor","RingCentral.sdk.subscription.Subscription.alive","RingCentral.sdk.subscription.Subscription.setSubscription","RingCentral.sdk.subscription.Subscription.subscription","RingCentral.sdk.subscription.Subscription.register","RingCentral.sdk.subscription.Subscription.addEvents","RingCentral.sdk.subscription.Subscription.setEvents","RingCentral.sdk.subscription.Subscription.subscribe","RingCentral.sdk.subscription.Subscription.renew","RingCentral.sdk.subscription.Subscription.remove","RingCentral.sdk.subscription.Subscription.reset","RingCentral.sdk.subscription.Subscription.destroy","RingCentral.sdk.subscription.Subscription._getFullEventFilters","RingCentral.sdk.subscription.Subscription._setTimeout","RingCentral.sdk.subscription.Subscription._clearTimeout","RingCentral.sdk.subscription.Subscription._decrypt","RingCentral.sdk.subscription.Subscription._notify","RingCentral.sdk.subscription.Subscription._subscribeAtPubnub","RingCentral.sdk.pubnub","RingCentral.sdk.pubnub.PubnubMock","RingCentral.sdk.pubnub.PubnubMock.constructor","RingCentral.sdk.pubnub.PubnubMock.ready","RingCentral.sdk.pubnub.PubnubMock.subscribe","RingCentral.sdk.pubnub.PubnubMock.unsubscribe","RingCentral.sdk.pubnub.PubnubMock.receiveMessage","RingCentral.sdk.pubnub.PubnubMockFactory","RingCentral.sdk.pubnub.PubnubMockFactory.constructor","RingCentral.sdk.pubnub.PubnubMockFactory.init","RingCentral.sdk.pubnub.PubnubFactory","RingCentral.sdk.pubnub.PubnubFactory.constructor","RingCentral.sdk.pubnub.PubnubFactory.getPubnub","RingCentral.sdk.SDK","RingCentral.sdk.SDK.constructor","RingCentral.sdk.SDK.platform","RingCentral.sdk.SDK.cache","RingCentral.sdk.SDK.createSubscription","RingCentral.sdk.SDK.createPageVisibility","RingCentral.sdk.SDK.createObservable","RingCentral.sdk.SDK.log","RingCentral.sdk.SDK.utils","RingCentral.sdk.SDK.mockRegistry","RingCentral.sdk.http.ClientMock","RingCentral.sdk.http.ClientMock.constructor","RingCentral.sdk.http.ClientMock._loadResponse","RingCentral.sdk.platform.Auth","RingCentral.sdk.platform.Auth.constructor","RingCentral.sdk.platform.Auth.accessToken","RingCentral.sdk.platform.Auth.refreshToken","RingCentral.sdk.platform.Auth.tokenType","RingCentral.sdk.platform.Auth.data","RingCentral.sdk.platform.Auth.setData","RingCentral.sdk.platform.Auth.accessTokenValid","RingCentral.sdk.platform.Auth.refreshTokenValid","RingCentral.sdk.platform.Auth.cancelAccessToken","RingCentral.sdk.platform.Auth.forceAuthentication","RingCentral.sdk.platform.Auth.setRemember","RingCentral.sdk.platform.Auth.remember"],"mappings":"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","file":"ringcentral.js","sourcesContent":["module RingCentral.sdk.core {\n\n export class Cache {\n\n private _storage:Storage;\n private _prefix:string;\n\n constructor(storage:Storage|any, prefix?:string) {\n this.setPrefix(prefix);\n this._storage = storage;\n }\n\n setPrefix(prefix?:string) {\n this._prefix = prefix || 'rc-';\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 protected _prefixKey(key) {\n return this._prefix + key;\n }\n\n }\n\n}\n\n","module RingCentral.sdk.core {\n\n /**\n * TODO Fix public vars\n */\n export class Log {\n\n public _console:Console;\n public logDebug:boolean;\n public logInfo:boolean;\n public logWarnings:boolean;\n public logErrors:boolean;\n public addTimestamps:boolean;\n\n constructor(console?:Console) {\n\n if (!console) {\n console = { // safety\n log: () => {},\n warn: () => {},\n info: () => {},\n error: () => {}\n };\n }\n\n this._console = console;\n\n this.logDebug = false;\n this.logInfo = false;\n this.logWarnings = false;\n this.logErrors = false;\n\n this.addTimestamps = false;\n\n }\n\n disableAll() {\n this.logDebug = false;\n this.logInfo = false;\n this.logWarnings = false;\n this.logErrors = false;\n }\n\n enableAll() {\n this.logDebug = true;\n this.logInfo = true;\n this.logWarnings = true;\n this.logErrors = true;\n }\n\n debug(...args) {\n if (this.logDebug) this._console.log.apply(this._console, this._parseArguments(arguments));\n }\n\n info(...args) {\n if (this.logInfo) this._console.info.apply(this._console, this._parseArguments(arguments));\n }\n\n warn(...args) {\n if (this.logWarnings) this._console.warn.apply(this._console, this._parseArguments(arguments));\n }\n\n error(...args) {\n if (this.logErrors) this._console.error.apply(this._console, this._parseArguments(arguments));\n }\n\n stack() {\n var e = new Error();\n if (e.hasOwnProperty('stack')) {\n return e.stack.replace('Error\\n', 'Stack Trace\\n');\n }\n }\n\n protected _parseArguments(args) {\n args = utils.argumentsToArray(args);\n if (this.addTimestamps) args.unshift(new Date().toLocaleString(), '-');\n return args;\n }\n\n }\n\n export var log = new Log();\n\n}","module RingCentral.sdk.core.utils {\n\n var hasOwn = Object.prototype.hasOwnProperty,\n toString = Object.prototype.toString,\n rdigit = /\\d/,\n class2type = {};\n\n // Populate the class2type map\n 'Boolean Number String Function Array Date RegExp Object'.split(' ').forEach((name) => {\n class2type[\"[object \" + name + \"]\"] = name.toLowerCase();\n });\n\n /**\n * Ported from jQuery.fn.extend\n * Optional first parameter makes deep copy\n */\n export function extend(targetObject:any, sourceObject:any, ...args) {\n\n var options, name, src, copy, copyIsArray, clone,\n target = arguments[0] || {},\n i = 1,\n length = arguments.length,\n deep = false;\n\n // Handle a deep copy situation\n if (typeof target === \"boolean\") {\n deep = target;\n\n // skip the boolean and the target\n target = arguments[i] || {};\n i++;\n }\n\n // Handle case when target is a string or something (possible in deep copy)\n if (typeof target !== \"object\" && !isFunction(target)) {\n target = {};\n }\n\n for (; i < length; i++) {\n\n // Only deal with non-null/undefined values\n if ((options = arguments[i]) !== null) {\n\n // Extend the base object\n for (name in options) {\n\n src = target[name];\n copy = options[name];\n\n // Prevent never-ending loop\n if (target === copy) {\n continue;\n }\n\n // Recurse if we're merging plain objects or arrays\n if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {\n\n if (copyIsArray) {\n copyIsArray = false;\n clone = src && isArray(src) ? src : [];\n } else {\n clone = src && isPlainObject(src) ? src : {};\n }\n\n // Never move original objects, clone them\n target[name] = extend(deep, clone, copy);\n\n // Don't bring in undefined values\n } else if (copy !== undefined) {\n\n target[name] = copy;\n\n }\n }\n }\n }\n\n // Return the modified object\n return target;\n\n }\n\n export function forEach(object, cb) {\n\n for (var i in object) {\n\n if (!object.hasOwnProperty(i)) continue;\n\n var res = cb(object[i], i);\n\n if (res === false) break;\n\n }\n\n }\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 export function queryStringify(parameters) {\n\n var array = [];\n\n forEach(parameters, (v, i) => {\n\n if (isArray(v)) {\n v.forEach((vv) => {\n array.push(encodeURIComponent(i) + '=' + encodeURIComponent(vv));\n });\n } else {\n array.push(encodeURIComponent(i) + '=' + 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 */\n export function parseQueryString(queryString:string):any {\n\n var argsParsed = {},\n self = this;\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 && !self.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 * Returns true if the passed value is valid email address.\n * Checks multiple comma separated emails according to RFC 2822 if parameter `multiple` is `true`\n */\n export function isEmail(v:string, multiple:boolean):boolean {\n if (!!multiple) {\n //this Regexp is also suitable for multiple emails (comma separated)\n return /^(?:[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?[ ,;]*)+$/i.test(v);\n } else {\n return /^[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i.test(v);\n }\n\n }\n\n export function isPhoneNumber(v:string):boolean {\n return (/\\+?1[0-9]{3}[0-9a-z]{7}/im.test(v.toString().split(/[^0-9a-z\\+]/im).join('')));\n }\n\n /**\n * @param args\n * @returns {Array}\n */\n export function argumentsToArray(args:any) {\n return Array.prototype.slice.call(args || [], 0);\n }\n\n export function isDate(obj:any):boolean {\n return type(obj) === \"date\";\n }\n\n export function isFunction(obj:any):boolean {\n return type(obj) === \"function\";\n }\n\n export function isArray(obj:any):boolean {\n return Array.isArray ? Array.isArray(obj) : type(obj) === \"array\";\n }\n\n // A crude way of determining if an object is a window\n export function isWindow(obj:any):boolean {\n return obj && typeof obj === \"object\" && \"setInterval\" in obj;\n }\n\n export function isNan(obj:any):boolean {\n return obj === null || !rdigit.test(obj) || isNaN(obj);\n }\n\n export function type(obj:any):string {\n return obj === null\n ? String(obj)\n : class2type[toString.call(obj)] || \"object\";\n }\n\n export function isPlainObject(obj:any):boolean {\n\n // Must be an Object.\n // Because of IE, we also have to check the presence of the constructor property.\n // Make sure that DOM nodes and window objects don't pass through, as well\n if (!obj || type(obj) !== \"object\" || obj.nodeType || isWindow(obj)) {\n return false;\n }\n\n // Not own constructor property must be Object\n if (obj.constructor && !hasOwn.call(obj, \"constructor\") && !hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\")) {\n return false;\n }\n\n // Own properties are enumerated firstly, so to speed up,\n // if last one is own, then all properties are own.\n\n var key;\n for (key in obj) {}\n\n return key === undefined || hasOwn.call(obj, key);\n\n }\n\n export function getProperty(obj:any, property:string):any {\n\n return property\n .split(/[.[\\]]/)\n .reduce((res, part) => {\n if (!res) return undefined;\n return part ? res[part] : res;\n }, obj);\n\n }\n\n export function poll(fn, interval?:number, timeout?:any):any { //NodeJS.Timer|number\n\n stopPolling(timeout);\n\n interval = interval || 1000;\n\n var next = (delay?:number):any => {\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\n export function stopPolling(timeout) {\n if (timeout) clearTimeout(timeout);\n }\n\n export function parseString(s:any):string {\n return s ? s.toString() : '';\n }\n\n export function parseNumber(n:any):number {\n if (!n) return 0;\n n = parseFloat(n);\n return isNan(n) ? 0 : n;\n }\n\n export function isNodeJS():boolean {\n return (typeof process !== 'undefined');\n }\n\n export function isBrowser():boolean {\n return (typeof window !== 'undefined');\n }\n\n}","/// \n/// \n\nmodule RingCentral.sdk.core {\n\n /**\n * @see https://github.com/Microsoft/TypeScript/issues/275\n */\n export class Observable> {\n\n private _listeners:any;\n\n constructor() {\n if (!(this instanceof Observable)) throw new Error('Observable(): New operator was omitted');\n this.off();\n }\n\n hasListeners(event) {\n return (event in this._listeners);\n }\n\n on(events:any, callback:(...args)=>any):T {\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:string) => {\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:string, ...args):any {\n\n var result = null;\n\n if (!this.hasListeners(event)) return null;\n\n this._listeners[event].some((callback:()=>any) => {\n\n result = callback.apply(this, args);\n return (result === false);\n\n });\n\n return result;\n\n }\n\n off(event?:string, callback?):T {\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 destroy():T {\n this.off();\n log.debug('Observable.destroy(): Listeners were destroyed');\n return this;\n }\n\n }\n\n}\n\n\n","/// \n\nmodule RingCentral.sdk.core {\n\n export class PageVisibility extends Observable {\n\n public events = {\n change: 'change'\n };\n\n protected _visible:boolean;\n\n constructor() {\n\n super();\n\n var hidden = \"hidden\",\n onchange = (evt) => {\n\n evt = evt || window.event;\n\n var v = 'visible',\n h = 'hidden',\n evtMap = {\n focus: v, focusin: v, pageshow: v, blur: h, focusout: h, pagehide: h\n };\n\n this._visible = (evt.type in evtMap) ? evtMap[evt.type] == v : !document[hidden];\n\n this.emit(this.events.change, this._visible);\n\n };\n\n this._visible = true;\n\n if (typeof document == 'undefined' || typeof window == 'undefined') return;\n\n // Standards:\n\n if (hidden in document)\n document.addEventListener(\"visibilitychange\", onchange);\n else if ((hidden = \"mozHidden\") in document)\n document.addEventListener(\"mozvisibilitychange\", onchange);\n else if ((hidden = \"webkitHidden\") in document)\n document.addEventListener(\"webkitvisibilitychange\", onchange);\n else if ((hidden = \"msHidden\") in document)\n document.addEventListener(\"msvisibilitychange\", onchange);\n // IE 9 and lower:\n else if ('onfocusin' in document)\n (document).onfocusin = (document).onfocusout = onchange;\n // All others:\n else\n window.onpageshow = window.onpagehide = window.onfocus = window.onblur = onchange;\n\n }\n\n visible() {\n return this._visible;\n }\n\n }\n\n}","/// \n/// \n\nmodule RingCentral.sdk.mocks {\n\n export class Mock {\n\n protected _method:string;\n protected _path:string;\n protected _delay:number;\n protected _json:any;\n protected _status:number;\n protected _statusText:string;\n\n constructor(method:string, path:string, json?:any, status?:number, statusText?:string, delay?:number) {\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 getResponse(request:Request):Response|Promise {\n\n return new externals._Promise((resolve, reject) => {\n\n setTimeout(() => {\n\n resolve(this.createResponse(this._json));\n\n }, this._delay);\n\n });\n\n }\n\n createResponse(json?:any, init?:ResponseInit|any) {\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 = http.Client.createResponse(str, init);\n\n res.headers.set(http.ApiResponse.contentType, http.ApiResponse.jsonContentType);\n\n return res;\n\n }\n\n }\n\n}","/// \n\nmodule RingCentral.sdk.mocks {\n\n export class Registry {\n\n protected _mocks:Mock[];\n\n constructor() {\n this._mocks = [];\n }\n\n add(mock:Mock) {\n this._mocks.push(mock);\n return this;\n }\n\n clear() {\n this._mocks = [];\n return this;\n }\n\n find(request:Request):Mock {\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?:number, statusText?:string) {\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?:number) {\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?:string, detailed?:boolean) {\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?:boolean) {\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\nmodule RingCentral.sdk.externals {\n\n export var _Promise:typeof Promise;\n export var _fetch:Fetch;\n export var _Response:typeof Response;\n export var _Request:typeof Request;\n export var _Headers:typeof Headers;\n export var _PUBNUB:PUBNUB;\n\n export function get() {\n\n var root = Function('return this')();\n\n if (!_PUBNUB) _PUBNUB = root.PUBNUB;\n if (!_Promise) _Promise = root.Promise;\n if (!_fetch) _fetch = root.fetch;\n if (!_Headers) _Headers = root.Headers;\n if (!_Request) _Request = root.Request;\n if (!_Response) _Response = root.Response;\n\n return externals;\n\n }\n\n}\n\n","/// \n/// \n/// \n\nmodule RingCentral.sdk.http {\n\n /**\n * @TODO Bring back tests\n */\n export 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 protected _json:any;\n protected _text:string;\n protected _request:Request;\n protected _response:Response;\n protected _multipartTransactions:ApiResponse[];\n\n constructor(request?:Request, response?:Response, responseText?:string) {\n\n this._text = responseText;\n this._request = request;\n this._response = response;\n this._json = null;\n this._multipartTransactions = null;\n\n }\n\n response() {\n return this._response;\n }\n\n request() {\n return this._request;\n }\n\n ok() {\n return this._response && this._response.ok;\n }\n\n text() {\n return this._text;\n }\n\n json() {\n\n if (!this._isJson()) throw new Error('Response is not JSON');\n\n if (!this._json) {\n this._json = this._text ? JSON.parse(this._text) : null;\n }\n\n return this._json;\n\n }\n\n error(skipOKCheck?:boolean) {\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 var json = this.json();\n\n if (json.message) message = json.message;\n if (json.error_description) message = json.error_description;\n if (json.description) message = json.description;\n\n } catch (ex) {}\n\n return message;\n\n }\n\n multipart():ApiResponse[] {\n\n if (!this._isMultipart()) throw new Error('Response is not multipart');\n\n if (null === this._multipartTransactions) {\n\n // Step 1. Split multipart response\n\n if (!this._text) throw new Error('No response body');\n\n var boundary = this._response.headers.get('Content-Type').match(/boundary=([^;]+)/i)[1];\n\n if (!boundary) throw new Error('Cannot find boundary');\n\n var parts = this._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);\n\n // Step 3. Parse all other parts\n\n this._multipartTransactions = parts.map((part:string, i) => { //FIXME It will not work since parts contain both headers and body\n\n var status = statusInfo.json().response[i].status;\n\n return ApiResponse.create(part, status);\n\n });\n\n }\n\n return this._multipartTransactions;\n\n }\n\n /**\n * Short-hand method to get only JSON content of responses\n */\n multipartJson():any[] {\n\n return this.multipart().map((res)=> {\n return res.json();\n });\n\n }\n\n protected _isContentType(contentType:string):boolean {\n return this._getContentType().indexOf(contentType) > -1;\n }\n\n protected _getContentType():string {\n return this._response.headers.get(ApiResponse.contentType) || '';\n }\n\n protected _isMultipart():boolean {\n return this._isContentType(ApiResponse.multipartContentType);\n }\n\n protected _isUrlEncoded():boolean {\n return this._isContentType(ApiResponse.urlencodedContentType);\n }\n\n protected _isJson():boolean {\n return this._isContentType(ApiResponse.jsonContentType);\n }\n\n /**\n * Method is used to create Transaction objects from string parts of multipart/mixed response\n * @param text\n * @param status\n * @param statusText\n * @return {ApiResponse}\n */\n static create(text?:string, status?:number, statusText?:string):ApiResponse {\n\n status = status || 200;\n statusText = statusText || 'OK';\n\n text = text.replace(/\\r/g, '');\n\n var headers = new externals._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, Client.createResponse(text, {\n headers: headers,\n status: status,\n statusText: statusText\n }), text);\n\n }\n\n }\n\n}","/// \n/// \n/// \n/// \n/// \n/// \n\nmodule RingCentral.sdk.http {\n\n var allowedMethods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'];\n\n export class Client extends core.Observable {\n\n public events = {\n beforeRequest: 'beforeRequest', // parameters: ajax\n requestSuccess: 'requestSuccess', // means that response was successfully fetched from server\n requestError: 'requestError' // means that request failed completely\n };\n\n sendRequest(request:Request):Promise {\n\n var res = new ApiResponse(request); //FIXME Potential leak\n\n return new externals._Promise((resolve) => {\n\n //TODO Stop request if listeners return false\n this.emit(this.events.beforeRequest, res);\n\n resolve(this._loadResponse(request));\n\n })\n .then((response:Response) => {\n\n res['_response'] = Client.cloneResponse(response);\n\n return response.text();\n\n })\n .then((text:string) => {\n\n res['_text'] = text;\n\n if (!res.ok()) throw Client.makeError(new Error('Response has unsuccessful status'), res);\n\n this.emit(this.events.requestSuccess, res);\n\n return res;\n\n })\n .catch((e:IApiError):any=> {\n\n if (!e.apiResponse) {\n // we don't pass response since most likely it's parsing caused an error\n e = Client.makeError(e, res);\n }\n\n this.emit(this.events.requestError, e);\n\n throw e;\n\n });\n\n }\n\n protected _loadResponse(request:Request):Promise {\n return externals._fetch.call(null, request);\n }\n\n /**\n * Wraps the JS Error object with transaction information\n * @param {Error} e\n * @param {ApiResponse} apiResponse\n * @return {IApiError}\n */\n static makeError(e:Error, apiResponse?:ApiResponse) {\n\n var error = e;\n\n // Wrap only if regular error\n if (!error.hasOwnProperty('apiResponse') && !error.hasOwnProperty('originalMessage')) {\n\n error.apiResponse = apiResponse;\n error.originalMessage = error.message;\n error.message = (apiResponse && apiResponse.error(true)) || error.originalMessage;\n\n }\n\n return error;\n\n }\n\n /**\n * TODO Wait for\n * - https://github.com/github/fetch/issues/185\n * - https://github.com/bitinn/node-fetch/issues/34\n * @param {Response} response\n * @return {Response}\n */\n static cloneResponse(response:Response):Response {\n\n if (core.utils.isFunction(response.clone)) return response.clone();\n\n var body = '';\n\n if (response.hasOwnProperty('_bodyInit')) body = response['_bodyInit'];\n if (response.hasOwnProperty('_bodyText')) body = response['_bodyText'];\n if (response.hasOwnProperty('_bodyBlob')) body = response['_bodyBlob'].slice();\n if (response.hasOwnProperty('_bodyFormData')) body = response['_bodyFormData'];\n\n if (response.hasOwnProperty('_raw')) body = response['_raw'].join('');\n\n var clone = new externals._Response(body, response);\n\n if (response.hasOwnProperty('body')) clone['body'] = response['body']; // accessing non-standard properties\n\n return clone;\n\n }\n\n /**\n * Creates a response\n * @param stringBody\n * @param init\n * @return {Response}\n */\n static createResponse(stringBody?:string, init?:ResponseInit):Response {\n\n init = init || {};\n\n return new externals._Response(stringBody, init);\n\n }\n\n static createRequest(input:string|Request, init?:IClientRequestInit) {\n\n init = init || {};\n\n var body = init.body;\n\n // Assign request with empty body, Github's fetch throws errors if it cannot recognize the body type\n var req = new externals._Request(input, core.utils.extend({}, init, {body: null}));\n\n if (!req.url) throw new Error('Url is not defined');\n if (!req.method) req.method = 'GET';\n if (req.method && allowedMethods.indexOf(req.method) < 0) throw new Error('Method has wrong value: ' + req.method);\n\n if (!req.headers.has('Accept')) req.headers.set('Accept', 'application/json');\n\n // Serialize body\n if (core.utils.isPlainObject(init.body) || !init.body) {\n\n if (!req.headers.has('Content-Type')) req.headers.set('Content-Type', 'application/json');\n\n var contentType = req.headers.get('Content-Type');\n\n if (contentType.indexOf('application/json') > -1) {\n\n body = JSON.stringify(init.body);\n\n } else if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n\n body = core.utils.queryStringify(init.body);\n\n }\n\n }\n\n req.credentials = 'include';\n req.mode = 'cors';\n\n if (init.query) {\n req.url = req.url + (req.url.indexOf('?') > -1 ? '&' : '?') + core.utils.queryStringify(init.query);\n }\n\n // Create another request with encoded body\n req = new externals._Request(req.url, core.utils.extend(req, {body: body}));\n\n // Keep the original body accessible directly (for mocks)\n req.body = init.body;\n\n return req;\n\n }\n\n }\n\n export interface IApiError extends Error {\n stack?:string;\n originalMessage:string;\n apiResponse:ApiResponse;\n }\n\n export interface IClientRequestInit extends RequestInit {\n query?: string;\n }\n\n}","/// \n/// \n/// \n/// \n\nmodule RingCentral.sdk.platform {\n\n export class Queue {\n\n protected _cacheId:string;\n protected _pollInterval:number;\n protected _releaseTimeout:number;\n\n protected _cache:core.Cache;\n protected _promise:Promise;\n\n constructor(cache:core.Cache, cacheId:string) {\n\n this._cache = cache;\n this._cacheId = cacheId;\n\n this.setPollInterval(250);\n this.setReleaseTimeout(5000); // If queue was not released then force it to do so after some timeout\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) < this._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 externals._Promise((resolve, reject) => {\n\n core.utils.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 }, this._pollInterval);\n\n });\n\n return this._promise;\n\n }\n\n releaseTimeout() {\n return this._releaseTimeout;\n }\n\n pollInterval() {\n return this._pollInterval;\n }\n\n setReleaseTimeout(releaseTimeout:number) {\n this._releaseTimeout = releaseTimeout;\n return this;\n }\n\n setPollInterval(pollInterval:number) {\n this._pollInterval = pollInterval;\n return this;\n }\n\n }\n\n}","/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n\nmodule RingCentral.sdk.platform {\n\n export class Platform extends core.Observable {\n\n protected static _urlPrefix:string = '/restapi';\n protected static _apiVersion:string = 'v1.0';\n protected static _accessTokenTtl:number = null; // Platform server by default sets it to 60 * 60 = 1 hour\n protected static _refreshTokenTtl:number = 10 * 60 * 60; // 10 hours\n protected static _refreshTokenTtlRemember:number = 7 * 24 * 60 * 60; // 1 week\n protected static _tokenEndpoint:string = '/restapi/oauth/token';\n protected static _revokeEndpoint:string = '/restapi/oauth/revoke';\n protected static _authorizeEndpoint:string = '/restapi/oauth/authorize';\n\n protected _server:string;\n protected _appKey:string;\n protected _appSecret:string;\n\n protected _refreshDelayMs:number = 100;\n protected _clearCacheOnRefreshError:boolean = true;\n protected _cacheId:string = 'platform';\n\n protected _queue:Queue;\n protected _cache:core.Cache;\n protected _client:http.Client;\n protected _auth:Auth;\n\n public events = {\n accessViolation: 'accessViolation',\n logoutSuccess: 'logoutSuccess',\n logoutError: 'logoutError',\n authorizeSuccess: 'authorizeSuccess',\n authorizeError: 'authorizeError',\n refreshSuccess: 'refreshSuccess',\n refreshError: 'refreshError'\n };\n\n constructor(client:http.Client,\n cache:core.Cache,\n server:string,\n appKey:string,\n appSecret:string) {\n\n super();\n\n this._server = server;\n this._appKey = appKey;\n this._appSecret = appSecret;\n\n this._cache = cache;\n this._client = client;\n this._queue = new Queue(this._cache, this._cacheId + '-refresh');\n this._auth = new Auth(this._cache, this._cacheId);\n\n }\n\n auth():Auth {\n return this._auth;\n }\n\n createUrl(path, options?:{addMethod?: string; addToken?: boolean; addServer?: boolean}):string {\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 authUrl(options:{\n redirectUri:string;\n display?:string; // page|popup|touch|mobile, default 'page'\n prompt?:string; // sso|login|consent, default is 'login sso consent'\n state?:string;\n brandId?:string|number;\n }) {\n\n options = options || {};\n\n return this.createUrl(Platform._authorizeEndpoint + '?' + core.utils.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 parseAuthRedirectUrl(url:string) {\n\n var qs = core.utils.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 loggedIn():Promise {\n\n return this._ensureAuthentication()\n .then(()=> {\n return true;\n })\n .catch(()=> {\n return false;\n });\n\n }\n\n login(options?:{\n username?:string;\n password?: string;\n extension?:string;\n endpointId?:string;\n code?:string;\n redirectUri?:string;\n clientId?:string;\n remember?:boolean\n }):Promise {\n\n options = options || {};\n\n options.remember = options.remember || false;\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 return this._tokenRequest(Platform._tokenEndpoint, body).then((res:http.ApiResponse) => {\n\n this._auth\n .setData(res.json())\n .setRemember(options.remember);\n\n this.emit(this.events.authorizeSuccess, res);\n\n return res;\n\n }).catch((e:http.IApiError):any => {\n\n this._cache.clean();\n\n this.emit(this.events.authorizeError, e);\n\n throw e;\n\n });\n\n }\n\n refresh():Promise {\n\n var refresh = >new externals._Promise((resolve, reject) => {\n\n if (this._queue.isPaused()) {\n return resolve(this._refreshPolling());\n }\n\n this._queue.pause();\n\n // Make sure all existing AJAX calls had a chance to reach the server\n setTimeout(() => {\n\n core.log.debug('Platform.refresh(): Performing token refresh (access token', this._auth.accessToken(), ', refresh token', this._auth.refreshToken(), ')');\n\n // Perform sanity checks\n if (!this._auth.refreshToken()) return reject(new Error('Refresh token is missing'));\n if (!this._auth.refreshTokenValid()) return reject(new Error('Refresh token has expired'));\n if (!this._queue.isPaused()) return reject(new Error('Queue was resumed before refresh call'));\n\n resolve(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 }, this._refreshDelayMs);\n\n });\n\n return refresh.then((res:http.ApiResponse) => {\n\n // This means refresh has happened elsewhere and we are here because of timeout\n if (res && res.json && res.json()) {\n\n var json = res.json();\n\n core.log.info('Platform.refresh(): Token was refreshed', res);\n\n if (!json.refresh_token || !json.access_token) {\n throw http.Client.makeError(new Error('Malformed OAuth response'), res);\n }\n\n this._auth.setData(json);\n this._queue.resume();\n\n }\n\n this.emit(this.events.refreshSuccess, res);\n\n return res;\n\n }).catch((e:http.IApiError):any => {\n\n e = http.Client.makeError(e);\n\n if (this._clearCacheOnRefreshError) {\n this._cache.clean();\n }\n\n this.emit(this.events.accessViolation, e);\n this.emit(this.events.refreshError, e);\n\n throw e;\n\n });\n\n }\n\n /**\n * @returns {Promise}\n */\n logout():Promise {\n\n this._queue.pause();\n\n return this._tokenRequest(Platform._revokeEndpoint, {\n token: this._auth.accessToken()\n }).then((res) => {\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:http.IApiError):any => {\n\n this._queue.resume();\n\n this.emit(this.events.accessViolation, e);\n this.emit(this.events.logoutError, e);\n\n throw e;\n\n });\n\n }\n\n inflateRequest(request:Request, options?:IPlatformOptions):Promise {\n\n options = options || {};\n\n if (options.skipAuthCheck) return externals._Promise.resolve(request);\n\n return this\n ._ensureAuthentication()\n .then(() => {\n\n request.headers.set('Authorization', this._authHeader());\n request.url = this.createUrl(request.url, {addServer: true});\n\n //TODO Add User-Agent here\n\n return request;\n\n });\n\n }\n\n sendRequest(request:Request, options?:IPlatformOptions):Promise {\n\n return this\n .inflateRequest(request, options)\n .then((req) => {\n return this._client.sendRequest(req);\n })\n .catch((e:http.IApiError) => {\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 this.sendRequest(request, options);\n\n });\n\n }\n\n /**\n * General purpose function to send anything to server\n */\n send(url:string, options?:IPlatformCombinedOptions):Promise {\n\n try {\n\n //FIXME https://github.com/bitinn/node-fetch/issues/43\n url = this.createUrl(url, {addServer: true});\n\n return this.sendRequest(http.Client.createRequest(url, options), options);\n\n } catch (e) {\n return externals._Promise.reject(e);\n }\n\n }\n\n get(url:string, options?:IPlatformCombinedOptions) {\n options = options || {};\n options.method = 'GET';\n return this.send(url, options);\n }\n\n post(url:string, options:IPlatformCombinedOptions) {\n options = options || {};\n options.method = 'POST';\n return this.send(url, options);\n }\n\n put(url:string, options:IPlatformCombinedOptions) {\n options = options || {};\n options.method = 'PUT';\n return this.send(url, options);\n }\n\n 'delete'(url:string, options?:IPlatformCombinedOptions) {\n options = options || {};\n options.method = 'DELETE';\n return this.send(url, options);\n }\n\n protected _tokenRequest(path:string, body:any):Promise {\n\n return this.send(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 protected _ensureAuthentication() {\n\n if (this._isAccessTokenValid()) return externals._Promise.resolve(null);\n return this.refresh();\n\n }\n\n protected _isAccessTokenValid():boolean {\n\n return (this._auth.accessTokenValid() && !this._queue.isPaused());\n\n }\n\n protected _refreshPolling():Promise {\n\n core.log.warn('Platform.refresh(): Refresh is already in progress, polling started');\n\n return this._queue.poll().then(()=> {\n\n if (!this._isAccessTokenValid()) {\n throw new Error('Automatic authentification timeout');\n }\n\n return null;\n\n });\n\n }\n\n protected _apiKey() {\n var apiKey = this._appKey + ':' + this._appSecret;\n return (typeof btoa == 'function') ? btoa(apiKey) : new Buffer(apiKey).toString('base64');\n }\n\n protected _authHeader() {\n var token = this._auth.accessToken();\n return this._auth.tokenType() + (token ? ' ' + token : '');\n }\n\n }\n\n export interface IAuthError extends Error {\n error?:string;\n }\n\n export interface IPlatformOptions {\n skipAuthCheck?:boolean;\n }\n\n export interface IPlatformCombinedOptions extends IPlatformOptions, http.IClientRequestInit {}\n\n}","/// \n/// \n/// \n/// \n/// \n/// \n\nmodule RingCentral.sdk.subscription {\n\n\n export class Subscription extends core.Observable {\n\n protected _renewHandicapMs = 2 * 60 * 1000;\n\n protected _subscription:ISubscription|any;\n protected _timeout;\n protected _eventFilters:string[];\n protected _pubnub:PUBNUBInstance;\n\n protected _platform:platform.Platform;\n protected _pubnubFactory:pubnub.PubnubFactory;\n\n public 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:pubnub.PubnubFactory, platform:platform.Platform) {\n\n super();\n\n this._pubnubFactory = pubnubFactory;\n this._platform = platform;\n\n this._pubnub = null;\n this._eventFilters = [];\n this._timeout = null;\n this._subscription = null;\n\n }\n\n alive() {\n\n return this._subscription &&\n this._subscription.id &&\n this._subscription.deliveryMode &&\n this._subscription.deliveryMode.subscriberKey &&\n this._subscription.deliveryMode.address;\n\n }\n\n setSubscription(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():ISubscription {\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 register(options?:{events?:string[]}):Promise {\n\n if (this.alive()) {\n return this.renew(options);\n } else {\n return this.subscribe(options);\n }\n\n }\n\n addEvents(events:string[]) {\n this._eventFilters = this._eventFilters.concat(events);\n return this;\n }\n\n setEvents(events:string[]) {\n this._eventFilters = events;\n return this;\n }\n\n subscribe(options?:{events?:string[]}):Promise {\n\n options = options || {};\n\n if (options.events) this.setEvents(options.events);\n\n this._clearTimeout();\n\n return >new externals._Promise((resolve, reject) => {\n\n if (!this._eventFilters || !this._eventFilters.length) throw new Error('Events are undefined');\n\n resolve(this._platform.post('/restapi/v1.0/subscription', {\n body: {\n eventFilters: this._getFullEventFilters(),\n deliveryMode: {\n transportType: 'PubNub'\n }\n }\n }));\n\n }).then((ajax:http.ApiResponse) => {\n\n this.setSubscription(ajax.json())\n .emit(this.events.subscribeSuccess, ajax);\n\n return ajax;\n\n }).catch((e):any => {\n\n e = http.Client.makeError(e);\n\n this.reset()\n .emit(this.events.subscribeError, e);\n\n throw e;\n\n });\n\n }\n\n renew(options?:{events?:string[]}):Promise {\n\n options = options || {};\n\n if (options.events) this.setEvents(options.events);\n\n this._clearTimeout();\n\n return >new externals._Promise((resolve, reject) => {\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n if (!this._eventFilters || !this._eventFilters.length) throw new Error('Events are undefined');\n\n return this._platform.put('/restapi/v1.0/subscription/' + this._subscription.id, {\n body: {\n eventFilters: this._getFullEventFilters()\n }\n });\n\n })\n .then((ajax:http.ApiResponse) => {\n\n this.setSubscription(ajax.json())\n .emit(this.events.renewSuccess, ajax.json());\n\n return ajax;\n\n })\n .catch((e):any => {\n\n e = http.Client.makeError(e);\n\n this.reset()\n .emit(this.events.renewError, e);\n\n throw e;\n\n });\n\n }\n\n remove():Promise {\n\n return >new externals._Promise((resolve, reject) => {\n\n if (!this._subscription || !this._subscription.id) throw new Error('Subscription ID is required');\n\n resolve(this._platform.delete('/restapi/v1.0/subscription/' + this._subscription.id));\n\n }).then((ajax:http.ApiResponse) => {\n\n this.reset()\n .emit(this.events.removeSuccess, ajax);\n\n return ajax;\n\n }).catch((e):any => {\n\n e = http.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 = null;\n return this;\n }\n\n destroy():Subscription {\n\n this.reset();\n\n core.log.info('RC.subscription.Subscription: Destroyed');\n\n return super.destroy();\n\n }\n\n protected _getFullEventFilters() {\n\n return this._eventFilters.map((event) => {\n return this._platform.createUrl(event);\n });\n\n }\n\n protected _setTimeout() {\n\n this._clearTimeout();\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n var timeToExpiration = (this._subscription.expiresIn * 1000) - this._renewHandicapMs;\n\n this._timeout = setTimeout(() => {\n\n this.renew({});\n\n }, timeToExpiration);\n\n return this;\n\n }\n\n protected _clearTimeout() {\n\n clearTimeout(this._timeout);\n\n return this;\n\n }\n\n protected _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.getPubnub();\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 protected _notify(message:any) {\n\n this.emit(this.events.notification, this._decrypt(message));\n\n return this;\n\n }\n\n protected _subscribeAtPubnub():Subscription {\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n var PUBNUB = this._pubnubFactory.getPubnub();\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: (message, env, channel) => {\n\n core.log.info('RC.core.Subscription: Incoming message', message);\n this._notify(message);\n\n },\n connect: () => {\n core.log.info('RC.core.Subscription: PUBNUB connected');\n }\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/// \n\nmodule RingCentral.sdk.pubnub {\n\n export class PubnubMock extends core.Observable implements PUBNUBInstance {\n\n private options:PUBNUBInitOptions;\n crypto_obj:PUBNUBCryptoObj;\n\n constructor(options:PUBNUBInitOptions) {\n super();\n this.options = options;\n this.crypto_obj = externals._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 export class PubnubMockFactory implements PUBNUB {\n\n crypto_obj:PUBNUBCryptoObj;\n\n constructor() {\n this.crypto_obj = externals._PUBNUB.crypto_obj;\n }\n\n init(options:PUBNUBInitOptions) {\n return new PubnubMock(options);\n }\n\n }\n\n}","/// \n/// \n\nmodule RingCentral.sdk.pubnub {\n\n export class PubnubFactory {\n\n private _useMock:boolean = false;\n private _mock:PubnubMockFactory;\n\n constructor(flag:boolean) {\n this._useMock = !!flag;\n this._mock = new PubnubMockFactory();\n }\n\n getPubnub():PUBNUB {\n return this._useMock ? this._mock : externals._PUBNUB;\n }\n\n }\n\n}","/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n\nmodule RingCentral.sdk {\n\n export 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 private _platform:platform.Platform;\n private _cache:core.Cache;\n private _queue:platform.Queue;\n private _client:http.Client;\n private _pubnubFactory:pubnub.PubnubFactory;\n private _mockRegistry:mocks.Registry;\n\n constructor(options?:{\n server:string;\n appKey:string;\n appSecret:string;\n appName?:string;\n appVersion?:string;\n cachePrefix?:string;\n useHttpMock?:boolean;\n usePubnubMock?:boolean;\n }) {\n\n options = options || {};\n\n externals.get();\n\n this._mockRegistry = new mocks.Registry();\n\n this._cache = new core.Cache(typeof localStorage !== 'undefined' ? localStorage : {}, options.cachePrefix);\n\n this._client = options.useHttpMock ? new http.ClientMock(this._mockRegistry) : new http.Client();\n\n this._platform = new platform.Platform(this._client, this._cache, options.server, options.appKey, options.appSecret);\n\n this._pubnubFactory = new pubnub.PubnubFactory(options.usePubnubMock);\n\n //TODO Link Platform events with Subscriptions and the rest\n\n }\n\n platform():platform.Platform {\n return this._platform;\n }\n\n cache():core.Cache {\n return this._cache;\n }\n\n createSubscription():subscription.Subscription {\n return new subscription.Subscription(this._pubnubFactory, this._platform);\n }\n\n createPageVisibility() {\n return new core.PageVisibility();\n }\n\n createObservable() {\n return new core.Observable();\n }\n\n log() {\n return core.log;\n }\n\n utils() {\n return core.utils;\n }\n\n mockRegistry() { return this._mockRegistry; }\n\n }\n\n}\n\nvar e = RingCentral.sdk.externals.get();\n\nif (typeof define === 'function' && define.amd) {\n\n define(['pubnub'], function(PUBNUB) {\n e._PUBNUB = PUBNUB;\n return RingCentral.sdk;\n });\n\n} else if (typeof module === 'object' && module.exports) {\n\n e._PUBNUB = require('pubnub');\n e._Promise = typeof (Promise) !== 'undefined' ? Promise : require('es6-promise').Promise;\n e._fetch = require('node-fetch');\n e._Request = e._fetch['Request'];\n e._Response = e._fetch['Response'];\n e._Headers = e._fetch['Headers'];\n\n module.exports = RingCentral.sdk;\n\n} else {\n\n //TODO noConflict\n\n}\n","/// \n/// \n/// \n/// \n/// \n/// \n\nmodule RingCentral.sdk.http {\n\n export class ClientMock extends Client {\n\n private _registry:mocks.Registry;\n\n constructor(registry:mocks.Registry) {\n super();\n this._registry = registry;\n }\n\n protected _loadResponse(request:Request):Promise {\n\n return new externals._Promise((resolve) => {\n\n core.log.debug('API REQUEST', request.method, request.url);\n\n var mock = this._registry.find(request);\n\n resolve(mock.getResponse(request));\n\n });\n\n }\n\n }\n\n}","/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n\nmodule RingCentral.sdk.platform {\n\n export class Auth {\n\n static refreshHandicapMs:number = 60 * 1000; // 1 minute\n static forcedTokenType = 'forced';\n\n protected _cacheId:string;\n protected _cache:core.Cache;\n\n constructor(cache:core.Cache, cacheId:string) {\n\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 data():IAuthData {\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 setData(authData:IAuthData) {\n\n var oldAuthData = this.data();\n\n authData = core.utils.extend({}, oldAuthData, authData);\n\n authData.expire_time = Date.now() + (authData.expires_in * 1000);\n authData.refresh_token_expire_time = Date.now() + (authData.refresh_token_expires_in * 1000);\n\n core.log.info('Auth.setData(): Tokens were updated, new:', authData, ', old:', oldAuthData);\n\n this._cache.setItem(this._cacheId, authData);\n\n return this;\n\n }\n\n /**\n * Check if there is a valid (not expired) access token\n */\n accessTokenValid():boolean {\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 */\n refreshTokenValid():boolean {\n\n return (this.data().refresh_token_expire_time > Date.now());\n\n }\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 {Platform}\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 setRemember(remember?:boolean):Auth {\n\n return this.setData({remember: remember});\n\n }\n\n remember():boolean {\n\n return !!this.data().remember;\n\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}"],"sourceRoot":"/source/"} \ No newline at end of file +{"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 diff --git a/build/ringcentral.min.js b/build/ringcentral.min.js index bc665a3e..ee8347b1 100644 --- a/build/ringcentral.min.js +++ b/build/ringcentral.min.js @@ -1,4 +1,3 @@ -var RingCentral;!function(e){var t;!function(e){var t;!function(e){var t=function(){function e(e,t){this.setPrefix(t),this._storage=e}return e.prototype.setPrefix=function(e){return this._prefix=e||"rc-",this},e.prototype.setItem=function(e,t){return this._storage[this._prefixKey(e)]=JSON.stringify(t),this},e.prototype.removeItem=function(e){return delete this._storage[this._prefixKey(e)],this},e.prototype.getItem=function(e){var t=this._storage[this._prefixKey(e)];return t?JSON.parse(t):null},e.prototype.clean=function(){for(var e in this._storage)this._storage.hasOwnProperty(e)&&0===e.indexOf(this._prefix)&&delete this._storage[e];return this},e.prototype._prefixKey=function(e){return this._prefix+e},e}();e.Cache=t}(t=e.core||(e.core={}))}(t=e.sdk||(e.sdk={}))}(RingCentral||(RingCentral={}));var RingCentral;!function(e){var t;!function(e){var t;!function(e){var t=function(){function t(e){e||(e={log:function(){},warn:function(){},info:function(){},error:function(){}}),this._console=e,this.logDebug=!1,this.logInfo=!1,this.logWarnings=!1,this.logErrors=!1,this.addTimestamps=!1}return t.prototype.disableAll=function(){this.logDebug=!1,this.logInfo=!1,this.logWarnings=!1,this.logErrors=!1},t.prototype.enableAll=function(){this.logDebug=!0,this.logInfo=!0,this.logWarnings=!0,this.logErrors=!0},t.prototype.debug=function(){for(var e=[],t=0;td;d++)if(null!==(i=arguments[d]))for(s in i)u=f[s],a=i[s],f!==a&&(m&&a&&(_(a)||(h=p(a)))?(h?(h=!1,l=u&&p(u)?u:[]):l=u&&_(u)?u:{},f[s]=t(m,l,a)):void 0!==a&&(f[s]=a));return f}function r(e,t){for(var r in e)if(e.hasOwnProperty(r)){var n=t(e[r],r);if(n===!1)break}}function n(e){var t=[];return r(e,function(e,r){p(e)?e.forEach(function(e){t.push(encodeURIComponent(r)+"="+encodeURIComponent(e))}):t.push(encodeURIComponent(r)+"="+encodeURIComponent(e))}),t.join("&")}function o(e){var t={},r=this;return e.split("&").forEach(function(e){if(e=decodeURIComponent(e),-1==e.indexOf("="))t[e.trim()]=!0;else{var n=e.split("="),o=n[0].trim(),i=n[1].trim();o in t?(o in t&&!r.isArray(t[o])&&(t[o]=[t[o]]),t[o].push(i)):t[o]=i}}),t}function i(e,t){return t?/^(?:[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?[ ,;]*)+$/i.test(e):/^[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i.test(e)}function s(e){return/\+?1[0-9]{3}[0-9a-z]{7}/im.test(e.toString().split(/[^0-9a-z\+]/im).join(""))}function u(e){return Array.prototype.slice.call(e||[],0)}function a(e){return"date"===f(e)}function c(e){return"function"===f(e)}function p(e){return Array.isArray?Array.isArray(e):"array"===f(e)}function h(e){return e&&"object"==typeof e&&"setInterval"in e}function l(e){return null===e||!T.test(e)||isNaN(e)}function f(e){return null===e?String(e):C[R.call(e)]||"object"}function _(e){if(!e||"object"!==f(e)||e.nodeType||h(e))return!1;if(e.constructor&&!w.call(e,"constructor")&&!w.call(e.constructor.prototype,"isPrototypeOf"))return!1;var t;for(t in e);return void 0===t||w.call(e,t)}function d(e,t){return t.split(/[.[\]]/).reduce(function(e,t){return e?t?e[t]:e:void 0},e)}function y(e,t,r){m(r),t=t||1e3;var n=function(r){return r=r||t,t=r,setTimeout(function(){e(n,r)},r)};return n()}function m(e){e&&clearTimeout(e)}function b(e){return e?e.toString():""}function v(e){return e?(e=parseFloat(e),l(e)?0:e):0}function g(){return"undefined"!=typeof process}function k(){return"undefined"!=typeof window}var w=Object.prototype.hasOwnProperty,R=Object.prototype.toString,T=/\d/,C={};"Boolean Number String Function Array Date RegExp Object".split(" ").forEach(function(e){C["[object "+e+"]"]=e.toLowerCase()}),e.extend=t,e.forEach=r,e.queryStringify=n,e.parseQueryString=o,e.isEmail=i,e.isPhoneNumber=s,e.argumentsToArray=u,e.isDate=a,e.isFunction=c,e.isArray=p,e.isWindow=h,e.isNan=l,e.type=f,e.isPlainObject=_,e.getProperty=d,e.poll=y,e.stopPolling=m,e.parseString=b,e.parseNumber=v,e.isNodeJS=g,e.isBrowser=k}(t=e.utils||(e.utils={}))}(t=e.core||(e.core={}))}(t=e.sdk||(e.sdk={}))}(RingCentral||(RingCentral={}));var RingCentral;!function(e){var t;!function(e){var t;!function(e){var t=function(){function t(){if(!(this instanceof t))throw new Error("Observable(): New operator was omitted");this.off()}return t.prototype.hasListeners=function(e){return e in this._listeners},t.prototype.on=function(e,t){var r=this;if("string"==typeof e&&(e=[e]),!e)throw new Error("No events to subscribe to");if("function"!=typeof t)throw new Error("Callback must be a function");return e.forEach(function(e){r.hasListeners(e)||(r._listeners[e]=[]),r._listeners[e].push(t)}),this},t.prototype.emit=function(e){for(var t=this,r=[],n=1;n-1&&e.method.toUpperCase()==this._method},t.prototype.getResponse=function(t){var r=this;return new e.externals._Promise(function(e,t){setTimeout(function(){e(r.createResponse(r._json))},r._delay)})},t.prototype.createResponse=function(t,r){r=r||{},r.status=r.status||this._status,r.statusText=r.statusText||this._statusText;var n=JSON.stringify(t),o=e.http.Client.createResponse(n,r);return o.headers.set(e.http.ApiResponse.contentType,e.http.ApiResponse.jsonContentType),o},t}();t.Mock=r}(t=e.mocks||(e.mocks={}))}(t=e.sdk||(e.sdk={}))}(RingCentral||(RingCentral={}));var RingCentral;!function(e){var t;!function(e){var t;!function(e){var t=function(){function t(){this._mocks=[]}return t.prototype.add=function(e){return this._mocks.push(e),this},t.prototype.clear=function(){return this._mocks=[],this},t.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},t.prototype.apiCall=function(t,r,n,o,i){return this.add(new e.Mock(t,r,n,o,i)),this},t.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},t.prototype.logout=function(){return this.apiCall("POST","/restapi/oauth/revoke",{}),this},t.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},t.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},t.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},t.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},t}();e.Registry=t}(t=e.mocks||(e.mocks={}))}(t=e.sdk||(e.sdk={}))}(RingCentral||(RingCentral={}));var RingCentral;!function(e){var t;!function(e){var t;!function(e){function t(){var t=Function("return this")();return e._PUBNUB||(e._PUBNUB=t.PUBNUB),e._Promise||(e._Promise=t.Promise),e._fetch||(e._fetch=t.fetch),e._Headers||(e._Headers=t.Headers),e._Request||(e._Request=t.Request),e._Response||(e._Response=t.Response),e}e._Promise,e._fetch,e._Response,e._Request,e._Headers,e._PUBNUB,e.get=t}(t=e.externals||(e.externals={}))}(t=e.sdk||(e.sdk={}))}(RingCentral||(RingCentral={}));var RingCentral;!function(e){var t;!function(e){var t;!function(t){var r=function(){function r(e,t,r){this._text=r,this._request=e,this._response=t,this._json=null,this._multipartTransactions=null}return r.prototype.response=function(){return this._response},r.prototype.request=function(){return this._request},r.prototype.ok=function(){return this._response&&this._response.ok},r.prototype.text=function(){return this._text},r.prototype.json=function(){if(!this._isJson())throw new Error("Response is not JSON");return this._json||(this._json=this._text?JSON.parse(this._text):null),this._json},r.prototype.error=function(e){if(this.ok()&&!e)return null;var t=(this._response&&this._response.status?this._response.status+" ":"")+(this._response&&this._response.statusText?this._response.statusText:"");try{var r=this.json();r.message&&(t=r.message),r.error_description&&(t=r.error_description),r.description&&(t=r.description)}catch(n){}return t},r.prototype.multipart=function(){if(!this._isMultipart())throw new Error("Response is not multipart");if(null===this._multipartTransactions){if(!this._text)throw new Error("No response body");var e=this._response.headers.get("Content-Type").match(/boundary=([^;]+)/i)[1];if(!e)throw new Error("Cannot find boundary");var t=this._text.toString().split(r.boundarySeparator+e);if(""===t[0].trim()&&t.shift(),t[t.length-1].trim()==r.boundarySeparator&&t.pop(),t.length<1)throw new Error("No parts in body");var n=r.create(t.shift(),this._response.status,this._response.statusText);this._multipartTransactions=t.map(function(e,t){var o=n.json().response[t].status;return r.create(e,o)})}return this._multipartTransactions},r.prototype.multipartJson=function(){return this.multipart().map(function(e){return e.json()})},r.prototype._isContentType=function(e){return this._getContentType().indexOf(e)>-1},r.prototype._getContentType=function(){return this._response.headers.get(r.contentType)||""},r.prototype._isMultipart=function(){return this._isContentType(r.multipartContentType)},r.prototype._isUrlEncoded=function(){return this._isContentType(r.urlencodedContentType)},r.prototype._isJson=function(){return this._isContentType(r.jsonContentType)},r.create=function(n,o,i){o=o||200,i=i||"OK",n=n.replace(/\r/g,"");var s=new e.externals._Headers,u=n.split(r.bodySeparator),a=u.length>1?u.shift():"";return n=u.join(r.bodySeparator),(a||"").split("\n").forEach(function(e){var t=e.trim().split(r.headerSeparator),n=t.shift().trim(),o=t.join(r.headerSeparator).trim();n&&s.append(n,o)}),new r(null,t.Client.createResponse(n,{headers:s,status:o,statusText:i}),n)},r.contentType="Content-Type",r.jsonContentType="application/json",r.multipartContentType="multipart/mixed",r.urlencodedContentType="application/x-www-form-urlencoded",r.headerSeparator=":",r.bodySeparator="\n\n",r.boundarySeparator="--",r}();t.ApiResponse=r}(t=e.http||(e.http={}))}(t=e.sdk||(e.sdk={}))}(RingCentral||(RingCentral={}));var RingCentral;!function(e){var t;!function(e){var t;!function(t){var r=["GET","POST","PUT","DELETE","PATCH","OPTIONS","HEAD"],n=function(n){function o(){n.apply(this,arguments),this.events={beforeRequest:"beforeRequest",requestSuccess:"requestSuccess",requestError:"requestError"}}return __extends(o,n),o.prototype.sendRequest=function(r){var n=this,i=new t.ApiResponse(r);return new e.externals._Promise(function(e){n.emit(n.events.beforeRequest,i),e(n._loadResponse(r))}).then(function(e){return i._response=o.cloneResponse(e),e.text()}).then(function(e){if(i._text=e,!i.ok())throw o.makeError(new Error("Response has unsuccessful status"),i);return n.emit(n.events.requestSuccess,i),i})["catch"](function(e){throw e.apiResponse||(e=o.makeError(e,i)),n.emit(n.events.requestError,e),e})},o.prototype._loadResponse=function(t){return e.externals._fetch.call(null,t)},o.makeError=function(e,t){var r=e;return r.hasOwnProperty("apiResponse")||r.hasOwnProperty("originalMessage")||(r.apiResponse=t,r.originalMessage=r.message,r.message=t&&t.error(!0)||r.originalMessage),r},o.cloneResponse=function(t){if(e.core.utils.isFunction(t.clone))return t.clone();var r="";t.hasOwnProperty("_bodyInit")&&(r=t._bodyInit),t.hasOwnProperty("_bodyText")&&(r=t._bodyText),t.hasOwnProperty("_bodyBlob")&&(r=t._bodyBlob.slice()),t.hasOwnProperty("_bodyFormData")&&(r=t._bodyFormData),t.hasOwnProperty("_raw")&&(r=t._raw.join(""));var n=new e.externals._Response(r,t);return t.hasOwnProperty("body")&&(n.body=t.body),n},o.createResponse=function(t,r){return r=r||{},new e.externals._Response(t,r)},o.createRequest=function(t,n){n=n||{};var o=n.body,i=new e.externals._Request(t,e.core.utils.extend({},n,{body:null}));if(!i.url)throw new Error("Url is not defined");if(i.method||(i.method="GET"),i.method&&r.indexOf(i.method)<0)throw new Error("Method has wrong value: "+i.method);if(i.headers.has("Accept")||i.headers.set("Accept","application/json"),e.core.utils.isPlainObject(n.body)||!n.body){i.headers.has("Content-Type")||i.headers.set("Content-Type","application/json");var s=i.headers.get("Content-Type");s.indexOf("application/json")>-1?o=JSON.stringify(n.body):s.indexOf("application/x-www-form-urlencoded")>-1&&(o=e.core.utils.queryStringify(n.body))}return i.credentials="include",i.mode="cors",n.query&&(i.url=i.url+(i.url.indexOf("?")>-1?"&":"?")+e.core.utils.queryStringify(n.query)),i=new e.externals._Request(i.url,e.core.utils.extend(i,{body:o})),i.body=n.body,i},o}(e.core.Observable);t.Client=n}(t=e.http||(e.http={}))}(t=e.sdk||(e.sdk={}))}(RingCentral||(RingCentral={}));var RingCentral;!function(e){var t;!function(e){var t;!function(t){var r=function(){function t(e,t){this._cache=e,this._cacheId=t,this.setPollInterval(250),this.setReleaseTimeout(5e3)}return t.prototype.isPaused=function(){var e=this._cache,t=this._cacheId,r=e.getItem(t);return!!r&&Date.now()-parseInt(r)-1?"&":"?"),t.addMethod&&(r+="_method="+t.addMethod),t.addToken&&(r+=(t.addMethod?"&":"")+"access_token="+this._auth.accessToken()),r},n.prototype.authUrl=function(t){return t=t||{},this.createUrl(n._authorizeEndpoint+"?"+e.core.utils.queryStringify({response_type:"code",redirect_uri:t.redirectUri||"",client_id:this._appKey,state:t.state||"",brand_id:t.brandId||"",display:t.display||"",prompt:t.prompt||""}),{addServer:!0})},n.prototype.parseAuthRedirectUrl=function(t){var r=e.core.utils.parseQueryString(t.split("?").reverse()[0]),n=r.error_description||r.error;if(n){var o=new Error(n);throw o.error=r.error,o}return r},n.prototype.loggedIn=function(){return this._ensureAuthentication().then(function(){return!0})["catch"](function(){return!1})},n.prototype.login=function(e){var t=this;e=e||{},e.remember=e.remember||!1;var r={access_token_ttl:n._accessTokenTtl,refresh_token_ttl:e.remember?n._refreshTokenTtlRemember:n._refreshTokenTtl};return 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),this._tokenRequest(n._tokenEndpoint,r).then(function(r){return t._auth.setData(r.json()).setRemember(e.remember),t.emit(t.events.authorizeSuccess,r),r})["catch"](function(e){throw t._cache.clean(),t.emit(t.events.authorizeError,e),e})},n.prototype.refresh=function(){var t=this,r=new e.externals._Promise(function(r,o){return t._queue.isPaused()?r(t._refreshPolling()):(t._queue.pause(),void setTimeout(function(){return e.core.log.debug("Platform.refresh(): Performing token refresh (access token",t._auth.accessToken(),", refresh token",t._auth.refreshToken(),")"),t._auth.refreshToken()?t._auth.refreshTokenValid()?t._queue.isPaused()?void r(t._tokenRequest(n._tokenEndpoint,{grant_type:"refresh_token",refresh_token:t._auth.refreshToken(),access_token_ttl:n._accessTokenTtl,refresh_token_ttl:t._auth.remember()?n._refreshTokenTtlRemember:n._refreshTokenTtl})):o(new Error("Queue was resumed before refresh call")):o(new Error("Refresh token has expired")):o(new Error("Refresh token is missing"))},t._refreshDelayMs))});return r.then(function(r){if(r&&r.json&&r.json()){var n=r.json();if(e.core.log.info("Platform.refresh(): Token was refreshed",r),!n.refresh_token||!n.access_token)throw e.http.Client.makeError(new Error("Malformed OAuth response"),r);t._auth.setData(n),t._queue.resume()}return t.emit(t.events.refreshSuccess,r),r})["catch"](function(r){throw r=e.http.Client.makeError(r),t._clearCacheOnRefreshError&&t._cache.clean(),t.emit(t.events.accessViolation,r),t.emit(t.events.refreshError,r),r})},n.prototype.logout=function(){var e=this;return this._queue.pause(),this._tokenRequest(n._revokeEndpoint,{token:this._auth.accessToken()}).then(function(t){return e._queue.resume(),e._cache.clean(),e.emit(e.events.logoutSuccess,t),t})["catch"](function(t){throw e._queue.resume(),e.emit(e.events.accessViolation,t),e.emit(e.events.logoutError,t),t})},n.prototype.inflateRequest=function(t,r){var n=this;return r=r||{},r.skipAuthCheck?e.externals._Promise.resolve(t):this._ensureAuthentication().then(function(){return t.headers.set("Authorization",n._authHeader()),t.url=n.createUrl(t.url,{addServer:!0}),t})},n.prototype.sendRequest=function(e,t){var r=this;return this.inflateRequest(e,t).then(function(e){return r._client.sendRequest(e)})["catch"](function(n){if(!n.apiResponse||!n.apiResponse.response()||401!=n.apiResponse.response().status)throw n;return r._auth.cancelAccessToken(),r.sendRequest(e,t)})},n.prototype.send=function(t,r){try{return t=this.createUrl(t,{addServer:!0}),this.sendRequest(e.http.Client.createRequest(t,r),r)}catch(n){return e.externals._Promise.reject(n)}},n.prototype.get=function(e,t){return t=t||{},t.method="GET",this.send(e,t)},n.prototype.post=function(e,t){return t=t||{},t.method="POST",this.send(e,t)},n.prototype.put=function(e,t){return t=t||{},t.method="PUT",this.send(e,t)},n.prototype["delete"]=function(e,t){return t=t||{},t.method="DELETE",this.send(e,t)},n.prototype._tokenRequest=function(e,t){return this.send(e,{skipAuthCheck:!0,body:t,method:"POST",headers:{Authorization:"Basic "+this._apiKey(),"Content-Type":"application/x-www-form-urlencoded"}})},n.prototype._ensureAuthentication=function(){return this._isAccessTokenValid()?e.externals._Promise.resolve(null):this.refresh()},n.prototype._isAccessTokenValid=function(){return this._auth.accessTokenValid()&&!this._queue.isPaused()},n.prototype._refreshPolling=function(){var t=this;return e.core.log.warn("Platform.refresh(): Refresh is already in progress, polling started"),this._queue.poll().then(function(){if(!t._isAccessTokenValid())throw new Error("Automatic authentification timeout");return null})},n.prototype._apiKey=function(){var e=this._appKey+":"+this._appSecret;return"function"==typeof btoa?btoa(e):new Buffer(e).toString("base64")},n.prototype._authHeader=function(){var e=this._auth.accessToken();return this._auth.tokenType()+(e?" "+e:"")},n._urlPrefix="/restapi",n._apiVersion="v1.0",n._accessTokenTtl=null,n._refreshTokenTtl=36e3,n._refreshTokenTtlRemember=604800,n._tokenEndpoint="/restapi/oauth/token",n._revokeEndpoint="/restapi/oauth/revoke",n._authorizeEndpoint="/restapi/oauth/authorize",n}(e.core.Observable);t.Platform=r}(t=e.platform||(e.platform={}))}(t=e.sdk||(e.sdk={}))}(RingCentral||(RingCentral={}));var RingCentral;!function(e){var t;!function(e){var t;!function(t){var r=function(t){function r(e,r){t.call(this),this._renewHandicapMs=12e4,this.events={notification:"notification",removeSuccess:"removeSuccess",removeError:"removeError",renewSuccess:"renewSuccess",renewError:"renewError",subscribeSuccess:"subscribeSuccess",subscribeError:"subscribeError"},this._pubnubFactory=e,this._platform=r,this._pubnub=null,this._eventFilters=[],this._timeout=null,this._subscription=null}return __extends(r,t),r.prototype.alive=function(){return this._subscription&&this._subscription.id&&this._subscription.deliveryMode&&this._subscription.deliveryMode.subscriberKey&&this._subscription.deliveryMode.address},r.prototype.setSubscription=function(e){return this._clearTimeout(),this._subscription=e,this._pubnub||this._subscribeAtPubnub(),this._setTimeout(),this},r.prototype.subscription=function(){return this._subscription},r.prototype.register=function(e){return this.alive()?this.renew(e):this.subscribe(e)},r.prototype.addEvents=function(e){return this._eventFilters=this._eventFilters.concat(e),this},r.prototype.setEvents=function(e){return this._eventFilters=e,this},r.prototype.subscribe=function(t){var r=this;return t=t||{},t.events&&this.setEvents(t.events),this._clearTimeout(),new e.externals._Promise(function(e,t){if(!r._eventFilters||!r._eventFilters.length)throw new Error("Events are undefined");e(r._platform.post("/restapi/v1.0/subscription",{body:{eventFilters:r._getFullEventFilters(),deliveryMode:{transportType:"PubNub"}}}))}).then(function(e){return r.setSubscription(e.json()).emit(r.events.subscribeSuccess,e),e})["catch"](function(t){throw t=e.http.Client.makeError(t),r.reset().emit(r.events.subscribeError,t),t})},r.prototype.renew=function(t){var r=this;return t=t||{},t.events&&this.setEvents(t.events),this._clearTimeout(),new e.externals._Promise(function(e,t){if(!r.alive())throw new Error("Subscription is not alive");if(!r._eventFilters||!r._eventFilters.length)throw new Error("Events are undefined");return r._platform.put("/restapi/v1.0/subscription/"+r._subscription.id,{body:{eventFilters:r._getFullEventFilters()}})}).then(function(e){return r.setSubscription(e.json()).emit(r.events.renewSuccess,e.json()),e})["catch"](function(t){throw t=e.http.Client.makeError(t),r.reset().emit(r.events.renewError,t),t})},r.prototype.remove=function(){var t=this;return new e.externals._Promise(function(e,r){if(!t._subscription||!t._subscription.id)throw new Error("Subscription ID is required");e(t._platform["delete"]("/restapi/v1.0/subscription/"+t._subscription.id))}).then(function(e){return t.reset().emit(t.events.removeSuccess,e),e})["catch"](function(r){throw r=e.http.Client.makeError(r),t.emit(t.events.removeError,r),r})},r.prototype.reset=function(){return this._clearTimeout(),this.alive()&&this._pubnub&&this._pubnub.unsubscribe({channel:this._subscription.deliveryMode.address}),this._subscription=null,this},r.prototype.destroy=function(){return this.reset(),e.core.log.info("RC.subscription.Subscription: Destroyed"),t.prototype.destroy.call(this)},r.prototype._getFullEventFilters=function(){var e=this;return this._eventFilters.map(function(t){return e._platform.createUrl(t)})},r.prototype._setTimeout=function(){var e=this;if(this._clearTimeout(),!this.alive())throw new Error("Subscription is not alive");var t=1e3*this._subscription.expiresIn-this._renewHandicapMs;return this._timeout=setTimeout(function(){e.renew({})},t),this},r.prototype._clearTimeout=function(){return clearTimeout(this._timeout),this},r.prototype._decrypt=function(e){if(!this.alive())throw new Error("Subscription is not alive");if(this._subscription.deliveryMode.encryptionKey){var t=this._pubnubFactory.getPubnub();e=t.crypto_obj.decrypt(e,this._subscription.deliveryMode.encryptionKey,{encryptKey:!1,keyEncoding:"base64",keyLength:128,mode:"ecb"})}return e},r.prototype._notify=function(e){return this.emit(this.events.notification,this._decrypt(e)),this},r.prototype._subscribeAtPubnub=function(){var t=this;if(!this.alive())throw new Error("Subscription is not alive");var r=this._pubnubFactory.getPubnub();return this._pubnub=r.init({ssl:!0,subscribe_key:this._subscription.deliveryMode.subscriberKey}),this._pubnub.ready(),this._pubnub.subscribe({channel:this._subscription.deliveryMode.address,message:function(r,n,o){e.core.log.info("RC.core.Subscription: Incoming message",r),t._notify(r)},connect:function(){e.core.log.info("RC.core.Subscription: PUBNUB connected")}}),this},r}(e.core.Observable);t.Subscription=r}(t=e.subscription||(e.subscription={}))}(t=e.sdk||(e.sdk={}))}(RingCentral||(RingCentral={}));var RingCentral;!function(e){var t;!function(e){var t;!function(t){var r=function(t){function r(r){t.call(this),this.options=r,this.crypto_obj=e.externals._PUBNUB.crypto_obj}return __extends(r,t),r.prototype.ready=function(){},r.prototype.subscribe=function(e){this.on("message-"+e.channel,e.message)},r.prototype.unsubscribe=function(e){this.off("message-"+e.channel)},r.prototype.receiveMessage=function(e,t){this.emit("message-"+t,e,"env",t)},r}(e.core.Observable);t.PubnubMock=r;var n=function(){function t(){this.crypto_obj=e.externals._PUBNUB.crypto_obj}return t.prototype.init=function(e){return new r(e)},t}();t.PubnubMockFactory=n}(t=e.pubnub||(e.pubnub={}))}(t=e.sdk||(e.sdk={}))}(RingCentral||(RingCentral={}));var RingCentral;!function(e){var t;!function(e){var t;!function(t){var r=function(){function r(e){this._useMock=!1,this._useMock=!!e,this._mock=new t.PubnubMockFactory}return r.prototype.getPubnub=function(){return this._useMock?this._mock:e.externals._PUBNUB},r}();t.PubnubFactory=r}(t=e.pubnub||(e.pubnub={}))}(t=e.sdk||(e.sdk={}))}(RingCentral||(RingCentral={}));var RingCentral;!function(e){var t;!function(e){var t=function(){function t(t){t=t||{},e.externals.get(),this._mockRegistry=new e.mocks.Registry,this._cache=new e.core.Cache("undefined"!=typeof localStorage?localStorage:{},t.cachePrefix),this._queue=new e.platform.Queue(this._cache,"platform-refresh"),this._client=t.useHttpMock?new e.http.ClientMock(this._mockRegistry):new e.http.Client,this._platform=new e.platform.Platform(this._client,this._cache,this._queue,t.server,t.appKey,t.appSecret),this._pubnubFactory=new e.pubnub.PubnubFactory(t.usePubnubMock)}return t.prototype.platform=function(){return this._platform},t.prototype.cache=function(){return this._cache},t.prototype.createSubscription=function(){return new e.subscription.Subscription(this._pubnubFactory,this._platform); - -},t.prototype.createPageVisibility=function(){return new e.core.PageVisibility},t.prototype.createObservable=function(){return new e.core.Observable},t.prototype.log=function(){return e.core.log},t.prototype.utils=function(){return e.core.utils},t.prototype.mockRegistry=function(){return this._mockRegistry},t.version="2.0.0",t.server={sandbox:"https://platform.devtest.ringcentral.com",production:"https://platform.ringcentral.com"},t}();e.SDK=t}(t=e.sdk||(e.sdk={}))}(RingCentral||(RingCentral={}));var e=RingCentral.sdk.externals.get();"function"==typeof define&&define.amd?define(["pubnub"],function(t){return e._PUBNUB=t,RingCentral.sdk}):"object"==typeof module&&module.exports&&(e._PUBNUB=require("pubnub"),e._Promise="undefined"!=typeof Promise?Promise:require("es6-promise").Promise,e._fetch=require("node-fetch"),e._Request=e._fetch.Request,e._Response=e._fetch.Response,e._Headers=e._fetch.Headers,module.exports=RingCentral.sdk);var RingCentral;!function(e){var t;!function(e){var t;!function(t){var r=function(t){function r(e){t.call(this),this._registry=e}return __extends(r,t),r.prototype._loadResponse=function(t){var r=this;return new e.externals._Promise(function(n){e.core.log.debug("API REQUEST",t.method,t.url);var o=r._registry.find(t);n(o.getResponse(t))})},r}(t.Client);t.ClientMock=r}(t=e.http||(e.http={}))}(t=e.sdk||(e.sdk={}))}(RingCentral||(RingCentral={}));var RingCentral;!function(e){var t;!function(e){var t;!function(t){var r=function(){function t(e,t){this._cache=e,this._cacheId=t}return t.prototype.accessToken=function(){return this.data().access_token},t.prototype.refreshToken=function(){return this.data().refresh_token},t.prototype.tokenType=function(){return this.data().token_type},t.prototype.data=function(){return this._cache.getItem(this._cacheId)||{token_type:"",access_token:"",expires_in:0,refresh_token:"",refresh_token_expires_in:0}},t.prototype.setData=function(t){var r=this.data();return t=e.core.utils.extend({},r,t),t.expire_time=Date.now()+1e3*t.expires_in,t.refresh_token_expire_time=Date.now()+1e3*t.refresh_token_expires_in,e.core.log.info("Auth.setData(): Tokens were updated, new:",t,", old:",r),this._cache.setItem(this._cacheId,t),this},t.prototype.accessTokenValid=function(){var e=this.data();return e.token_type===t.forcedTokenType||e.expire_time-t.refreshHandicapMs>Date.now()},t.prototype.refreshTokenValid=function(){return this.data().refresh_token_expire_time>Date.now()},t.prototype.cancelAccessToken=function(){return this.setData({access_token:"",expires_in:0})},t.prototype.forceAuthentication=function(){return this.setData({token_type:t.forcedTokenType,access_token:"",expires_in:0,refresh_token:"",refresh_token_expires_in:0}),this},t.prototype.setRemember=function(e){return this.setData({remember:e})},t.prototype.remember=function(){return!!this.data().remember},t.refreshHandicapMs=6e4,t.forcedTokenType="forced",t}();t.Auth=r}(t=e.platform||(e.platform={}))}(t=e.sdk||(e.sdk={}))}(RingCentral||(RingCentral={})); -//# sourceMappingURL=ringcentral.min.js.map \ No newline at end of file +!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}())}])}); +//# sourceMappingURL=ringcentral.min.js.map diff --git a/build/ringcentral.min.js.map b/build/ringcentral.min.js.map index ae2210e3..b6078687 100644 --- a/build/ringcentral.min.js.map +++ b/build/ringcentral.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["/source/core/Cache.ts","/source/core/Log.ts","ringcentral.js","/source/core/Utils.ts","/source/core/Observable.ts","/source/core/PageVisibility.ts","/source/mocks/Mock.ts","/source/mocks/Registry.ts","/source/externals/Externals.ts","/source/http/ApiResponse.ts","/source/http/Client.ts","/source/platform/Queue.ts","/source/platform/Platform.ts","/source/subscription/Subscription.ts","/source/pubnub/PubnubMock.ts","/source/pubnub/PubnubFactory.ts","/source/SDK.ts","/source/http/ClientMock.ts","/source/platform/Auth.ts"],"names":["RingCentral","RingCentral.sdk","RingCentral.sdk.core","RingCentral.sdk.core.Cache","RingCentral.sdk.core.Cache.constructor","RingCentral.sdk.core.Cache.setPrefix","RingCentral.sdk.core.Cache.setItem","RingCentral.sdk.core.Cache.removeItem","RingCentral.sdk.core.Cache.getItem","RingCentral.sdk.core.Cache.clean","RingCentral.sdk.core.Cache._prefixKey","Log","RingCentral.sdk.core.Log","RingCentral.sdk.core.Log.constructor","RingCentral.sdk.core.Log.disableAll","RingCentral.sdk.core.Log.enableAll","RingCentral.sdk.core.Log.debug","RingCentral.sdk.core.Log.info","RingCentral.sdk.core.Log.warn","RingCentral.sdk.core.Log.error","RingCentral.sdk.core.Log.stack","RingCentral.sdk.core.Log._parseArguments","extend","RingCentral.sdk.core.utils","RingCentral.sdk.core.utils.extend","RingCentral.sdk.core.utils.forEach","queryStringify","RingCentral.sdk.core.utils.queryStringify","parseQueryString","RingCentral.sdk.core.utils.parseQueryString","isEmail","RingCentral.sdk.core.utils.isEmail","RingCentral.sdk.core.utils.isPhoneNumber","argumentsToArray","RingCentral.sdk.core.utils.argumentsToArray","RingCentral.sdk.core.utils.isDate","RingCentral.sdk.core.utils.isFunction","RingCentral.sdk.core.utils.isArray","isWindow","RingCentral.sdk.core.utils.isWindow","RingCentral.sdk.core.utils.isNan","RingCentral.sdk.core.utils.type","RingCentral.sdk.core.utils.isPlainObject","RingCentral.sdk.core.utils.getProperty","RingCentral.sdk.core.utils.poll","RingCentral.sdk.core.utils.stopPolling","RingCentral.sdk.core.utils.parseString","RingCentral.sdk.core.utils.parseNumber","RingCentral.sdk.core.utils.isNodeJS","RingCentral.sdk.core.utils.isBrowser","Observable","RingCentral.sdk.core.Observable","RingCentral.sdk.core.Observable.constructor","RingCentral.sdk.core.Observable.hasListeners","RingCentral.sdk.core.Observable.on","RingCentral.sdk.core.Observable.emit","RingCentral.sdk.core.Observable.off","RingCentral.sdk.core.Observable.destroy","__extends","this","d","b","__","constructor","p","hasOwnProperty","prototype","RingCentral.sdk.core.PageVisibility","RingCentral.sdk.core.PageVisibility.constructor","RingCentral.sdk.core.PageVisibility.visible","RingCentral.sdk.mocks","RingCentral.sdk.mocks.Mock","RingCentral.sdk.mocks.Mock.constructor","RingCentral.sdk.mocks.Mock.path","RingCentral.sdk.mocks.Mock.method","RingCentral.sdk.mocks.Mock.test","RingCentral.sdk.mocks.Mock.getResponse","RingCentral.sdk.mocks.Mock.createResponse","RingCentral.sdk.mocks.Registry","RingCentral.sdk.mocks.Registry.constructor","RingCentral.sdk.mocks.Registry.add","RingCentral.sdk.mocks.Registry.clear","RingCentral.sdk.mocks.Registry.find","RingCentral.sdk.mocks.Registry.apiCall","RingCentral.sdk.mocks.Registry.authentication","RingCentral.sdk.mocks.Registry.logout","RingCentral.sdk.mocks.Registry.presenceLoad","RingCentral.sdk.mocks.Registry.subscribeGeneric","RingCentral.sdk.mocks.Registry.subscribeOnPresence","RingCentral.sdk.mocks.Registry.tokenRefresh","RingCentral.sdk.externals","RingCentral.sdk.externals.get","ApiResponse","RingCentral.sdk.http.ApiResponse","RingCentral.sdk.http.ApiResponse.constructor","RingCentral.sdk.http.ApiResponse.response","RingCentral.sdk.http.ApiResponse.request","RingCentral.sdk.http.ApiResponse.ok","RingCentral.sdk.http.ApiResponse.text","RingCentral.sdk.http.ApiResponse.json","RingCentral.sdk.http.ApiResponse.error","RingCentral.sdk.http.ApiResponse.multipart","RingCentral.sdk.http.ApiResponse.multipartJson","RingCentral.sdk.http.ApiResponse._isContentType","RingCentral.sdk.http.ApiResponse._getContentType","RingCentral.sdk.http.ApiResponse._isMultipart","RingCentral.sdk.http.ApiResponse._isUrlEncoded","RingCentral.sdk.http.ApiResponse._isJson","RingCentral.sdk.http.ApiResponse.create","RingCentral.sdk.http","RingCentral.sdk.http.Client","RingCentral.sdk.http.Client.constructor","RingCentral.sdk.http.Client.sendRequest","RingCentral.sdk.http.Client._loadResponse","RingCentral.sdk.http.Client.makeError","RingCentral.sdk.http.Client.cloneResponse","RingCentral.sdk.http.Client.createResponse","RingCentral.sdk.http.Client.createRequest","RingCentral.sdk.platform","RingCentral.sdk.platform.Queue","RingCentral.sdk.platform.Queue.constructor","RingCentral.sdk.platform.Queue.isPaused","RingCentral.sdk.platform.Queue.pause","RingCentral.sdk.platform.Queue.resume","RingCentral.sdk.platform.Queue.poll","RingCentral.sdk.platform.Queue.releaseTimeout","RingCentral.sdk.platform.Queue.pollInterval","RingCentral.sdk.platform.Queue.setReleaseTimeout","RingCentral.sdk.platform.Queue.setPollInterval","RingCentral.sdk.platform.Platform","RingCentral.sdk.platform.Platform.constructor","RingCentral.sdk.platform.Platform.auth","RingCentral.sdk.platform.Platform.createUrl","RingCentral.sdk.platform.Platform.authUrl","RingCentral.sdk.platform.Platform.parseAuthRedirectUrl","RingCentral.sdk.platform.Platform.loggedIn","RingCentral.sdk.platform.Platform.login","RingCentral.sdk.platform.Platform.refresh","RingCentral.sdk.platform.Platform.logout","RingCentral.sdk.platform.Platform.inflateRequest","RingCentral.sdk.platform.Platform.sendRequest","RingCentral.sdk.platform.Platform.send","RingCentral.sdk.platform.Platform.get","RingCentral.sdk.platform.Platform.post","RingCentral.sdk.platform.Platform.put","RingCentral.sdk.platform.Platform.delete","RingCentral.sdk.platform.Platform._tokenRequest","RingCentral.sdk.platform.Platform._ensureAuthentication","RingCentral.sdk.platform.Platform._isAccessTokenValid","RingCentral.sdk.platform.Platform._refreshPolling","RingCentral.sdk.platform.Platform._apiKey","RingCentral.sdk.platform.Platform._authHeader","RingCentral.sdk.subscription","RingCentral.sdk.subscription.Subscription","RingCentral.sdk.subscription.Subscription.constructor","RingCentral.sdk.subscription.Subscription.alive","RingCentral.sdk.subscription.Subscription.setSubscription","RingCentral.sdk.subscription.Subscription.subscription","RingCentral.sdk.subscription.Subscription.register","RingCentral.sdk.subscription.Subscription.addEvents","RingCentral.sdk.subscription.Subscription.setEvents","RingCentral.sdk.subscription.Subscription.subscribe","RingCentral.sdk.subscription.Subscription.renew","RingCentral.sdk.subscription.Subscription.remove","RingCentral.sdk.subscription.Subscription.reset","RingCentral.sdk.subscription.Subscription.destroy","RingCentral.sdk.subscription.Subscription._getFullEventFilters","RingCentral.sdk.subscription.Subscription._setTimeout","RingCentral.sdk.subscription.Subscription._clearTimeout","RingCentral.sdk.subscription.Subscription._decrypt","RingCentral.sdk.subscription.Subscription._notify","RingCentral.sdk.subscription.Subscription._subscribeAtPubnub","RingCentral.sdk.pubnub","RingCentral.sdk.pubnub.PubnubMock","RingCentral.sdk.pubnub.PubnubMock.constructor","RingCentral.sdk.pubnub.PubnubMock.subscribe","RingCentral.sdk.pubnub.PubnubMock.unsubscribe","RingCentral.sdk.pubnub.PubnubMock.receiveMessage","RingCentral.sdk.pubnub.PubnubMockFactory","RingCentral.sdk.pubnub.PubnubMockFactory.constructor","RingCentral.sdk.pubnub.PubnubMockFactory.init","RingCentral.sdk.pubnub.PubnubFactory","RingCentral.sdk.pubnub.PubnubFactory.constructor","RingCentral.sdk.pubnub.PubnubFactory.getPubnub","RingCentral.sdk.SDK","RingCentral.sdk.SDK.constructor","RingCentral.sdk.SDK.platform","RingCentral.sdk.SDK.cache","RingCentral.sdk.SDK.createSubscription","RingCentral.sdk.SDK.createPageVisibility","RingCentral.sdk.SDK.createObservable","RingCentral.sdk.SDK.log","RingCentral.sdk.SDK.utils","RingCentral.sdk.SDK.mockRegistry","e","sdk","externals","get","define","amd","PUBNUB","_PUBNUB","module","exports","require","_Promise","Promise","_fetch","_Request","_Response","_Headers","RingCentral.sdk.http.ClientMock","RingCentral.sdk.http.ClientMock.constructor","RingCentral.sdk.http.ClientMock._loadResponse","RingCentral.sdk.platform.Auth","RingCentral.sdk.platform.Auth.constructor","RingCentral.sdk.platform.Auth.accessToken","RingCentral.sdk.platform.Auth.refreshToken","RingCentral.sdk.platform.Auth.tokenType","RingCentral.sdk.platform.Auth.data","RingCentral.sdk.platform.Auth.setData","RingCentral.sdk.platform.Auth.accessTokenValid","RingCentral.sdk.platform.Auth.refreshTokenValid","RingCentral.sdk.platform.Auth.cancelAccessToken","RingCentral.sdk.platform.Auth.forceAuthentication","RingCentral.sdk.platform.Auth.setRemember","RingCentral.sdk.platform.Auth.remember"],"mappings":"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","file":"ringcentral.min.js","sourcesContent":["module RingCentral.sdk.core {\n\n export class Cache {\n\n private _storage:Storage;\n private _prefix:string;\n\n constructor(storage:Storage|any, prefix?:string) {\n this.setPrefix(prefix);\n this._storage = storage;\n }\n\n setPrefix(prefix?:string) {\n this._prefix = prefix || 'rc-';\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 protected _prefixKey(key) {\n return this._prefix + key;\n }\n\n }\n\n}\n\n","module RingCentral.sdk.core {\n\n /**\n * TODO Fix public vars\n */\n export class Log {\n\n public _console:Console;\n public logDebug:boolean;\n public logInfo:boolean;\n public logWarnings:boolean;\n public logErrors:boolean;\n public addTimestamps:boolean;\n\n constructor(console?:Console) {\n\n if (!console) {\n console = { // safety\n log: () => {},\n warn: () => {},\n info: () => {},\n error: () => {}\n };\n }\n\n this._console = console;\n\n this.logDebug = false;\n this.logInfo = false;\n this.logWarnings = false;\n this.logErrors = false;\n\n this.addTimestamps = false;\n\n }\n\n disableAll() {\n this.logDebug = false;\n this.logInfo = false;\n this.logWarnings = false;\n this.logErrors = false;\n }\n\n enableAll() {\n this.logDebug = true;\n this.logInfo = true;\n this.logWarnings = true;\n this.logErrors = true;\n }\n\n debug(...args) {\n if (this.logDebug) this._console.log.apply(this._console, this._parseArguments(arguments));\n }\n\n info(...args) {\n if (this.logInfo) this._console.info.apply(this._console, this._parseArguments(arguments));\n }\n\n warn(...args) {\n if (this.logWarnings) this._console.warn.apply(this._console, this._parseArguments(arguments));\n }\n\n error(...args) {\n if (this.logErrors) this._console.error.apply(this._console, this._parseArguments(arguments));\n }\n\n stack() {\n var e = new Error();\n if (e.hasOwnProperty('stack')) {\n return e.stack.replace('Error\\n', 'Stack Trace\\n');\n }\n }\n\n protected _parseArguments(args) {\n args = utils.argumentsToArray(args);\n if (this.addTimestamps) args.unshift(new Date().toLocaleString(), '-');\n return args;\n }\n\n }\n\n export var log = new Log();\n\n}","var RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var core;\n (function (core) {\n var Cache = (function () {\n function Cache(storage, prefix) {\n this.setPrefix(prefix);\n this._storage = storage;\n }\n Cache.prototype.setPrefix = function (prefix) {\n this._prefix = prefix || 'rc-';\n return this;\n };\n Cache.prototype.setItem = function (key, data) {\n this._storage[this._prefixKey(key)] = JSON.stringify(data);\n return this;\n };\n Cache.prototype.removeItem = function (key) {\n delete this._storage[this._prefixKey(key)];\n return this;\n };\n Cache.prototype.getItem = function (key) {\n var item = this._storage[this._prefixKey(key)];\n if (!item)\n return null;\n return JSON.parse(item);\n };\n Cache.prototype.clean = function () {\n for (var key in this._storage) {\n if (!this._storage.hasOwnProperty(key))\n continue;\n if (key.indexOf(this._prefix) === 0) {\n delete this._storage[key];\n }\n }\n return this;\n };\n Cache.prototype._prefixKey = function (key) {\n return this._prefix + key;\n };\n return Cache;\n })();\n core.Cache = Cache;\n })(core = sdk.core || (sdk.core = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var core;\n (function (core) {\n /**\n * TODO Fix public vars\n */\n var Log = (function () {\n function Log(console) {\n if (!console) {\n console = {\n log: function () { },\n warn: function () { },\n info: function () { },\n error: function () { }\n };\n }\n this._console = console;\n this.logDebug = false;\n this.logInfo = false;\n this.logWarnings = false;\n this.logErrors = false;\n this.addTimestamps = false;\n }\n Log.prototype.disableAll = function () {\n this.logDebug = false;\n this.logInfo = false;\n this.logWarnings = false;\n this.logErrors = false;\n };\n Log.prototype.enableAll = function () {\n this.logDebug = true;\n this.logInfo = true;\n this.logWarnings = true;\n this.logErrors = true;\n };\n Log.prototype.debug = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i - 0] = arguments[_i];\n }\n if (this.logDebug)\n this._console.log.apply(this._console, this._parseArguments(arguments));\n };\n Log.prototype.info = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i - 0] = arguments[_i];\n }\n if (this.logInfo)\n this._console.info.apply(this._console, this._parseArguments(arguments));\n };\n Log.prototype.warn = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i - 0] = arguments[_i];\n }\n if (this.logWarnings)\n this._console.warn.apply(this._console, this._parseArguments(arguments));\n };\n Log.prototype.error = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i - 0] = arguments[_i];\n }\n if (this.logErrors)\n this._console.error.apply(this._console, this._parseArguments(arguments));\n };\n Log.prototype.stack = function () {\n var e = new Error();\n if (e.hasOwnProperty('stack')) {\n return e.stack.replace('Error\\n', 'Stack Trace\\n');\n }\n };\n Log.prototype._parseArguments = function (args) {\n args = core.utils.argumentsToArray(args);\n if (this.addTimestamps)\n args.unshift(new Date().toLocaleString(), '-');\n return args;\n };\n return Log;\n })();\n core.Log = Log;\n core.log = new Log();\n })(core = sdk.core || (sdk.core = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var core;\n (function (core) {\n var utils;\n (function (utils) {\n var hasOwn = Object.prototype.hasOwnProperty, toString = Object.prototype.toString, rdigit = /\\d/, class2type = {};\n // Populate the class2type map\n 'Boolean Number String Function Array Date RegExp Object'.split(' ').forEach(function (name) {\n class2type[\"[object \" + name + \"]\"] = name.toLowerCase();\n });\n /**\n * Ported from jQuery.fn.extend\n * Optional first parameter makes deep copy\n */\n function extend(targetObject, sourceObject) {\n var args = [];\n for (var _i = 2; _i < arguments.length; _i++) {\n args[_i - 2] = arguments[_i];\n }\n var options, name, src, copy, copyIsArray, clone, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false;\n // Handle a deep copy situation\n if (typeof target === \"boolean\") {\n deep = target;\n // skip the boolean and the target\n target = arguments[i] || {};\n i++;\n }\n // Handle case when target is a string or something (possible in deep copy)\n if (typeof target !== \"object\" && !isFunction(target)) {\n target = {};\n }\n for (; i < length; i++) {\n // Only deal with non-null/undefined values\n if ((options = arguments[i]) !== null) {\n // Extend the base object\n for (name in options) {\n src = target[name];\n copy = options[name];\n // Prevent never-ending loop\n if (target === copy) {\n continue;\n }\n // Recurse if we're merging plain objects or arrays\n if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {\n if (copyIsArray) {\n copyIsArray = false;\n clone = src && isArray(src) ? src : [];\n }\n else {\n clone = src && isPlainObject(src) ? src : {};\n }\n // Never move original objects, clone them\n target[name] = extend(deep, clone, copy);\n }\n else if (copy !== undefined) {\n target[name] = copy;\n }\n }\n }\n }\n // Return the modified object\n return target;\n }\n utils.extend = extend;\n function forEach(object, cb) {\n for (var i in object) {\n if (!object.hasOwnProperty(i))\n continue;\n var res = cb(object[i], i);\n if (res === false)\n break;\n }\n }\n utils.forEach = forEach;\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 function queryStringify(parameters) {\n var array = [];\n forEach(parameters, function (v, i) {\n if (isArray(v)) {\n v.forEach(function (vv) {\n array.push(encodeURIComponent(i) + '=' + encodeURIComponent(vv));\n });\n }\n else {\n array.push(encodeURIComponent(i) + '=' + encodeURIComponent(v));\n }\n });\n return array.join('&');\n }\n utils.queryStringify = queryStringify;\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 function parseQueryString(queryString) {\n var argsParsed = {}, self = this;\n queryString.split('&').forEach(function (arg) {\n arg = decodeURIComponent(arg);\n if (arg.indexOf('=') == -1) {\n argsParsed[arg.trim()] = true;\n }\n else {\n var pair = arg.split('='), key = pair[0].trim(), value = pair[1].trim();\n if (key in argsParsed) {\n if (key in argsParsed && !self.isArray(argsParsed[key]))\n argsParsed[key] = [argsParsed[key]];\n argsParsed[key].push(value);\n }\n else {\n argsParsed[key] = value;\n }\n }\n });\n return argsParsed;\n }\n utils.parseQueryString = parseQueryString;\n /**\n * Returns true if the passed value is valid email address.\n * Checks multiple comma separated emails according to RFC 2822 if parameter `multiple` is `true`\n */\n function isEmail(v, multiple) {\n if (!!multiple) {\n //this Regexp is also suitable for multiple emails (comma separated)\n return /^(?:[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?[ ,;]*)+$/i.test(v);\n }\n else {\n return /^[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i.test(v);\n }\n }\n utils.isEmail = isEmail;\n function isPhoneNumber(v) {\n return (/\\+?1[0-9]{3}[0-9a-z]{7}/im.test(v.toString().split(/[^0-9a-z\\+]/im).join('')));\n }\n utils.isPhoneNumber = isPhoneNumber;\n /**\n * @param args\n * @returns {Array}\n */\n function argumentsToArray(args) {\n return Array.prototype.slice.call(args || [], 0);\n }\n utils.argumentsToArray = argumentsToArray;\n function isDate(obj) {\n return type(obj) === \"date\";\n }\n utils.isDate = isDate;\n function isFunction(obj) {\n return type(obj) === \"function\";\n }\n utils.isFunction = isFunction;\n function isArray(obj) {\n return Array.isArray ? Array.isArray(obj) : type(obj) === \"array\";\n }\n utils.isArray = isArray;\n // A crude way of determining if an object is a window\n function isWindow(obj) {\n return obj && typeof obj === \"object\" && \"setInterval\" in obj;\n }\n utils.isWindow = isWindow;\n function isNan(obj) {\n return obj === null || !rdigit.test(obj) || isNaN(obj);\n }\n utils.isNan = isNan;\n function type(obj) {\n return obj === null\n ? String(obj)\n : class2type[toString.call(obj)] || \"object\";\n }\n utils.type = type;\n function isPlainObject(obj) {\n // Must be an Object.\n // Because of IE, we also have to check the presence of the constructor property.\n // Make sure that DOM nodes and window objects don't pass through, as well\n if (!obj || type(obj) !== \"object\" || obj.nodeType || isWindow(obj)) {\n return false;\n }\n // Not own constructor property must be Object\n if (obj.constructor && !hasOwn.call(obj, \"constructor\") && !hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\")) {\n return false;\n }\n // Own properties are enumerated firstly, so to speed up,\n // if last one is own, then all properties are own.\n var key;\n for (key in obj) { }\n return key === undefined || hasOwn.call(obj, key);\n }\n utils.isPlainObject = isPlainObject;\n function getProperty(obj, property) {\n return property\n .split(/[.[\\]]/)\n .reduce(function (res, part) {\n if (!res)\n return undefined;\n return part ? res[part] : res;\n }, obj);\n }\n utils.getProperty = getProperty;\n function poll(fn, interval, timeout) {\n stopPolling(timeout);\n interval = interval || 1000;\n var next = function (delay) {\n delay = delay || interval;\n interval = delay;\n return setTimeout(function () {\n fn(next, delay);\n }, delay);\n };\n return next();\n }\n utils.poll = poll;\n function stopPolling(timeout) {\n if (timeout)\n clearTimeout(timeout);\n }\n utils.stopPolling = stopPolling;\n function parseString(s) {\n return s ? s.toString() : '';\n }\n utils.parseString = parseString;\n function parseNumber(n) {\n if (!n)\n return 0;\n n = parseFloat(n);\n return isNan(n) ? 0 : n;\n }\n utils.parseNumber = parseNumber;\n function isNodeJS() {\n return (typeof process !== 'undefined');\n }\n utils.isNodeJS = isNodeJS;\n function isBrowser() {\n return (typeof window !== 'undefined');\n }\n utils.isBrowser = isBrowser;\n })(utils = core.utils || (core.utils = {}));\n })(core = sdk.core || (sdk.core = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\n/// \n/// \nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var core;\n (function (core) {\n /**\n * @see https://github.com/Microsoft/TypeScript/issues/275\n */\n var Observable = (function () {\n function Observable() {\n if (!(this instanceof Observable))\n throw new Error('Observable(): New operator was omitted');\n this.off();\n }\n Observable.prototype.hasListeners = function (event) {\n return (event in this._listeners);\n };\n Observable.prototype.on = function (events, callback) {\n var _this = this;\n if (typeof events == 'string')\n events = [events];\n if (!events)\n throw new Error('No events to subscribe to');\n if (typeof callback !== 'function')\n throw new Error('Callback must be a function');\n events.forEach(function (event) {\n if (!_this.hasListeners(event))\n _this._listeners[event] = [];\n _this._listeners[event].push(callback);\n });\n return this;\n };\n Observable.prototype.emit = function (event) {\n var _this = this;\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n var result = null;\n if (!this.hasListeners(event))\n return null;\n this._listeners[event].some(function (callback) {\n result = callback.apply(_this, args);\n return (result === false);\n });\n return result;\n };\n Observable.prototype.off = function (event, callback) {\n var _this = this;\n if (!event) {\n this._listeners = {};\n }\n else {\n if (!callback) {\n delete this._listeners[event];\n }\n else {\n if (!this.hasListeners(event))\n return this;\n this._listeners[event].forEach(function (cb, i) {\n if (cb === callback)\n delete _this._listeners[event][i];\n });\n }\n }\n return this;\n };\n Observable.prototype.destroy = function () {\n this.off();\n core.log.debug('Observable.destroy(): Listeners were destroyed');\n return this;\n };\n return Observable;\n })();\n core.Observable = Observable;\n })(core = sdk.core || (sdk.core = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\n/// \nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n __.prototype = b.prototype;\n d.prototype = new __();\n};\nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var core;\n (function (core) {\n var PageVisibility = (function (_super) {\n __extends(PageVisibility, _super);\n function PageVisibility() {\n var _this = this;\n _super.call(this);\n this.events = {\n change: 'change'\n };\n var hidden = \"hidden\", onchange = function (evt) {\n evt = evt || window.event;\n var v = 'visible', h = 'hidden', evtMap = {\n focus: v, focusin: v, pageshow: v, blur: h, focusout: h, pagehide: h\n };\n _this._visible = (evt.type in evtMap) ? evtMap[evt.type] == v : !document[hidden];\n _this.emit(_this.events.change, _this._visible);\n };\n this._visible = true;\n if (typeof document == 'undefined' || typeof window == 'undefined')\n return;\n // Standards:\n if (hidden in document)\n document.addEventListener(\"visibilitychange\", onchange);\n else if ((hidden = \"mozHidden\") in document)\n document.addEventListener(\"mozvisibilitychange\", onchange);\n else if ((hidden = \"webkitHidden\") in document)\n document.addEventListener(\"webkitvisibilitychange\", onchange);\n else if ((hidden = \"msHidden\") in document)\n document.addEventListener(\"msvisibilitychange\", onchange);\n else if ('onfocusin' in document)\n document.onfocusin = document.onfocusout = onchange;\n else\n window.onpageshow = window.onpagehide = window.onfocus = window.onblur = onchange;\n }\n PageVisibility.prototype.visible = function () {\n return this._visible;\n };\n return PageVisibility;\n })(core.Observable);\n core.PageVisibility = PageVisibility;\n })(core = sdk.core || (sdk.core = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\n/// \n/// \nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var mocks;\n (function (mocks) {\n var Mock = (function () {\n function Mock(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 Mock.prototype.path = function () {\n return this._path;\n };\n Mock.prototype.method = function () {\n return this._method;\n };\n Mock.prototype.test = function (request) {\n return request.url.indexOf(this._path) > -1 &&\n request.method.toUpperCase() == this._method;\n };\n Mock.prototype.getResponse = function (request) {\n var _this = this;\n return new sdk.externals._Promise(function (resolve, reject) {\n setTimeout(function () {\n resolve(_this.createResponse(_this._json));\n }, _this._delay);\n });\n };\n Mock.prototype.createResponse = function (json, init) {\n init = init || {};\n init.status = init.status || this._status;\n init.statusText = init.statusText || this._statusText;\n var str = JSON.stringify(json), res = sdk.http.Client.createResponse(str, init);\n res.headers.set(sdk.http.ApiResponse.contentType, sdk.http.ApiResponse.jsonContentType);\n return res;\n };\n return Mock;\n })();\n mocks.Mock = Mock;\n })(mocks = sdk.mocks || (sdk.mocks = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\n/// \nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var mocks;\n (function (mocks) {\n var Registry = (function () {\n function Registry() {\n this._mocks = [];\n }\n Registry.prototype.add = function (mock) {\n this._mocks.push(mock);\n return this;\n };\n Registry.prototype.clear = function () {\n this._mocks = [];\n return this;\n };\n Registry.prototype.find = function (request) {\n //console.log('Registry is looking for', request);\n var mock = this._mocks.shift();\n if (!mock)\n throw new Error('No mock in registry for request ' + request.method + ' ' + request.url);\n if (!mock.test(request))\n throw new Error('Wrong request ' + request.method + ' ' + request.url +\n ' for expected mock ' + mock.method() + ' ' + mock.path());\n return mock;\n };\n Registry.prototype.apiCall = function (method, path, response, status, statusText) {\n this.add(new mocks.Mock(method, path, response, status, statusText));\n return this;\n };\n Registry.prototype.authentication = function () {\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 return this;\n };\n Registry.prototype.logout = function () {\n this.apiCall('POST', '/restapi/oauth/revoke', {});\n return this;\n };\n Registry.prototype.presenceLoad = function (id) {\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 return this;\n };\n Registry.prototype.subscribeGeneric = function (expiresIn) {\n expiresIn = expiresIn || 15 * 60 * 60;\n var date = new Date();\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 return this;\n };\n Registry.prototype.subscribeOnPresence = function (id, detailed) {\n id = id || '1';\n var date = new Date();\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 return this;\n };\n Registry.prototype.tokenRefresh = function (failure) {\n if (!failure) {\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 this.apiCall('POST', '/restapi/oauth/token', {\n 'message': 'Wrong token',\n 'error_description': 'Wrong token',\n 'description': 'Wrong token'\n }, 400);\n }\n return this;\n };\n return Registry;\n })();\n mocks.Registry = Registry;\n })(mocks = sdk.mocks || (sdk.mocks = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\n/// \nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var externals;\n (function (externals) {\n externals._Promise;\n externals._fetch;\n externals._Response;\n externals._Request;\n externals._Headers;\n externals._PUBNUB;\n function get() {\n var root = Function('return this')();\n if (!externals._PUBNUB)\n externals._PUBNUB = root.PUBNUB;\n if (!externals._Promise)\n externals._Promise = root.Promise;\n if (!externals._fetch)\n externals._fetch = root.fetch;\n if (!externals._Headers)\n externals._Headers = root.Headers;\n if (!externals._Request)\n externals._Request = root.Request;\n if (!externals._Response)\n externals._Response = root.Response;\n return externals;\n }\n externals.get = get;\n })(externals = sdk.externals || (sdk.externals = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\n/// \n/// \n/// \nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var http;\n (function (http) {\n /**\n * @TODO Bring back tests\n */\n var ApiResponse = (function () {\n function ApiResponse(request, response, responseText) {\n this._text = responseText;\n this._request = request;\n this._response = response;\n this._json = null;\n this._multipartTransactions = null;\n }\n ApiResponse.prototype.response = function () {\n return this._response;\n };\n ApiResponse.prototype.request = function () {\n return this._request;\n };\n ApiResponse.prototype.ok = function () {\n return this._response && this._response.ok;\n };\n ApiResponse.prototype.text = function () {\n return this._text;\n };\n ApiResponse.prototype.json = function () {\n if (!this._isJson())\n 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 ApiResponse.prototype.error = function (skipOKCheck) {\n if (this.ok() && !skipOKCheck)\n return null;\n var message = (this._response && this._response.status ? this._response.status + ' ' : '') +\n (this._response && this._response.statusText ? this._response.statusText : '');\n try {\n var json = this.json();\n if (json.message)\n message = json.message;\n if (json.error_description)\n message = json.error_description;\n if (json.description)\n message = json.description;\n }\n catch (ex) { }\n return message;\n };\n ApiResponse.prototype.multipart = function () {\n if (!this._isMultipart())\n throw new Error('Response is not multipart');\n if (null === this._multipartTransactions) {\n // Step 1. Split multipart response\n if (!this._text)\n throw new Error('No response body');\n var boundary = this._response.headers.get('Content-Type').match(/boundary=([^;]+)/i)[1];\n if (!boundary)\n throw new Error('Cannot find boundary');\n var parts = this._text.toString().split(ApiResponse.boundarySeparator + boundary);\n if (parts[0].trim() === '')\n parts.shift();\n if (parts[parts.length - 1].trim() == ApiResponse.boundarySeparator)\n parts.pop();\n if (parts.length < 1)\n throw new Error('No parts in body');\n // Step 2. Parse status info\n var statusInfo = ApiResponse.create(parts.shift(), this._response.status, this._response.statusText);\n // Step 3. Parse all other parts\n this._multipartTransactions = parts.map(function (part, i) {\n var status = statusInfo.json().response[i].status;\n return ApiResponse.create(part, status);\n });\n }\n return this._multipartTransactions;\n };\n /**\n * Short-hand method to get only JSON content of responses\n */\n ApiResponse.prototype.multipartJson = function () {\n return this.multipart().map(function (res) {\n return res.json();\n });\n };\n ApiResponse.prototype._isContentType = function (contentType) {\n return this._getContentType().indexOf(contentType) > -1;\n };\n ApiResponse.prototype._getContentType = function () {\n return this._response.headers.get(ApiResponse.contentType) || '';\n };\n ApiResponse.prototype._isMultipart = function () {\n return this._isContentType(ApiResponse.multipartContentType);\n };\n ApiResponse.prototype._isUrlEncoded = function () {\n return this._isContentType(ApiResponse.urlencodedContentType);\n };\n ApiResponse.prototype._isJson = function () {\n return this._isContentType(ApiResponse.jsonContentType);\n };\n /**\n * Method is used to create Transaction objects from string parts of multipart/mixed response\n * @param text\n * @param status\n * @param statusText\n * @return {ApiResponse}\n */\n ApiResponse.create = function (text, status, statusText) {\n status = status || 200;\n statusText = statusText || 'OK';\n text = text.replace(/\\r/g, '');\n var headers = new sdk.externals._Headers(), headersAndBody = text.split(ApiResponse.bodySeparator), headersText = (headersAndBody.length > 1) ? headersAndBody.shift() : '';\n text = headersAndBody.join(ApiResponse.bodySeparator);\n (headersText || '')\n .split('\\n')\n .forEach(function (header) {\n var split = header.trim().split(ApiResponse.headerSeparator), key = split.shift().trim(), value = split.join(ApiResponse.headerSeparator).trim();\n if (key)\n headers.append(key, value);\n });\n return new ApiResponse(null, http.Client.createResponse(text, {\n headers: headers,\n status: status,\n statusText: statusText\n }), text);\n };\n ApiResponse.contentType = 'Content-Type';\n ApiResponse.jsonContentType = 'application/json';\n ApiResponse.multipartContentType = 'multipart/mixed';\n ApiResponse.urlencodedContentType = 'application/x-www-form-urlencoded';\n ApiResponse.headerSeparator = ':';\n ApiResponse.bodySeparator = '\\n\\n';\n ApiResponse.boundarySeparator = '--';\n return ApiResponse;\n })();\n http.ApiResponse = ApiResponse;\n })(http = sdk.http || (sdk.http = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\n/// \n/// \n/// \n/// \n/// \n/// \nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var http;\n (function (http) {\n var allowedMethods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'];\n var Client = (function (_super) {\n __extends(Client, _super);\n function Client() {\n _super.apply(this, arguments);\n this.events = {\n beforeRequest: 'beforeRequest',\n requestSuccess: 'requestSuccess',\n requestError: 'requestError' // means that request failed completely\n };\n }\n Client.prototype.sendRequest = function (request) {\n var _this = this;\n var res = new http.ApiResponse(request); //FIXME Potential leak\n return new sdk.externals._Promise(function (resolve) {\n //TODO Stop request if listeners return false\n _this.emit(_this.events.beforeRequest, res);\n resolve(_this._loadResponse(request));\n })\n .then(function (response) {\n res['_response'] = Client.cloneResponse(response);\n return response.text();\n })\n .then(function (text) {\n res['_text'] = text;\n if (!res.ok())\n throw Client.makeError(new Error('Response has unsuccessful status'), res);\n _this.emit(_this.events.requestSuccess, res);\n return res;\n })\n .catch(function (e) {\n if (!e.apiResponse) {\n // we don't pass response since most likely it's parsing caused an error\n e = Client.makeError(e, res);\n }\n _this.emit(_this.events.requestError, e);\n throw e;\n });\n };\n Client.prototype._loadResponse = function (request) {\n return sdk.externals._fetch.call(null, request);\n };\n /**\n * Wraps the JS Error object with transaction information\n * @param {Error} e\n * @param {ApiResponse} apiResponse\n * @return {IApiError}\n */\n Client.makeError = function (e, apiResponse) {\n var error = e;\n // Wrap only if regular error\n if (!error.hasOwnProperty('apiResponse') && !error.hasOwnProperty('originalMessage')) {\n error.apiResponse = apiResponse;\n error.originalMessage = error.message;\n error.message = (apiResponse && apiResponse.error(true)) || error.originalMessage;\n }\n return error;\n };\n /**\n * TODO Wait for\n * - https://github.com/github/fetch/issues/185\n * - https://github.com/bitinn/node-fetch/issues/34\n * @param {Response} response\n * @return {Response}\n */\n Client.cloneResponse = function (response) {\n if (sdk.core.utils.isFunction(response.clone))\n return response.clone();\n var body = '';\n if (response.hasOwnProperty('_bodyInit'))\n body = response['_bodyInit'];\n if (response.hasOwnProperty('_bodyText'))\n body = response['_bodyText'];\n if (response.hasOwnProperty('_bodyBlob'))\n body = response['_bodyBlob'].slice();\n if (response.hasOwnProperty('_bodyFormData'))\n body = response['_bodyFormData'];\n if (response.hasOwnProperty('_raw'))\n body = response['_raw'].join('');\n var clone = new sdk.externals._Response(body, response);\n if (response.hasOwnProperty('body'))\n clone['body'] = response['body']; // accessing non-standard properties\n return clone;\n };\n /**\n * Creates a response\n * @param stringBody\n * @param init\n * @return {Response}\n */\n Client.createResponse = function (stringBody, init) {\n init = init || {};\n return new sdk.externals._Response(stringBody, init);\n };\n Client.createRequest = function (input, init) {\n init = init || {};\n var body = init.body;\n // Assign request with empty body, Github's fetch throws errors if it cannot recognize the body type\n var req = new sdk.externals._Request(input, sdk.core.utils.extend({}, init, { body: null }));\n if (!req.url)\n throw new Error('Url is not defined');\n if (!req.method)\n req.method = 'GET';\n if (req.method && allowedMethods.indexOf(req.method) < 0)\n throw new Error('Method has wrong value: ' + req.method);\n if (!req.headers.has('Accept'))\n req.headers.set('Accept', 'application/json');\n // Serialize body\n if (sdk.core.utils.isPlainObject(init.body) || !init.body) {\n if (!req.headers.has('Content-Type'))\n req.headers.set('Content-Type', 'application/json');\n var contentType = req.headers.get('Content-Type');\n if (contentType.indexOf('application/json') > -1) {\n body = JSON.stringify(init.body);\n }\n else if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n body = sdk.core.utils.queryStringify(init.body);\n }\n }\n req.credentials = 'include';\n req.mode = 'cors';\n if (init.query) {\n req.url = req.url + (req.url.indexOf('?') > -1 ? '&' : '?') + sdk.core.utils.queryStringify(init.query);\n }\n // Create another request with encoded body\n req = new sdk.externals._Request(req.url, sdk.core.utils.extend(req, { body: body }));\n // Keep the original body accessible directly (for mocks)\n req.body = init.body;\n return req;\n };\n return Client;\n })(sdk.core.Observable);\n http.Client = Client;\n })(http = sdk.http || (sdk.http = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\n/// \n/// \n/// \n/// \nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var platform;\n (function (platform) {\n var Queue = (function () {\n function Queue(cache, cacheId) {\n this._cache = cache;\n this._cacheId = cacheId;\n this.setPollInterval(250);\n this.setReleaseTimeout(5000); // If queue was not released then force it to do so after some timeout\n }\n Queue.prototype.isPaused = function () {\n var storage = this._cache, cacheId = this._cacheId, time = storage.getItem(cacheId);\n return !!time && Date.now() - parseInt(time) < this._releaseTimeout;\n };\n Queue.prototype.pause = function () {\n this._cache.setItem(this._cacheId, Date.now());\n return this;\n };\n Queue.prototype.resume = function () {\n this._cache.removeItem(this._cacheId);\n return this;\n };\n Queue.prototype.poll = function () {\n var _this = this;\n if (this._promise)\n return this._promise;\n this._promise = new sdk.externals._Promise(function (resolve, reject) {\n sdk.core.utils.poll(function (next) {\n if (_this.isPaused())\n return next();\n _this._promise = null;\n _this.resume(); // this is actually not needed but why not\n resolve(null);\n }, _this._pollInterval);\n });\n return this._promise;\n };\n Queue.prototype.releaseTimeout = function () {\n return this._releaseTimeout;\n };\n Queue.prototype.pollInterval = function () {\n return this._pollInterval;\n };\n Queue.prototype.setReleaseTimeout = function (releaseTimeout) {\n this._releaseTimeout = releaseTimeout;\n return this;\n };\n Queue.prototype.setPollInterval = function (pollInterval) {\n this._pollInterval = pollInterval;\n return this;\n };\n return Queue;\n })();\n platform.Queue = Queue;\n })(platform = sdk.platform || (sdk.platform = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var platform;\n (function (platform) {\n var Platform = (function (_super) {\n __extends(Platform, _super);\n function Platform(client, cache, queue, server, appKey, appSecret) {\n _super.call(this);\n this._refreshDelayMs = 100;\n this._clearCacheOnRefreshError = true;\n this._cacheId = 'platform';\n this.events = {\n accessViolation: 'accessViolation',\n logoutSuccess: 'logoutSuccess',\n logoutError: 'logoutError',\n authorizeSuccess: 'authorizeSuccess',\n authorizeError: 'authorizeError',\n refreshSuccess: 'refreshSuccess',\n refreshError: 'refreshError'\n };\n this._server = server;\n this._appKey = appKey;\n this._appSecret = appSecret;\n this._cache = cache;\n this._client = client;\n this._queue = new platform.Queue(this._cache, this._cacheId + '-refresh');\n this._auth = new platform.Auth(this._cache, this._cacheId);\n }\n Platform.prototype.auth = function () {\n return this._auth;\n };\n Platform.prototype.createUrl = function (path, options) {\n path = path || '';\n options = options || {};\n var builtUrl = '', hasHttp = path.indexOf('http://') != -1 || path.indexOf('https://') != -1;\n if (options.addServer && !hasHttp)\n builtUrl += this._server;\n if (path.indexOf(Platform._urlPrefix) == -1 && !hasHttp)\n builtUrl += Platform._urlPrefix + '/' + Platform._apiVersion;\n builtUrl += path;\n if (options.addMethod || options.addToken)\n builtUrl += (path.indexOf('?') > -1 ? '&' : '?');\n if (options.addMethod)\n builtUrl += '_method=' + options.addMethod;\n if (options.addToken)\n builtUrl += (options.addMethod ? '&' : '') + 'access_token=' + this._auth.accessToken();\n return builtUrl;\n };\n Platform.prototype.authUrl = function (options) {\n options = options || {};\n return this.createUrl(Platform._authorizeEndpoint + '?' + sdk.core.utils.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 Platform.prototype.parseAuthRedirectUrl = function (url) {\n var qs = sdk.core.utils.parseQueryString(url.split('?').reverse()[0]), error = qs.error_description || qs.error;\n if (error) {\n var e = new Error(error);\n e.error = qs.error;\n throw e;\n }\n return qs;\n };\n Platform.prototype.loggedIn = function () {\n return this._ensureAuthentication()\n .then(function () {\n return true;\n })\n .catch(function () {\n return false;\n });\n };\n Platform.prototype.login = function (options) {\n var _this = this;\n options = options || {};\n options.remember = options.remember || false;\n var body = {\n \"access_token_ttl\": Platform._accessTokenTtl,\n \"refresh_token_ttl\": options.remember ? Platform._refreshTokenTtlRemember : Platform._refreshTokenTtl\n };\n if (!options.code) {\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 body.grant_type = 'authorization_code';\n body.code = options.code;\n body.redirect_uri = options.redirectUri;\n }\n if (options.endpointId)\n body.endpoint_id = options.endpointId;\n return this._tokenRequest(Platform._tokenEndpoint, body).then(function (res) {\n _this._auth\n .setData(res.json())\n .setRemember(options.remember);\n _this.emit(_this.events.authorizeSuccess, res);\n return res;\n }).catch(function (e) {\n _this._cache.clean();\n _this.emit(_this.events.authorizeError, e);\n throw e;\n });\n };\n Platform.prototype.refresh = function () {\n var _this = this;\n var refresh = new sdk.externals._Promise(function (resolve, reject) {\n if (_this._queue.isPaused()) {\n return resolve(_this._refreshPolling());\n }\n _this._queue.pause();\n // Make sure all existing AJAX calls had a chance to reach the server\n setTimeout(function () {\n sdk.core.log.debug('Platform.refresh(): Performing token refresh (access token', _this._auth.accessToken(), ', refresh token', _this._auth.refreshToken(), ')');\n // Perform sanity checks\n if (!_this._auth.refreshToken())\n return reject(new Error('Refresh token is missing'));\n if (!_this._auth.refreshTokenValid())\n return reject(new Error('Refresh token has expired'));\n if (!_this._queue.isPaused())\n return reject(new Error('Queue was resumed before refresh call'));\n resolve(_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 }, _this._refreshDelayMs);\n });\n return refresh.then(function (res) {\n // This means refresh has happened elsewhere and we are here because of timeout\n if (res && res.json && res.json()) {\n var json = res.json();\n sdk.core.log.info('Platform.refresh(): Token was refreshed', res);\n if (!json.refresh_token || !json.access_token) {\n throw sdk.http.Client.makeError(new Error('Malformed OAuth response'), res);\n }\n _this._auth.setData(json);\n _this._queue.resume();\n }\n _this.emit(_this.events.refreshSuccess, res);\n return res;\n }).catch(function (e) {\n e = sdk.http.Client.makeError(e);\n if (_this._clearCacheOnRefreshError) {\n _this._cache.clean();\n }\n _this.emit(_this.events.accessViolation, e);\n _this.emit(_this.events.refreshError, e);\n throw e;\n });\n };\n /**\n * @returns {Promise}\n */\n Platform.prototype.logout = function () {\n var _this = this;\n this._queue.pause();\n return this._tokenRequest(Platform._revokeEndpoint, {\n token: this._auth.accessToken()\n }).then(function (res) {\n _this._queue.resume();\n _this._cache.clean();\n _this.emit(_this.events.logoutSuccess, res);\n return res;\n }).catch(function (e) {\n _this._queue.resume();\n _this.emit(_this.events.accessViolation, e);\n _this.emit(_this.events.logoutError, e);\n throw e;\n });\n };\n Platform.prototype.inflateRequest = function (request, options) {\n var _this = this;\n options = options || {};\n if (options.skipAuthCheck)\n return sdk.externals._Promise.resolve(request);\n return this\n ._ensureAuthentication()\n .then(function () {\n request.headers.set('Authorization', _this._authHeader());\n request.url = _this.createUrl(request.url, { addServer: true });\n return request;\n });\n };\n Platform.prototype.sendRequest = function (request, options) {\n var _this = this;\n return this\n .inflateRequest(request, options)\n .then(function (req) {\n return _this._client.sendRequest(req);\n })\n .catch(function (e) {\n // Guard is for errors that come from polling\n if (!e.apiResponse || !e.apiResponse.response() || (e.apiResponse.response().status != 401))\n throw e;\n _this._auth.cancelAccessToken();\n return _this.sendRequest(request, options);\n });\n };\n /**\n * General purpose function to send anything to server\n */\n Platform.prototype.send = function (url, options) {\n try {\n // This has to be done here in order to let NodeJS Fetch to create Request\n url = this.createUrl(url, { addServer: true });\n return this.sendRequest(sdk.http.Client.createRequest(url, options), options);\n }\n catch (e) {\n return sdk.externals._Promise.reject(e);\n }\n };\n Platform.prototype.get = function (url, options) {\n options = options || {};\n options.method = 'GET';\n return this.send(url, options);\n };\n Platform.prototype.post = function (url, options) {\n options = options || {};\n options.method = 'POST';\n return this.send(url, options);\n };\n Platform.prototype.put = function (url, options) {\n options = options || {};\n options.method = 'PUT';\n return this.send(url, options);\n };\n Platform.prototype['delete'] = function (url, options) {\n options = options || {};\n options.method = 'DELETE';\n return this.send(url, options);\n };\n Platform.prototype._tokenRequest = function (path, body) {\n return this.send(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 Platform.prototype._ensureAuthentication = function () {\n if (this._isAccessTokenValid())\n return sdk.externals._Promise.resolve(null);\n return this.refresh();\n };\n Platform.prototype._isAccessTokenValid = function () {\n return (this._auth.accessTokenValid() && !this._queue.isPaused());\n };\n Platform.prototype._refreshPolling = function () {\n var _this = this;\n sdk.core.log.warn('Platform.refresh(): Refresh is already in progress, polling started');\n return this._queue.poll().then(function () {\n if (!_this._isAccessTokenValid()) {\n throw new Error('Automatic authentification timeout');\n }\n return null;\n });\n };\n Platform.prototype._apiKey = function () {\n var apiKey = this._appKey + ':' + this._appSecret;\n return (typeof btoa == 'function') ? btoa(apiKey) : new Buffer(apiKey).toString('base64');\n };\n Platform.prototype._authHeader = function () {\n var token = this._auth.accessToken();\n return this._auth.tokenType() + (token ? ' ' + token : '');\n };\n Platform._urlPrefix = '/restapi';\n Platform._apiVersion = 'v1.0';\n Platform._accessTokenTtl = null; // Platform server by default sets it to 60 * 60 = 1 hour\n Platform._refreshTokenTtl = 10 * 60 * 60; // 10 hours\n Platform._refreshTokenTtlRemember = 7 * 24 * 60 * 60; // 1 week\n Platform._tokenEndpoint = '/restapi/oauth/token';\n Platform._revokeEndpoint = '/restapi/oauth/revoke';\n Platform._authorizeEndpoint = '/restapi/oauth/authorize';\n return Platform;\n })(sdk.core.Observable);\n platform.Platform = Platform;\n })(platform = sdk.platform || (sdk.platform = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\n/// \n/// \n/// \n/// \n/// \n/// \nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var subscription;\n (function (subscription_1) {\n var Subscription = (function (_super) {\n __extends(Subscription, _super);\n function Subscription(pubnubFactory, platform) {\n _super.call(this);\n this._renewHandicapMs = 2 * 60 * 1000;\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._eventFilters = [];\n this._timeout = null;\n this._subscription = null;\n }\n Subscription.prototype.alive = function () {\n return this._subscription &&\n this._subscription.id &&\n this._subscription.deliveryMode &&\n this._subscription.deliveryMode.subscriberKey &&\n this._subscription.deliveryMode.address;\n };\n Subscription.prototype.setSubscription = function (subscription) {\n this._clearTimeout();\n this._subscription = subscription;\n if (!this._pubnub)\n this._subscribeAtPubnub();\n this._setTimeout();\n return this;\n };\n Subscription.prototype.subscription = function () {\n return this._subscription;\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 Subscription.prototype.register = function (options) {\n if (this.alive()) {\n return this.renew(options);\n }\n else {\n return this.subscribe(options);\n }\n };\n Subscription.prototype.addEvents = function (events) {\n this._eventFilters = this._eventFilters.concat(events);\n return this;\n };\n Subscription.prototype.setEvents = function (events) {\n this._eventFilters = events;\n return this;\n };\n Subscription.prototype.subscribe = function (options) {\n var _this = this;\n options = options || {};\n if (options.events)\n this.setEvents(options.events);\n this._clearTimeout();\n return new sdk.externals._Promise(function (resolve, reject) {\n if (!_this._eventFilters || !_this._eventFilters.length)\n throw new Error('Events are undefined');\n resolve(_this._platform.post('/restapi/v1.0/subscription', {\n body: {\n eventFilters: _this._getFullEventFilters(),\n deliveryMode: {\n transportType: 'PubNub'\n }\n }\n }));\n }).then(function (ajax) {\n _this.setSubscription(ajax.json())\n .emit(_this.events.subscribeSuccess, ajax);\n return ajax;\n }).catch(function (e) {\n e = sdk.http.Client.makeError(e);\n _this.reset()\n .emit(_this.events.subscribeError, e);\n throw e;\n });\n };\n Subscription.prototype.renew = function (options) {\n var _this = this;\n options = options || {};\n if (options.events)\n this.setEvents(options.events);\n this._clearTimeout();\n return new sdk.externals._Promise(function (resolve, reject) {\n if (!_this.alive())\n throw new Error('Subscription is not alive');\n if (!_this._eventFilters || !_this._eventFilters.length)\n throw new Error('Events are undefined');\n return _this._platform.put('/restapi/v1.0/subscription/' + _this._subscription.id, {\n body: {\n eventFilters: _this._getFullEventFilters()\n }\n });\n })\n .then(function (ajax) {\n _this.setSubscription(ajax.json())\n .emit(_this.events.renewSuccess, ajax.json());\n return ajax;\n })\n .catch(function (e) {\n e = sdk.http.Client.makeError(e);\n _this.reset()\n .emit(_this.events.renewError, e);\n throw e;\n });\n };\n Subscription.prototype.remove = function () {\n var _this = this;\n return new sdk.externals._Promise(function (resolve, reject) {\n if (!_this._subscription || !_this._subscription.id)\n throw new Error('Subscription ID is required');\n resolve(_this._platform.delete('/restapi/v1.0/subscription/' + _this._subscription.id));\n }).then(function (ajax) {\n _this.reset()\n .emit(_this.events.removeSuccess, ajax);\n return ajax;\n }).catch(function (e) {\n e = sdk.http.Client.makeError(e);\n _this.emit(_this.events.removeError, e);\n throw e;\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 Subscription.prototype.reset = function () {\n this._clearTimeout();\n if (this.alive() && this._pubnub)\n this._pubnub.unsubscribe({ channel: this._subscription.deliveryMode.address });\n this._subscription = null;\n return this;\n };\n Subscription.prototype.destroy = function () {\n this.reset();\n sdk.core.log.info('RC.subscription.Subscription: Destroyed');\n return _super.prototype.destroy.call(this);\n };\n Subscription.prototype._getFullEventFilters = function () {\n var _this = this;\n return this._eventFilters.map(function (event) {\n return _this._platform.createUrl(event);\n });\n };\n Subscription.prototype._setTimeout = function () {\n var _this = this;\n this._clearTimeout();\n if (!this.alive())\n throw new Error('Subscription is not alive');\n var timeToExpiration = (this._subscription.expiresIn * 1000) - this._renewHandicapMs;\n this._timeout = setTimeout(function () {\n _this.renew({});\n }, timeToExpiration);\n return this;\n };\n Subscription.prototype._clearTimeout = function () {\n clearTimeout(this._timeout);\n return this;\n };\n Subscription.prototype._decrypt = function (message) {\n if (!this.alive())\n throw new Error('Subscription is not alive');\n if (this._subscription.deliveryMode.encryptionKey) {\n var PUBNUB = this._pubnubFactory.getPubnub();\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 return message;\n };\n Subscription.prototype._notify = function (message) {\n this.emit(this.events.notification, this._decrypt(message));\n return this;\n };\n Subscription.prototype._subscribeAtPubnub = function () {\n var _this = this;\n if (!this.alive())\n throw new Error('Subscription is not alive');\n var PUBNUB = this._pubnubFactory.getPubnub();\n this._pubnub = PUBNUB.init({\n ssl: true,\n subscribe_key: this._subscription.deliveryMode.subscriberKey\n });\n this._pubnub.ready();\n this._pubnub.subscribe({\n channel: this._subscription.deliveryMode.address,\n message: function (message, env, channel) {\n sdk.core.log.info('RC.core.Subscription: Incoming message', message);\n _this._notify(message);\n },\n connect: function () {\n sdk.core.log.info('RC.core.Subscription: PUBNUB connected');\n }\n });\n return this;\n };\n return Subscription;\n })(sdk.core.Observable);\n subscription_1.Subscription = Subscription;\n })(subscription = sdk.subscription || (sdk.subscription = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\n/// \n/// \n/// \nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var pubnub;\n (function (pubnub) {\n var PubnubMock = (function (_super) {\n __extends(PubnubMock, _super);\n function PubnubMock(options) {\n _super.call(this);\n this.options = options;\n this.crypto_obj = sdk.externals._PUBNUB.crypto_obj;\n }\n PubnubMock.prototype.ready = function () { };\n PubnubMock.prototype.subscribe = function (options) {\n this.on('message-' + options.channel, options.message);\n };\n PubnubMock.prototype.unsubscribe = function (options) {\n this.off('message-' + options.channel);\n };\n PubnubMock.prototype.receiveMessage = function (msg, channel) {\n this.emit('message-' + channel, msg, 'env', channel);\n };\n return PubnubMock;\n })(sdk.core.Observable);\n pubnub.PubnubMock = PubnubMock;\n var PubnubMockFactory = (function () {\n function PubnubMockFactory() {\n this.crypto_obj = sdk.externals._PUBNUB.crypto_obj;\n }\n PubnubMockFactory.prototype.init = function (options) {\n return new PubnubMock(options);\n };\n return PubnubMockFactory;\n })();\n pubnub.PubnubMockFactory = PubnubMockFactory;\n })(pubnub = sdk.pubnub || (sdk.pubnub = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\n/// \n/// \nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var pubnub;\n (function (pubnub) {\n var PubnubFactory = (function () {\n function PubnubFactory(flag) {\n this._useMock = false;\n this._useMock = !!flag;\n this._mock = new pubnub.PubnubMockFactory();\n }\n PubnubFactory.prototype.getPubnub = function () {\n return this._useMock ? this._mock : sdk.externals._PUBNUB;\n };\n return PubnubFactory;\n })();\n pubnub.PubnubFactory = PubnubFactory;\n })(pubnub = sdk.pubnub || (sdk.pubnub = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var SDK = (function () {\n function SDK(options) {\n options = options || {};\n sdk.externals.get();\n this._mockRegistry = new sdk.mocks.Registry();\n this._cache = new sdk.core.Cache(typeof localStorage !== 'undefined' ? localStorage : {}, options.cachePrefix);\n this._queue = new sdk.platform.Queue(this._cache, 'platform-refresh');\n this._client = options.useHttpMock ? new sdk.http.ClientMock(this._mockRegistry) : new sdk.http.Client();\n this._platform = new sdk.platform.Platform(this._client, this._cache, this._queue, options.server, options.appKey, options.appSecret);\n this._pubnubFactory = new sdk.pubnub.PubnubFactory(options.usePubnubMock);\n //TODO Link Platform events with Subscriptions and the rest\n }\n SDK.prototype.platform = function () {\n return this._platform;\n };\n SDK.prototype.cache = function () {\n return this._cache;\n };\n SDK.prototype.createSubscription = function () {\n return new sdk.subscription.Subscription(this._pubnubFactory, this._platform);\n };\n SDK.prototype.createPageVisibility = function () {\n return new sdk.core.PageVisibility();\n };\n SDK.prototype.createObservable = function () {\n return new sdk.core.Observable();\n };\n SDK.prototype.log = function () {\n return sdk.core.log;\n };\n SDK.prototype.utils = function () {\n return sdk.core.utils;\n };\n SDK.prototype.mockRegistry = function () { return this._mockRegistry; };\n SDK.version = '2.0.0';\n SDK.server = {\n sandbox: 'https://platform.devtest.ringcentral.com',\n production: 'https://platform.ringcentral.com'\n };\n return SDK;\n })();\n sdk.SDK = SDK;\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\nvar e = RingCentral.sdk.externals.get();\nif (typeof define === 'function' && define.amd) {\n define(['pubnub'], function (PUBNUB) {\n e._PUBNUB = PUBNUB;\n return RingCentral.sdk;\n });\n}\nelse if (typeof module === 'object' && module.exports) {\n e._PUBNUB = require('pubnub');\n e._Promise = typeof (Promise) !== 'undefined' ? Promise : require('es6-promise').Promise;\n e._fetch = require('node-fetch');\n e._Request = e._fetch['Request'];\n e._Response = e._fetch['Response'];\n e._Headers = e._fetch['Headers'];\n module.exports = RingCentral.sdk;\n}\nelse {\n}\n/// \n/// \n/// \n/// \n/// \n/// \nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var http;\n (function (http) {\n var ClientMock = (function (_super) {\n __extends(ClientMock, _super);\n function ClientMock(registry) {\n _super.call(this);\n this._registry = registry;\n }\n ClientMock.prototype._loadResponse = function (request) {\n var _this = this;\n return new sdk.externals._Promise(function (resolve) {\n sdk.core.log.debug('API REQUEST', request.method, request.url);\n var mock = _this._registry.find(request);\n resolve(mock.getResponse(request));\n });\n };\n return ClientMock;\n })(http.Client);\n http.ClientMock = ClientMock;\n })(http = sdk.http || (sdk.http = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \nvar RingCentral;\n(function (RingCentral) {\n var sdk;\n (function (sdk) {\n var platform;\n (function (platform) {\n var Auth = (function () {\n function Auth(cache, cacheId) {\n this._cache = cache;\n this._cacheId = cacheId;\n }\n Auth.prototype.accessToken = function () {\n return this.data().access_token;\n };\n Auth.prototype.refreshToken = function () {\n return this.data().refresh_token;\n };\n Auth.prototype.tokenType = function () {\n return this.data().token_type;\n };\n Auth.prototype.data = function () {\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 Auth.prototype.setData = function (authData) {\n var oldAuthData = this.data();\n authData = sdk.core.utils.extend({}, oldAuthData, authData);\n authData.expire_time = Date.now() + (authData.expires_in * 1000);\n authData.refresh_token_expire_time = Date.now() + (authData.refresh_token_expires_in * 1000);\n sdk.core.log.info('Auth.setData(): Tokens were updated, new:', authData, ', old:', oldAuthData);\n this._cache.setItem(this._cacheId, authData);\n return this;\n };\n /**\n * Check if there is a valid (not expired) access token\n */\n Auth.prototype.accessTokenValid = function () {\n var authData = this.data();\n return (authData.token_type === Auth.forcedTokenType || (authData.expire_time - Auth.refreshHandicapMs > Date.now()));\n };\n /**\n * Check if there is a valid (not expired) access token\n */\n Auth.prototype.refreshTokenValid = function () {\n return (this.data().refresh_token_expire_time > Date.now());\n };\n Auth.prototype.cancelAccessToken = function () {\n return this.setData({\n access_token: '',\n expires_in: 0\n });\n };\n /**\n * This method sets a special authentication mode used in Service Web\n * @return {Platform}\n */\n Auth.prototype.forceAuthentication = function () {\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 return this;\n };\n Auth.prototype.setRemember = function (remember) {\n return this.setData({ remember: remember });\n };\n Auth.prototype.remember = function () {\n return !!this.data().remember;\n };\n Auth.refreshHandicapMs = 60 * 1000; // 1 minute\n Auth.forcedTokenType = 'forced';\n return Auth;\n })();\n platform.Auth = Auth;\n })(platform = sdk.platform || (sdk.platform = {}));\n })(sdk = RingCentral.sdk || (RingCentral.sdk = {}));\n})(RingCentral || (RingCentral = {}));\n\n//# sourceMappingURL=ringcentral.js.map","module RingCentral.sdk.core.utils {\n\n var hasOwn = Object.prototype.hasOwnProperty,\n toString = Object.prototype.toString,\n rdigit = /\\d/,\n class2type = {};\n\n // Populate the class2type map\n 'Boolean Number String Function Array Date RegExp Object'.split(' ').forEach((name) => {\n class2type[\"[object \" + name + \"]\"] = name.toLowerCase();\n });\n\n /**\n * Ported from jQuery.fn.extend\n * Optional first parameter makes deep copy\n */\n export function extend(targetObject:any, sourceObject:any, ...args) {\n\n var options, name, src, copy, copyIsArray, clone,\n target = arguments[0] || {},\n i = 1,\n length = arguments.length,\n deep = false;\n\n // Handle a deep copy situation\n if (typeof target === \"boolean\") {\n deep = target;\n\n // skip the boolean and the target\n target = arguments[i] || {};\n i++;\n }\n\n // Handle case when target is a string or something (possible in deep copy)\n if (typeof target !== \"object\" && !isFunction(target)) {\n target = {};\n }\n\n for (; i < length; i++) {\n\n // Only deal with non-null/undefined values\n if ((options = arguments[i]) !== null) {\n\n // Extend the base object\n for (name in options) {\n\n src = target[name];\n copy = options[name];\n\n // Prevent never-ending loop\n if (target === copy) {\n continue;\n }\n\n // Recurse if we're merging plain objects or arrays\n if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {\n\n if (copyIsArray) {\n copyIsArray = false;\n clone = src && isArray(src) ? src : [];\n } else {\n clone = src && isPlainObject(src) ? src : {};\n }\n\n // Never move original objects, clone them\n target[name] = extend(deep, clone, copy);\n\n // Don't bring in undefined values\n } else if (copy !== undefined) {\n\n target[name] = copy;\n\n }\n }\n }\n }\n\n // Return the modified object\n return target;\n\n }\n\n export function forEach(object, cb) {\n\n for (var i in object) {\n\n if (!object.hasOwnProperty(i)) continue;\n\n var res = cb(object[i], i);\n\n if (res === false) break;\n\n }\n\n }\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 export function queryStringify(parameters) {\n\n var array = [];\n\n forEach(parameters, (v, i) => {\n\n if (isArray(v)) {\n v.forEach((vv) => {\n array.push(encodeURIComponent(i) + '=' + encodeURIComponent(vv));\n });\n } else {\n array.push(encodeURIComponent(i) + '=' + 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 */\n export function parseQueryString(queryString:string):any {\n\n var argsParsed = {},\n self = this;\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 && !self.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 * Returns true if the passed value is valid email address.\n * Checks multiple comma separated emails according to RFC 2822 if parameter `multiple` is `true`\n */\n export function isEmail(v:string, multiple:boolean):boolean {\n if (!!multiple) {\n //this Regexp is also suitable for multiple emails (comma separated)\n return /^(?:[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?[ ,;]*)+$/i.test(v);\n } else {\n return /^[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i.test(v);\n }\n\n }\n\n export function isPhoneNumber(v:string):boolean {\n return (/\\+?1[0-9]{3}[0-9a-z]{7}/im.test(v.toString().split(/[^0-9a-z\\+]/im).join('')));\n }\n\n /**\n * @param args\n * @returns {Array}\n */\n export function argumentsToArray(args:any) {\n return Array.prototype.slice.call(args || [], 0);\n }\n\n export function isDate(obj:any):boolean {\n return type(obj) === \"date\";\n }\n\n export function isFunction(obj:any):boolean {\n return type(obj) === \"function\";\n }\n\n export function isArray(obj:any):boolean {\n return Array.isArray ? Array.isArray(obj) : type(obj) === \"array\";\n }\n\n // A crude way of determining if an object is a window\n export function isWindow(obj:any):boolean {\n return obj && typeof obj === \"object\" && \"setInterval\" in obj;\n }\n\n export function isNan(obj:any):boolean {\n return obj === null || !rdigit.test(obj) || isNaN(obj);\n }\n\n export function type(obj:any):string {\n return obj === null\n ? String(obj)\n : class2type[toString.call(obj)] || \"object\";\n }\n\n export function isPlainObject(obj:any):boolean {\n\n // Must be an Object.\n // Because of IE, we also have to check the presence of the constructor property.\n // Make sure that DOM nodes and window objects don't pass through, as well\n if (!obj || type(obj) !== \"object\" || obj.nodeType || isWindow(obj)) {\n return false;\n }\n\n // Not own constructor property must be Object\n if (obj.constructor && !hasOwn.call(obj, \"constructor\") && !hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\")) {\n return false;\n }\n\n // Own properties are enumerated firstly, so to speed up,\n // if last one is own, then all properties are own.\n\n var key;\n for (key in obj) {}\n\n return key === undefined || hasOwn.call(obj, key);\n\n }\n\n export function getProperty(obj:any, property:string):any {\n\n return property\n .split(/[.[\\]]/)\n .reduce((res, part) => {\n if (!res) return undefined;\n return part ? res[part] : res;\n }, obj);\n\n }\n\n export function poll(fn, interval?:number, timeout?:any):any { //NodeJS.Timer|number\n\n stopPolling(timeout);\n\n interval = interval || 1000;\n\n var next = (delay?:number):any => {\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\n export function stopPolling(timeout) {\n if (timeout) clearTimeout(timeout);\n }\n\n export function parseString(s:any):string {\n return s ? s.toString() : '';\n }\n\n export function parseNumber(n:any):number {\n if (!n) return 0;\n n = parseFloat(n);\n return isNan(n) ? 0 : n;\n }\n\n export function isNodeJS():boolean {\n return (typeof process !== 'undefined');\n }\n\n export function isBrowser():boolean {\n return (typeof window !== 'undefined');\n }\n\n}","/// \n/// \n\nmodule RingCentral.sdk.core {\n\n /**\n * @see https://github.com/Microsoft/TypeScript/issues/275\n */\n export class Observable> {\n\n private _listeners:any;\n\n constructor() {\n if (!(this instanceof Observable)) throw new Error('Observable(): New operator was omitted');\n this.off();\n }\n\n hasListeners(event) {\n return (event in this._listeners);\n }\n\n on(events:any, callback:(...args)=>any):T {\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:string) => {\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:string, ...args):any {\n\n var result = null;\n\n if (!this.hasListeners(event)) return null;\n\n this._listeners[event].some((callback:()=>any) => {\n\n result = callback.apply(this, args);\n return (result === false);\n\n });\n\n return result;\n\n }\n\n off(event?:string, callback?):T {\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 destroy():T {\n this.off();\n log.debug('Observable.destroy(): Listeners were destroyed');\n return this;\n }\n\n }\n\n}\n\n\n","/// \n\nmodule RingCentral.sdk.core {\n\n export class PageVisibility extends Observable {\n\n public events = {\n change: 'change'\n };\n\n protected _visible:boolean;\n\n constructor() {\n\n super();\n\n var hidden = \"hidden\",\n onchange = (evt) => {\n\n evt = evt || window.event;\n\n var v = 'visible',\n h = 'hidden',\n evtMap = {\n focus: v, focusin: v, pageshow: v, blur: h, focusout: h, pagehide: h\n };\n\n this._visible = (evt.type in evtMap) ? evtMap[evt.type] == v : !document[hidden];\n\n this.emit(this.events.change, this._visible);\n\n };\n\n this._visible = true;\n\n if (typeof document == 'undefined' || typeof window == 'undefined') return;\n\n // Standards:\n\n if (hidden in document)\n document.addEventListener(\"visibilitychange\", onchange);\n else if ((hidden = \"mozHidden\") in document)\n document.addEventListener(\"mozvisibilitychange\", onchange);\n else if ((hidden = \"webkitHidden\") in document)\n document.addEventListener(\"webkitvisibilitychange\", onchange);\n else if ((hidden = \"msHidden\") in document)\n document.addEventListener(\"msvisibilitychange\", onchange);\n // IE 9 and lower:\n else if ('onfocusin' in document)\n (document).onfocusin = (document).onfocusout = onchange;\n // All others:\n else\n window.onpageshow = window.onpagehide = window.onfocus = window.onblur = onchange;\n\n }\n\n visible() {\n return this._visible;\n }\n\n }\n\n}","/// \n/// \n\nmodule RingCentral.sdk.mocks {\n\n export class Mock {\n\n protected _method:string;\n protected _path:string;\n protected _delay:number;\n protected _json:any;\n protected _status:number;\n protected _statusText:string;\n\n constructor(method:string, path:string, json?:any, status?:number, statusText?:string, delay?:number) {\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 getResponse(request:Request):Response|Promise {\n\n return new externals._Promise((resolve, reject) => {\n\n setTimeout(() => {\n\n resolve(this.createResponse(this._json));\n\n }, this._delay);\n\n });\n\n }\n\n createResponse(json?:any, init?:ResponseInit|any) {\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 = http.Client.createResponse(str, init);\n\n res.headers.set(http.ApiResponse.contentType, http.ApiResponse.jsonContentType);\n\n return res;\n\n }\n\n }\n\n}","/// \n\nmodule RingCentral.sdk.mocks {\n\n export class Registry {\n\n protected _mocks:Mock[];\n\n constructor() {\n this._mocks = [];\n }\n\n add(mock:Mock) {\n this._mocks.push(mock);\n return this;\n }\n\n clear() {\n this._mocks = [];\n return this;\n }\n\n find(request:Request):Mock {\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?:number, statusText?:string) {\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?:number) {\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?:string, detailed?:boolean) {\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?:boolean) {\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\nmodule RingCentral.sdk.externals {\n\n export var _Promise:typeof Promise;\n export var _fetch:Fetch;\n export var _Response:typeof Response;\n export var _Request:typeof Request;\n export var _Headers:typeof Headers;\n export var _PUBNUB:PUBNUB;\n\n export function get() {\n\n var root = Function('return this')();\n\n if (!_PUBNUB) _PUBNUB = root.PUBNUB;\n if (!_Promise) _Promise = root.Promise;\n if (!_fetch) _fetch = root.fetch;\n if (!_Headers) _Headers = root.Headers;\n if (!_Request) _Request = root.Request;\n if (!_Response) _Response = root.Response;\n\n return externals;\n\n }\n\n}\n\n","/// \n/// \n/// \n\nmodule RingCentral.sdk.http {\n\n /**\n * @TODO Bring back tests\n */\n export 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 protected _json:any;\n protected _text:string;\n protected _request:Request;\n protected _response:Response;\n protected _multipartTransactions:ApiResponse[];\n\n constructor(request?:Request, response?:Response, responseText?:string) {\n\n this._text = responseText;\n this._request = request;\n this._response = response;\n this._json = null;\n this._multipartTransactions = null;\n\n }\n\n response() {\n return this._response;\n }\n\n request() {\n return this._request;\n }\n\n ok() {\n return this._response && this._response.ok;\n }\n\n text() {\n return this._text;\n }\n\n json() {\n\n if (!this._isJson()) throw new Error('Response is not JSON');\n\n if (!this._json) {\n this._json = this._text ? JSON.parse(this._text) : null;\n }\n\n return this._json;\n\n }\n\n error(skipOKCheck?:boolean) {\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 var json = this.json();\n\n if (json.message) message = json.message;\n if (json.error_description) message = json.error_description;\n if (json.description) message = json.description;\n\n } catch (ex) {}\n\n return message;\n\n }\n\n multipart():ApiResponse[] {\n\n if (!this._isMultipart()) throw new Error('Response is not multipart');\n\n if (null === this._multipartTransactions) {\n\n // Step 1. Split multipart response\n\n if (!this._text) throw new Error('No response body');\n\n var boundary = this._response.headers.get('Content-Type').match(/boundary=([^;]+)/i)[1];\n\n if (!boundary) throw new Error('Cannot find boundary');\n\n var parts = this._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);\n\n // Step 3. Parse all other parts\n\n this._multipartTransactions = parts.map((part:string, i) => { //FIXME It will not work since parts contain both headers and body\n\n var status = statusInfo.json().response[i].status;\n\n return ApiResponse.create(part, status);\n\n });\n\n }\n\n return this._multipartTransactions;\n\n }\n\n /**\n * Short-hand method to get only JSON content of responses\n */\n multipartJson():any[] {\n\n return this.multipart().map((res)=> {\n return res.json();\n });\n\n }\n\n protected _isContentType(contentType:string):boolean {\n return this._getContentType().indexOf(contentType) > -1;\n }\n\n protected _getContentType():string {\n return this._response.headers.get(ApiResponse.contentType) || '';\n }\n\n protected _isMultipart():boolean {\n return this._isContentType(ApiResponse.multipartContentType);\n }\n\n protected _isUrlEncoded():boolean {\n return this._isContentType(ApiResponse.urlencodedContentType);\n }\n\n protected _isJson():boolean {\n return this._isContentType(ApiResponse.jsonContentType);\n }\n\n /**\n * Method is used to create Transaction objects from string parts of multipart/mixed response\n * @param text\n * @param status\n * @param statusText\n * @return {ApiResponse}\n */\n static create(text?:string, status?:number, statusText?:string):ApiResponse {\n\n status = status || 200;\n statusText = statusText || 'OK';\n\n text = text.replace(/\\r/g, '');\n\n var headers = new externals._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, Client.createResponse(text, {\n headers: headers,\n status: status,\n statusText: statusText\n }), text);\n\n }\n\n }\n\n}","/// \n/// \n/// \n/// \n/// \n/// \n\nmodule RingCentral.sdk.http {\n\n var allowedMethods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'];\n\n export class Client extends core.Observable {\n\n public events = {\n beforeRequest: 'beforeRequest', // parameters: ajax\n requestSuccess: 'requestSuccess', // means that response was successfully fetched from server\n requestError: 'requestError' // means that request failed completely\n };\n\n sendRequest(request:Request):Promise {\n\n var res = new ApiResponse(request); //FIXME Potential leak\n\n return new externals._Promise((resolve) => {\n\n //TODO Stop request if listeners return false\n this.emit(this.events.beforeRequest, res);\n\n resolve(this._loadResponse(request));\n\n })\n .then((response:Response) => {\n\n res['_response'] = Client.cloneResponse(response);\n\n return response.text();\n\n })\n .then((text:string) => {\n\n res['_text'] = text;\n\n if (!res.ok()) throw Client.makeError(new Error('Response has unsuccessful status'), res);\n\n this.emit(this.events.requestSuccess, res);\n\n return res;\n\n })\n .catch((e:IApiError):any=> {\n\n if (!e.apiResponse) {\n // we don't pass response since most likely it's parsing caused an error\n e = Client.makeError(e, res);\n }\n\n this.emit(this.events.requestError, e);\n\n throw e;\n\n });\n\n }\n\n protected _loadResponse(request:Request):Promise {\n return externals._fetch.call(null, request);\n }\n\n /**\n * Wraps the JS Error object with transaction information\n * @param {Error} e\n * @param {ApiResponse} apiResponse\n * @return {IApiError}\n */\n static makeError(e:Error, apiResponse?:ApiResponse) {\n\n var error = e;\n\n // Wrap only if regular error\n if (!error.hasOwnProperty('apiResponse') && !error.hasOwnProperty('originalMessage')) {\n\n error.apiResponse = apiResponse;\n error.originalMessage = error.message;\n error.message = (apiResponse && apiResponse.error(true)) || error.originalMessage;\n\n }\n\n return error;\n\n }\n\n /**\n * TODO Wait for\n * - https://github.com/github/fetch/issues/185\n * - https://github.com/bitinn/node-fetch/issues/34\n * @param {Response} response\n * @return {Response}\n */\n static cloneResponse(response:Response):Response {\n\n if (core.utils.isFunction(response.clone)) return response.clone();\n\n var body = '';\n\n if (response.hasOwnProperty('_bodyInit')) body = response['_bodyInit'];\n if (response.hasOwnProperty('_bodyText')) body = response['_bodyText'];\n if (response.hasOwnProperty('_bodyBlob')) body = response['_bodyBlob'].slice();\n if (response.hasOwnProperty('_bodyFormData')) body = response['_bodyFormData'];\n\n if (response.hasOwnProperty('_raw')) body = response['_raw'].join('');\n\n var clone = new externals._Response(body, response);\n\n if (response.hasOwnProperty('body')) clone['body'] = response['body']; // accessing non-standard properties\n\n return clone;\n\n }\n\n /**\n * Creates a response\n * @param stringBody\n * @param init\n * @return {Response}\n */\n static createResponse(stringBody?:string, init?:ResponseInit):Response {\n\n init = init || {};\n\n return new externals._Response(stringBody, init);\n\n }\n\n static createRequest(input:string|Request, init?:IClientRequestInit) {\n\n init = init || {};\n\n var body = init.body;\n\n // Assign request with empty body, Github's fetch throws errors if it cannot recognize the body type\n var req = new externals._Request(input, core.utils.extend({}, init, {body: null}));\n\n if (!req.url) throw new Error('Url is not defined');\n if (!req.method) req.method = 'GET';\n if (req.method && allowedMethods.indexOf(req.method) < 0) throw new Error('Method has wrong value: ' + req.method);\n\n if (!req.headers.has('Accept')) req.headers.set('Accept', 'application/json');\n\n // Serialize body\n if (core.utils.isPlainObject(init.body) || !init.body) {\n\n if (!req.headers.has('Content-Type')) req.headers.set('Content-Type', 'application/json');\n\n var contentType = req.headers.get('Content-Type');\n\n if (contentType.indexOf('application/json') > -1) {\n\n body = JSON.stringify(init.body);\n\n } else if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n\n body = core.utils.queryStringify(init.body);\n\n }\n\n }\n\n req.credentials = 'include';\n req.mode = 'cors';\n\n if (init.query) {\n req.url = req.url + (req.url.indexOf('?') > -1 ? '&' : '?') + core.utils.queryStringify(init.query);\n }\n\n // Create another request with encoded body\n req = new externals._Request(req.url, core.utils.extend(req, {body: body}));\n\n // Keep the original body accessible directly (for mocks)\n req.body = init.body;\n\n return req;\n\n }\n\n }\n\n export interface IApiError extends Error {\n stack?:string;\n originalMessage:string;\n apiResponse:ApiResponse;\n }\n\n export interface IClientRequestInit extends RequestInit {\n query?: string;\n }\n\n}","/// \n/// \n/// \n/// \n\nmodule RingCentral.sdk.platform {\n\n export class Queue {\n\n protected _cacheId:string;\n protected _pollInterval:number;\n protected _releaseTimeout:number;\n\n protected _cache:core.Cache;\n protected _promise:Promise;\n\n constructor(cache:core.Cache, cacheId:string) {\n\n this._cache = cache;\n this._cacheId = cacheId;\n\n this.setPollInterval(250);\n this.setReleaseTimeout(5000); // If queue was not released then force it to do so after some timeout\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) < this._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 externals._Promise((resolve, reject) => {\n\n core.utils.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 }, this._pollInterval);\n\n });\n\n return this._promise;\n\n }\n\n releaseTimeout() {\n return this._releaseTimeout;\n }\n\n pollInterval() {\n return this._pollInterval;\n }\n\n setReleaseTimeout(releaseTimeout:number) {\n this._releaseTimeout = releaseTimeout;\n return this;\n }\n\n setPollInterval(pollInterval:number) {\n this._pollInterval = pollInterval;\n return this;\n }\n\n }\n\n}","/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n\nmodule RingCentral.sdk.platform {\n\n export class Platform extends core.Observable {\n\n protected static _urlPrefix:string = '/restapi';\n protected static _apiVersion:string = 'v1.0';\n protected static _accessTokenTtl:number = null; // Platform server by default sets it to 60 * 60 = 1 hour\n protected static _refreshTokenTtl:number = 10 * 60 * 60; // 10 hours\n protected static _refreshTokenTtlRemember:number = 7 * 24 * 60 * 60; // 1 week\n protected static _tokenEndpoint:string = '/restapi/oauth/token';\n protected static _revokeEndpoint:string = '/restapi/oauth/revoke';\n protected static _authorizeEndpoint:string = '/restapi/oauth/authorize';\n\n protected _server:string;\n protected _appKey:string;\n protected _appSecret:string;\n\n protected _refreshDelayMs:number = 100;\n protected _clearCacheOnRefreshError:boolean = true;\n protected _cacheId:string = 'platform';\n\n protected _queue:Queue;\n protected _cache:core.Cache;\n protected _client:http.Client;\n protected _auth:Auth;\n\n public events = {\n accessViolation: 'accessViolation',\n logoutSuccess: 'logoutSuccess',\n logoutError: 'logoutError',\n authorizeSuccess: 'authorizeSuccess',\n authorizeError: 'authorizeError',\n refreshSuccess: 'refreshSuccess',\n refreshError: 'refreshError'\n };\n\n constructor(client:http.Client,\n cache:core.Cache,\n queue:Queue,\n server:string,\n appKey:string,\n appSecret:string) {\n\n super();\n\n this._server = server;\n this._appKey = appKey;\n this._appSecret = appSecret;\n\n this._cache = cache;\n this._client = client;\n this._queue = new Queue(this._cache, this._cacheId + '-refresh');\n this._auth = new Auth(this._cache, this._cacheId);\n\n }\n\n auth():Auth {\n return this._auth;\n }\n\n createUrl(path, options?:{addMethod?: string; addToken?: boolean; addServer?: boolean}):string {\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 authUrl(options:{\n redirectUri:string;\n display?:string; // page|popup|touch|mobile, default 'page'\n prompt?:string; // sso|login|consent, default is 'login sso consent'\n state?:string;\n brandId?:string|number;\n }) {\n\n options = options || {};\n\n return this.createUrl(Platform._authorizeEndpoint + '?' + core.utils.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 parseAuthRedirectUrl(url:string) {\n\n var qs = core.utils.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 loggedIn():Promise {\n\n return this._ensureAuthentication()\n .then(()=> {\n return true;\n })\n .catch(()=> {\n return false;\n });\n\n }\n\n login(options?:{\n username?:string;\n password?: string;\n extension?:string;\n endpointId?:string;\n code?:string;\n redirectUri?:string;\n clientId?:string;\n remember?:boolean\n }):Promise {\n\n options = options || {};\n\n options.remember = options.remember || false;\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 return this._tokenRequest(Platform._tokenEndpoint, body).then((res:http.ApiResponse) => {\n\n this._auth\n .setData(res.json())\n .setRemember(options.remember);\n\n this.emit(this.events.authorizeSuccess, res);\n\n return res;\n\n }).catch((e:http.IApiError):any => {\n\n this._cache.clean();\n\n this.emit(this.events.authorizeError, e);\n\n throw e;\n\n });\n\n }\n\n refresh():Promise {\n\n var refresh = >new externals._Promise((resolve, reject) => {\n\n if (this._queue.isPaused()) {\n return resolve(this._refreshPolling());\n }\n\n this._queue.pause();\n\n // Make sure all existing AJAX calls had a chance to reach the server\n setTimeout(() => {\n\n core.log.debug('Platform.refresh(): Performing token refresh (access token', this._auth.accessToken(), ', refresh token', this._auth.refreshToken(), ')');\n\n // Perform sanity checks\n if (!this._auth.refreshToken()) return reject(new Error('Refresh token is missing'));\n if (!this._auth.refreshTokenValid()) return reject(new Error('Refresh token has expired'));\n if (!this._queue.isPaused()) return reject(new Error('Queue was resumed before refresh call'));\n\n resolve(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 }, this._refreshDelayMs);\n\n });\n\n return refresh.then((res:http.ApiResponse) => {\n\n // This means refresh has happened elsewhere and we are here because of timeout\n if (res && res.json && res.json()) {\n\n var json = res.json();\n\n core.log.info('Platform.refresh(): Token was refreshed', res);\n\n if (!json.refresh_token || !json.access_token) {\n throw http.Client.makeError(new Error('Malformed OAuth response'), res);\n }\n\n this._auth.setData(json);\n this._queue.resume();\n\n }\n\n this.emit(this.events.refreshSuccess, res);\n\n return res;\n\n }).catch((e:http.IApiError):any => {\n\n e = http.Client.makeError(e);\n\n if (this._clearCacheOnRefreshError) {\n this._cache.clean();\n }\n\n this.emit(this.events.accessViolation, e);\n this.emit(this.events.refreshError, e);\n\n throw e;\n\n });\n\n }\n\n /**\n * @returns {Promise}\n */\n logout():Promise {\n\n this._queue.pause();\n\n return this._tokenRequest(Platform._revokeEndpoint, {\n token: this._auth.accessToken()\n }).then((res) => {\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:http.IApiError):any => {\n\n this._queue.resume();\n\n this.emit(this.events.accessViolation, e);\n this.emit(this.events.logoutError, e);\n\n throw e;\n\n });\n\n }\n\n inflateRequest(request:Request, options?:IPlatformOptions):Promise {\n\n options = options || {};\n\n if (options.skipAuthCheck) return externals._Promise.resolve(request);\n\n return this\n ._ensureAuthentication()\n .then(() => {\n\n request.headers.set('Authorization', this._authHeader());\n request.url = this.createUrl(request.url, {addServer: true});\n\n return request;\n\n });\n\n }\n\n sendRequest(request:Request, options?:IPlatformOptions):Promise {\n\n return this\n .inflateRequest(request, options)\n .then((req) => {\n return this._client.sendRequest(req);\n })\n .catch((e:http.IApiError) => {\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 this.sendRequest(request, options);\n\n });\n\n }\n\n /**\n * General purpose function to send anything to server\n */\n send(url:string, options?:IPlatformCombinedOptions):Promise {\n\n try {\n\n // This has to be done here in order to let NodeJS Fetch to create Request\n url = this.createUrl(url, {addServer: true});\n\n return this.sendRequest(http.Client.createRequest(url, options), options);\n\n } catch (e) {\n return externals._Promise.reject(e);\n }\n\n }\n\n get(url:string, options?:IPlatformCombinedOptions) {\n options = options || {};\n options.method = 'GET';\n return this.send(url, options);\n }\n\n post(url:string, options:IPlatformCombinedOptions) {\n options = options || {};\n options.method = 'POST';\n return this.send(url, options);\n }\n\n put(url:string, options:IPlatformCombinedOptions) {\n options = options || {};\n options.method = 'PUT';\n return this.send(url, options);\n }\n\n 'delete'(url:string, options?:IPlatformCombinedOptions) {\n options = options || {};\n options.method = 'DELETE';\n return this.send(url, options);\n }\n\n protected _tokenRequest(path:string, body:any):Promise {\n\n return this.send(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 protected _ensureAuthentication() {\n\n if (this._isAccessTokenValid()) return externals._Promise.resolve(null);\n return this.refresh();\n\n }\n\n protected _isAccessTokenValid():boolean {\n\n return (this._auth.accessTokenValid() && !this._queue.isPaused());\n\n }\n\n protected _refreshPolling():Promise {\n\n core.log.warn('Platform.refresh(): Refresh is already in progress, polling started');\n\n return this._queue.poll().then(()=> {\n\n if (!this._isAccessTokenValid()) {\n throw new Error('Automatic authentification timeout');\n }\n\n return null;\n\n });\n\n }\n\n protected _apiKey() {\n var apiKey = this._appKey + ':' + this._appSecret;\n return (typeof btoa == 'function') ? btoa(apiKey) : new Buffer(apiKey).toString('base64');\n }\n\n protected _authHeader() {\n var token = this._auth.accessToken();\n return this._auth.tokenType() + (token ? ' ' + token : '');\n }\n\n }\n\n export interface IAuthError extends Error {\n error?:string;\n }\n\n export interface IPlatformOptions {\n skipAuthCheck?:boolean;\n }\n\n export interface IPlatformCombinedOptions extends IPlatformOptions, http.IClientRequestInit {}\n\n}","/// \n/// \n/// \n/// \n/// \n/// \n\nmodule RingCentral.sdk.subscription {\n\n\n export class Subscription extends core.Observable {\n\n protected _renewHandicapMs = 2 * 60 * 1000;\n\n protected _subscription:ISubscription|any;\n protected _timeout;\n protected _eventFilters:string[];\n protected _pubnub:PUBNUBInstance;\n\n protected _platform:platform.Platform;\n protected _pubnubFactory:pubnub.PubnubFactory;\n\n public 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:pubnub.PubnubFactory, platform:platform.Platform) {\n\n super();\n\n this._pubnubFactory = pubnubFactory;\n this._platform = platform;\n\n this._pubnub = null;\n this._eventFilters = [];\n this._timeout = null;\n this._subscription = null;\n\n }\n\n alive() {\n\n return this._subscription &&\n this._subscription.id &&\n this._subscription.deliveryMode &&\n this._subscription.deliveryMode.subscriberKey &&\n this._subscription.deliveryMode.address;\n\n }\n\n setSubscription(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():ISubscription {\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 register(options?:{events?:string[]}):Promise {\n\n if (this.alive()) {\n return this.renew(options);\n } else {\n return this.subscribe(options);\n }\n\n }\n\n addEvents(events:string[]) {\n this._eventFilters = this._eventFilters.concat(events);\n return this;\n }\n\n setEvents(events:string[]) {\n this._eventFilters = events;\n return this;\n }\n\n subscribe(options?:{events?:string[]}):Promise {\n\n options = options || {};\n\n if (options.events) this.setEvents(options.events);\n\n this._clearTimeout();\n\n return >new externals._Promise((resolve, reject) => {\n\n if (!this._eventFilters || !this._eventFilters.length) throw new Error('Events are undefined');\n\n resolve(this._platform.post('/restapi/v1.0/subscription', {\n body: {\n eventFilters: this._getFullEventFilters(),\n deliveryMode: {\n transportType: 'PubNub'\n }\n }\n }));\n\n }).then((ajax:http.ApiResponse) => {\n\n this.setSubscription(ajax.json())\n .emit(this.events.subscribeSuccess, ajax);\n\n return ajax;\n\n }).catch((e):any => {\n\n e = http.Client.makeError(e);\n\n this.reset()\n .emit(this.events.subscribeError, e);\n\n throw e;\n\n });\n\n }\n\n renew(options?:{events?:string[]}):Promise {\n\n options = options || {};\n\n if (options.events) this.setEvents(options.events);\n\n this._clearTimeout();\n\n return >new externals._Promise((resolve, reject) => {\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n if (!this._eventFilters || !this._eventFilters.length) throw new Error('Events are undefined');\n\n return this._platform.put('/restapi/v1.0/subscription/' + this._subscription.id, {\n body: {\n eventFilters: this._getFullEventFilters()\n }\n });\n\n })\n .then((ajax:http.ApiResponse) => {\n\n this.setSubscription(ajax.json())\n .emit(this.events.renewSuccess, ajax.json());\n\n return ajax;\n\n })\n .catch((e):any => {\n\n e = http.Client.makeError(e);\n\n this.reset()\n .emit(this.events.renewError, e);\n\n throw e;\n\n });\n\n }\n\n remove():Promise {\n\n return >new externals._Promise((resolve, reject) => {\n\n if (!this._subscription || !this._subscription.id) throw new Error('Subscription ID is required');\n\n resolve(this._platform.delete('/restapi/v1.0/subscription/' + this._subscription.id));\n\n }).then((ajax:http.ApiResponse) => {\n\n this.reset()\n .emit(this.events.removeSuccess, ajax);\n\n return ajax;\n\n }).catch((e):any => {\n\n e = http.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 = null;\n return this;\n }\n\n destroy():Subscription {\n\n this.reset();\n\n core.log.info('RC.subscription.Subscription: Destroyed');\n\n return super.destroy();\n\n }\n\n protected _getFullEventFilters() {\n\n return this._eventFilters.map((event) => {\n return this._platform.createUrl(event);\n });\n\n }\n\n protected _setTimeout() {\n\n this._clearTimeout();\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n var timeToExpiration = (this._subscription.expiresIn * 1000) - this._renewHandicapMs;\n\n this._timeout = setTimeout(() => {\n\n this.renew({});\n\n }, timeToExpiration);\n\n return this;\n\n }\n\n protected _clearTimeout() {\n\n clearTimeout(this._timeout);\n\n return this;\n\n }\n\n protected _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.getPubnub();\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 protected _notify(message:any) {\n\n this.emit(this.events.notification, this._decrypt(message));\n\n return this;\n\n }\n\n protected _subscribeAtPubnub():Subscription {\n\n if (!this.alive()) throw new Error('Subscription is not alive');\n\n var PUBNUB = this._pubnubFactory.getPubnub();\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: (message, env, channel) => {\n\n core.log.info('RC.core.Subscription: Incoming message', message);\n this._notify(message);\n\n },\n connect: () => {\n core.log.info('RC.core.Subscription: PUBNUB connected');\n }\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/// \n\nmodule RingCentral.sdk.pubnub {\n\n export class PubnubMock extends core.Observable implements PUBNUBInstance {\n\n private options:PUBNUBInitOptions;\n crypto_obj:PUBNUBCryptoObj;\n\n constructor(options:PUBNUBInitOptions) {\n super();\n this.options = options;\n this.crypto_obj = externals._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 export class PubnubMockFactory implements PUBNUB {\n\n crypto_obj:PUBNUBCryptoObj;\n\n constructor() {\n this.crypto_obj = externals._PUBNUB.crypto_obj;\n }\n\n init(options:PUBNUBInitOptions) {\n return new PubnubMock(options);\n }\n\n }\n\n}","/// \n/// \n\nmodule RingCentral.sdk.pubnub {\n\n export class PubnubFactory {\n\n private _useMock:boolean = false;\n private _mock:PubnubMockFactory;\n\n constructor(flag:boolean) {\n this._useMock = !!flag;\n this._mock = new PubnubMockFactory();\n }\n\n getPubnub():PUBNUB {\n return this._useMock ? this._mock : externals._PUBNUB;\n }\n\n }\n\n}","/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n\nmodule RingCentral.sdk {\n\n export 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 private _platform:platform.Platform;\n private _cache:core.Cache;\n private _queue:platform.Queue;\n private _client:http.Client;\n private _pubnubFactory:pubnub.PubnubFactory;\n private _mockRegistry:mocks.Registry;\n\n constructor(options?:{\n server:string;\n appKey:string;\n appSecret:string;\n appName?:string;\n appVersion?:string;\n cachePrefix?:string;\n useHttpMock?:boolean;\n usePubnubMock?:boolean;\n }) {\n\n options = options || {};\n\n externals.get();\n\n this._mockRegistry = new mocks.Registry();\n\n this._cache = new core.Cache(typeof localStorage !== 'undefined' ? localStorage : {}, options.cachePrefix);\n\n this._queue = new platform.Queue(this._cache, 'platform-refresh');\n\n this._client = options.useHttpMock ? new http.ClientMock(this._mockRegistry) : new http.Client();\n\n this._platform = new platform.Platform(this._client, this._cache, this._queue, options.server, options.appKey, options.appSecret);\n\n this._pubnubFactory = new pubnub.PubnubFactory(options.usePubnubMock);\n\n //TODO Link Platform events with Subscriptions and the rest\n\n }\n\n platform():platform.Platform {\n return this._platform;\n }\n\n cache():core.Cache {\n return this._cache;\n }\n\n createSubscription():subscription.Subscription {\n return new subscription.Subscription(this._pubnubFactory, this._platform);\n }\n\n createPageVisibility() {\n return new core.PageVisibility();\n }\n\n createObservable() {\n return new core.Observable();\n }\n\n log() {\n return core.log;\n }\n\n utils() {\n return core.utils;\n }\n\n mockRegistry() { return this._mockRegistry; }\n\n }\n\n}\n\nvar e = RingCentral.sdk.externals.get();\n\nif (typeof define === 'function' && define.amd) {\n\n define(['pubnub'], function(PUBNUB) {\n e._PUBNUB = PUBNUB;\n return RingCentral.sdk;\n });\n\n} else if (typeof module === 'object' && module.exports) {\n\n e._PUBNUB = require('pubnub');\n e._Promise = typeof (Promise) !== 'undefined' ? Promise : require('es6-promise').Promise;\n e._fetch = require('node-fetch');\n e._Request = e._fetch['Request'];\n e._Response = e._fetch['Response'];\n e._Headers = e._fetch['Headers'];\n\n module.exports = RingCentral.sdk;\n\n} else {\n\n //TODO noConflict\n\n}\n","/// \n/// \n/// \n/// \n/// \n/// \n\nmodule RingCentral.sdk.http {\n\n export class ClientMock extends Client {\n\n private _registry:mocks.Registry;\n\n constructor(registry:mocks.Registry) {\n super();\n this._registry = registry;\n }\n\n protected _loadResponse(request:Request):Promise {\n\n return new externals._Promise((resolve) => {\n\n core.log.debug('API REQUEST', request.method, request.url);\n\n var mock = this._registry.find(request);\n\n resolve(mock.getResponse(request));\n\n });\n\n }\n\n }\n\n}","/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n\nmodule RingCentral.sdk.platform {\n\n export class Auth {\n\n static refreshHandicapMs:number = 60 * 1000; // 1 minute\n static forcedTokenType = 'forced';\n\n protected _cacheId:string;\n protected _cache:core.Cache;\n\n constructor(cache:core.Cache, cacheId:string) {\n\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 data():IAuthData {\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 setData(authData:IAuthData) {\n\n var oldAuthData = this.data();\n\n authData = core.utils.extend({}, oldAuthData, authData);\n\n authData.expire_time = Date.now() + (authData.expires_in * 1000);\n authData.refresh_token_expire_time = Date.now() + (authData.refresh_token_expires_in * 1000);\n\n core.log.info('Auth.setData(): Tokens were updated, new:', authData, ', old:', oldAuthData);\n\n this._cache.setItem(this._cacheId, authData);\n\n return this;\n\n }\n\n /**\n * Check if there is a valid (not expired) access token\n */\n accessTokenValid():boolean {\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 */\n refreshTokenValid():boolean {\n\n return (this.data().refresh_token_expire_time > Date.now());\n\n }\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 {Platform}\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 setRemember(remember?:boolean):Auth {\n\n return this.setData({remember: remember});\n\n }\n\n remember():boolean {\n\n return !!this.data().remember;\n\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}"],"sourceRoot":"/source/"} \ No newline at end of file +{"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":"CAAA,SAAAA,EAAAC,GACA,gBAAAC,UAAA,gBAAAC,QACAA,OAAAD,QAAAD,EAAAG,QAAA,eAAAA,QAAA,cAAAA,QAAA,WACA,kBAAAC,SAAAA,OAAAC,IACAD,QAAA,CAAA,CAAA,UAAAJ,GACA,gBAAAC,SACAA,QAAA,IAAAD,EAAAG,QAAA,eAAAA,QAAA,cAAAA,QAAA,YAEAJ,EAAA,YAAAA,EAAA,gBAAiDA,EAAA,YAAA,IAAAC,EAAAD,EAAAO,QAAAP,EAAAO,QAAAP,EAAAO,WAChDC,KAAA,SAAAC,EAAAC,EAAAC,GACD,MCAgB,UAAUC,GCN1B,QAAAC,GAAAC,GAGA,GAAAC,EAAAD,GACA,MAAAC,GAAAD,GAAAZ,OAGA,IAAAC,GAAAY,EAAAD,IACAZ,WACAc,GAAAF,EACAG,QAAA,EAUA,OANAL,GAAAE,GAAAI,KAAAf,EAAAD,QAAAC,EAAAA,EAAAD,QAAAW,GAGAV,EAAAc,QAAA,EAGAd,EAAAD,QAvBA,GAAAa,KAqCA,OATAF,GAAAM,EAAAP,EAGAC,EAAAO,EAAAL,EAGAF,EAAAQ,EAAA,UAGAR,EAAA,KDgBM,SAASV,EAAQD,EAASW,GAEhCV,EAAOD,QAAUW,EAAoB,IAK/B,SAASV,EAAQD,EAASW,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,qCARhHjC,EAAQsB,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,GFgFduC,EAAc9B,EAAuB6B,GAErCE,EAAiBxC,EEjFM,GAAfyC,EAAS5B,EAAA2B,GFqFjBE,EAAkB1C,EEpFC,GFsFnB2C,EAAmBlC,EAAuBiC,GAE1CE,EAAc5C,EEtFC,GFwFf6C,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,EAAgBxB,KE9IHuE,GAuBbC,EAAUA,MAEVxE,KAAKyE,OAAS,GAAA7B,GAAA,WAAUE,EAAU4B,aAAcF,EAAQG,aAExD3E,KAAK4E,QAAUJ,EAAQK,QAAU,GAAA3B,GAAA,WAEjClD,KAAK8E,UAAY,GAAAhB,GAAA,WAAa9D,KAAK4E,QAAS5E,KAAKyE,OAAQD,EAAQO,OAAQP,EAAQQ,OAAQR,EAAQS,WAEjGjF,KAAKkF,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,MAAOxF,MAAK8E,WAvCCP,EAAGjD,UA6CpBmE,mBAAkB,WACd,MAAO,IAAAnB,GAAA,WAAiBtE,KAAKkF,eAAgBlF,KAAK8E,UAAW9E,KAAKyE,SA9CrDF,EAAGjD,UAoDpBoE,MAAK,WACD,MAAO1F,MAAKyE,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,IFqOrB7E,GAAQ,WErOa6E,EFsOrB5E,EAAOD,QAAUA,EAAQ,YAInB,SAASC,EAAQD,EAASW,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/BrI,EAAOD,QAAQuI,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,KHiIXtI,EAAQsB,YAAa,EACrBtB,EAAQ4G,eAAiBA,EACzB5G,EAAQwH,iBAAmBA,EAC3BxH,EAAQiI,WAAaA,EACrBjI,EAAQmH,QAAUA,EAClBnH,EAAQmI,KAAOA,EACfnI,EAAQuI,YAAcA,EACtBvI,EAAQ4I,SAAWA,EACnB5I,EAAQ8I,UAAYA,EACpB9I,EAAQyI,MAAQA,CAEhB,IAAIO,GAAerI,EGhRG,IHuZhB,SAASV,EAAQD,EAASW,GAEhC,YAIA,SAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAFzFrB,EAAQsB,YAAa,CAIrB,IAAI8H,GAAczI,EI/ZK,GJianB0I,EAAejI,EAAuBgI,GAEtCE,EAAa3I,EIlaK,GJoalB4I,EAAcnI,EAAuBkI,GAErCE,EAAU7I,EIraK,GJuaf8I,EAAWrI,EAAuBoI,GIra3BP,EAAWI,EAAA,YAAcA,EAAA,WAAWJ,SAAYF,OAAOE,OJyalEjJ,GAAQiJ,QAAUA,CIvaX,IAAIS,GAAQH,EAAA,YAAaR,OAAOW,KJyavC1J,GAAQ0J,MAAQA,CIxaT,IAAIC,GAAUD,EAAMC,SAAWZ,OAAOY,OJ0a7C3J,GAAQ2J,QAAUA,CIzaX,IAAIC,GAAWF,EAAME,UAAYb,OAAOa,QJ2a/C5J,GAAQ4J,SAAWA,CI1aZ,IAAIC,GAAUH,EAAMG,SAAWd,OAAOc,OJ6a7C7J,GAAQ6J,QAAUA,CI3aX,IAAInE,GAAS+D,EAAA,YAAUV,OAAOrD,MJ8arC1F,GAAQ0F,OAASA,CI5aV,IAAIV,GAAkC,mBAAX+D,SACwB,mBAAxBA,QAAO/D,aAAgC+D,OAAO/D,eJ6ahFhF,GAAQgF,aAAeA,GAIjB,SAAS/E,EAAQD,GK/bvBC,EAAAD,QAAAO,GLqcM,SAASN,EAAQD,GMrcvBC,EAAAD,QAAAQ,GN2cM,SAASP,EAAQD,GO3cvBC,EAAAD,QAAAS,GPidM,SAASR,EAAQD,GAEvB,YAMA,SAAS8B,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAJhHjC,EAAQsB,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,MQvd5gBiE,EAAK,WAIX,QAJMA,GAIL6D,EAASC,GR+djBjI,EAAgBxB,KQneH2F,GAKb3F,KAAK0J,UAAUD,GACfzJ,KAAK2J,SAAWH,ER0gBpB,MApDA5H,GQ5diB+D,EAAK,OR6dlBvE,IAAK,gBACLiE,MQ5dmB,MR6dnBlD,YAAY,KQ/dCwD,EAAKrE,UAStBoI,UAAS,SAACD,GAEN,MADAzJ,MAAK4J,QAAUH,GAAU9D,EAAMkE,cACxB7J,MAXM2F,EAAKrE,UActBwI,QAAO,SAAC1I,EAAK2I,GAET,MADA/J,MAAK2J,SAAS3J,KAAKgK,WAAW5I,IAAQ6I,KAAKC,UAAUH,GAC9C/J,MAhBM2F,EAAKrE,UAmBtB6I,WAAU,SAAC/I,GAEP,aADOpB,MAAK2J,SAAS3J,KAAKgK,WAAW5I,IAC9BpB,MArBM2F,EAAKrE,UAwBtB8I,QAAO,SAAChJ,GACJ,GAAIiJ,GAAOrK,KAAK2J,SAAS3J,KAAKgK,WAAW5I,GACzC,OAAKiJ,GACEJ,KAAKK,MAAMD,GADA,MA1BL1E,EAAKrE,UA8BtBiJ,MAAK,WAED,IAAK,GAAInJ,KAAOpB,MAAK2J,SAEZ3J,KAAK2J,SAASpI,eAAeH,IAEA,IAA9BA,EAAIoG,QAAQxH,KAAK4J,gBACV5J,MAAK2J,SAASvI,EAK7B,OAAOpB,OA1CM2F,EAAKrE,UA8CtB0I,WAAU,SAAC5I,GACP,MAAOpB,MAAK4J,QAAUxI,GA/CTuE,IRmhBrBjG,GAAQ,WQnhBaiG,ERohBrBhG,EAAOD,QAAUA,EAAQ,YAInB,SAASC,EAAQD,GAEvB,YAIA,SAAS8B,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAFhHjC,EAAQsB,YAAa,CAIrB,IShiBqB4E,GAAU,WAEhB,QAFMA,KTkiBbpE,EAAgBxB,KSliBH4F,GAGb5F,KAAKwK,MTsmBT,MSzmBiB5E,GAAUtE,UAM3BmJ,aAAY,SAACC,GACT,MAAQA,KAAS1K,MAAK2K,YAPT/E,EAAUtE,UAU3BsJ,GAAE,SAACC,EAAQC,GTkiBP,GAAIC,GAAQ/K,IS/hBZ,IADqB,gBAAV6K,KAAoBA,GAAUA,KACpCA,EAAQ,KAAM,IAAIG,OAAM,4BAC7B,IAAwB,kBAAbF,GAAyB,KAAM,IAAIE,OAAM,8BAUpD,OARAH,GAAOnE,QAAQ,SAACgE,GAEPK,EAAKN,aAAaC,KAAQK,EAAKJ,WAAWD,OAE/CK,EAAKJ,WAAWD,GAAO3D,KAAK+D,KAIzB9K,MAxBM4F,EAAUtE,UA4B3B2J,KAAI,SAACP,GTmiBD,IAAK,GAFDQ,GAASlL,KAEJmL,EAAOC,UAAUnJ,OSniBfoJ,EAAIzD,MAAAuD,EAAA,EAAAA,EAAA,EAAA,GAAAG,EAAA,EAAAH,EAAAG,EAAAA,IAAJD,EAAIC,EAAA,GAAAF,UAAAE,EAEf,IAAIC,GAAS,IAEb,OAAKvL,MAAKyK,aAAaC,IAEvB1K,KAAK2K,WAAWD,GAAOc,KAAK,SAACV,GAGzB,MADAS,GAAST,EAASW,MAAKP,EAAOG,GACtBE,KAAW,IAIhBA,GAT+B,MAhCzB3F,EAAUtE,UA6C3BkJ,IAAG,SAACE,EAAOI,GToiBP,GAAIY,GAAS1L,ISliBb,IAAK0K,EAMD,GAAKI,EAIE,CAEH,IAAK9K,KAAKyK,aAAaC,GAAQ,MAAO1K,KAEtCA,MAAK2K,WAAWD,GAAOhE,QAAQ,SAACiF,EAAI3J,GAE5B2J,IAAOb,SAAiBY,GAAKf,WAAWD,GAAO1I,gBARhDhC,MAAK2K,WAAWD,OAN3B1K,MAAK2K,aAsBT,OAAO3K,OAvEM4F,IT4mBrBlG,GAAQ,WS5mBakG,ET6mBrBjG,EAAOD,QAAUA,EAAQ,YAInB,SAASC,EAAQD,EAASW,GAEhC,YAMA,SAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAEzF,QAASS,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAEhH,QAASiK,GAAUC,EAAUC,GAAc,GAA0B,kBAAfA,IAA4C,OAAfA,EAAuB,KAAM,IAAInK,WAAU,iEAAoEmK,GAAeD,GAASvK,UAAYD,OAAO0K,OAAOD,GAAcA,EAAWxK,WAAa0K,aAAe3G,MAAOwG,EAAU1J,YAAY,EAAOE,UAAU,EAAMD,cAAc,KAAe0J,IAAYzK,OAAO4K,eAAiB5K,OAAO4K,eAAeJ,EAAUC,GAAcD,EAASK,UAAYJ,GARjepM,EAAQsB,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,EU/nBoC,GVioBrDoC,EAAapC,EUhoBY,GVkoBzB8L,EAAS9L,EUjoBgB,IVmoBzB0C,EAAkB1C,EUloBC,GVooBnB2C,EAAmBlC,EAAuBiC,GAE1CqJ,EAAe/L,EUroBK,IVuoBpBgM,EAAgBvL,EAAuBsL,GUroBtBvG,EAAM,SAAAyG,GV0oBvB,QU1oBiBzG,KV2oBbrE,EAAgBxB,KU3oBH6F,GV6oBbyG,EAAYb,MAAMzL,KAAMoL,WAExBpL,KU3oBJ6K,QACI0B,cAAe,gBACfC,eAAgB,iBAChBC,aAAc,gBVu0BlB,MAtMAb,GUxoBiB/F,EAAMyG,GAANzG,EAAMvE,UAcjBoL,YAAW,SAACC,GVqpBd,GUnpBIC,EVopBJ,OAAOC,oBAAmBC,MAAM,SAAsBC,GAClD,OAAU,OAAQA,EAAYC,KAAOD,EAAY7E,MAC7C,IAAK,GAQD,MU9pBR0E,GAAc,GAAAP,GAAA,WAAgBM,GVwpBtBI,EAAYC,KAAO,EUnpB3BhN,KAAKiL,KAAKjL,KAAK6K,OAAO0B,cAAeK,GVwpB7BG,EAAY7E,KAAO,EACZ2E,mBAAmBI,MUvpBJjN,KAAKkN,cAAcP,GVypB7C,KAAK,GAGD,GU5pBRC,EAAYO,UAASJ,EAAAK,MAEjBR,EAAYS,iBAAkBT,EAAYU,UAAS,CV2pB3CP,EAAY7E,KAAO,EACnB,OAIJ,MADA6E,GAAY7E,KAAO,EACZ2E,mBAAmBI,MU/pBJL,EAAYW,WAAWC,OViqBjD,KAAK,GUjqBLZ,EAAYa,MAAKV,EAAAK,IVoqBjB,KAAK,IACD,GUlqBHR,EAAYc,KAAI,CVmqBTX,EAAY7E,KAAO,EACnB,OAGJ,KUvqBqB,IAAI8C,OAAM,mCVyqBnC,KAAK,IAID,MU3qBRhL,MAAKiL,KAAKjL,KAAK6K,OAAO2B,eAAgBI,GV2qBvBG,EAAYY,OAAO,SUzqB3Bf,EV2qBH,KAAK,IAQD,KAPAG,GAAYC,KAAO,GACnBD,EAAYa,GAAKb,EAAY,SAAS,GUzqBzCA,EAAAa,GAAEhB,cAAaG,EAAAa,GAAI5N,KAAK6N,UAASd,EAAAa,GAAIhB,IAE1C5M,KAAKiL,KAAKjL,KAAK6K,OAAO4B,aAAYM,EAAAa,IV6qBpBb,EAAYa,EAEtB,KAAK,IACL,IAAK,MACD,MAAOb,GAAYe,SAE5B,KAAM9N,OAAQ,EAAG,OU1tBP6F,EAAMvE,UAoDjB4L,cAAa,SAACP,GVgrBhB,MAAOE,oBAAmBC,MAAM,SAAwBC,GACpD,OAAU,OAAQA,EAAYC,KAAOD,EAAY7E,MAC7C,IAAK,GAED,MADA6E,GAAY7E,KAAO,EACZ2E,mBAAmBI,MUnrBzBpK,EAAAuG,MAAM1I,KAAK,KAAMiM,GVqrBtB,KAAK,GACD,MAAOI,GAAYY,OAAO,SAAUZ,EAAYK,KAEpD,KAAK,GACL,IAAK,MACD,MAAOL,GAAYe,SAE5B,KAAM9N,OUjvBI6F,EAAMvE,UA8DvBuM,UAAS,SAACE,EAAGnB,GAWT,MARKmB,GAAExM,eAAe,gBAAmBwM,EAAExM,eAAe,qBAEtDwM,EAAEnB,YAAcA,EAChBmB,EAAEC,gBAAkBD,EAAEE,QACtBF,EAAEE,QAAWrB,GAAeA,EAAYsB,OAAM,IAAUH,EAAEC,iBAIvDD,GAzEMlI,EAAMvE,UAuFvB6M,cAAa,SAACC,GAMV,GAJAA,EAAOA,MACPA,EAAKC,QAAUD,EAAKC,aAGfD,EAAKE,IAAK,KAAM,IAAItD,OAAM,qBAE/B,IADKoD,EAAKG,SAAQH,EAAKG,OAAS,OAC5BH,EAAKG,QAAU1I,EAAO2I,gBAAgBhH,QAAQ4G,EAAKG,QAAU,EAAG,KAAM,IAAIvD,OAAM,2BAA6BoD,EAAKG,OAiBtH,IAdAH,EAAKK,YAAcL,EAAKK,aAAe,UACvCL,EAAKM,KAAON,EAAKM,MAAQ,OAGrBN,EAAKO,QACLP,EAAKE,IAAMF,EAAKE,KAAOF,EAAKE,IAAI9G,QAAQ,KAAO,GAAK,IAAM,KAAO/E,EAAA6D,eAAe8H,EAAKO,QAGnFxC,EAAAyC,eAAe,SAAUR,EAAKC,WAChCD,EAAKC,QAAgB,OAAIhC,EAAA,WAAYwC,kBAKhB,gBAAdT,GAAKU,OAAsBV,EAAKU,KAAM,CAE7C,GAAIC,GAAwB5C,EAAAyC,eAAevC,EAAA,WAAY2C,aAAcZ,EAAKC,QAErEU,KACDA,EAAwB1C,EAAA,WAAY2C,aACpCZ,EAAKC,QAAQU,GAAyB1C,EAAA,WAAYwC,iBAGtD,IAAII,GAAcb,EAAKC,QAAQU,EAG3BE,GAAYzH,QAAQ6E,EAAA,WAAYwC,kBAAoB,GACpDT,EAAKU,KAAO7E,KAAKC,UAAUkE,EAAKU,MACzBG,EAAYzH,QAAQ6E,EAAA,WAAY6C,wBAA0B,KACjEd,EAAKU,KAAOrM,EAAA6D,eAAe8H,EAAKU,OAMxC,GAAIK,GAAM,GAAAtM,GAAAwG,QAAY+E,EAAKE,IAAKF,EAKhC,OAFAe,GAAIC,aAAehB,EAAKU,KAEjBK,GV8rBXvN,EUx0BiBiE,EAAM,OVy0BnBzE,IAAK,kBACLiE,OUx0BsB,MAAO,OAAQ,MAAO,SAAU,QAAS,UAAW,QVy0B1ElD,YAAY,KU30BC0D,GV+0BlB7C,EAAiB,WAEpBtD,GAAQ,WUj1BamG,EVk1BrBlG,EAAOD,QAAUA,EAAQ,YAInB,SAASC,EAAQD,EAASW,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,EW31B9P,QAASkO,GAAeC,EAAYlB,GAEvCA,EAAOA,KAEP,IAAIb,GAAW,GAAA1K,GAAAyG,SAAagG,EAAYlB,EAYxC,OATImB,GAAMjH,aAENiF,EAASE,MAAQ6B,EACjB/B,EAASiC,QAAU,WACf,MAAOxP,MAAKyN,QAKbF,EAIJ,QAASqB,GAAea,EAAMpB,GAEjC,MADAoB,GAAOA,EAAKC,cACLrO,OAAOoF,KAAK4H,GAASsB,OAAO,SAASC,EAAKxO,GAC7C,MAAIwO,GAAYA,EACZH,GAAQrO,EAAIsO,cAAsBtO,EAC/BwO,GACR,MX6zBPlQ,EAAQsB,YAAa,EACrBtB,EAAQ2P,eAAiBA,EACzB3P,EAAQkP,eAAiBA,CAIzB,IAAI/L,GAAiBxC,EWt2BoC,GXw2BrDoC,EAAapC,EWv2BM,GAAXkP,EAAKrO,EAAAuB,IX+4BX,SAAS9C,EAAQD,EAASW,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,qCANhHjC,EAAQsB,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,EY55BoC,GZ85BrD8L,EAAS9L,EY75BU,IAAXkP,EAAKrO,EAAAiL,GAEIrG,EAAW,WAejB,QAfMA,GAeL6G,EAASY,EAAUsC,GZs7B3BrO,EAAgBxB,KYr8BH8F,GAkBb9F,KAAK8P,SAAWnD,EAGhB3M,KAAKmN,UAAYI,EAEjBvN,KAAKyN,MAAQoC,EACb7P,KAAK+P,MAAQ,KACb/P,KAAKgQ,cZimCT,MA1NApO,GYh6BiBkE,EAAW,OZi6BxB1E,IAAK,eACLiE,MYh6BkB,eZi6BlBlD,YAAY,IAEZf,IAAK,mBACLiE,MYn6BsB,mBZo6BtBlD,YAAY,IAEZf,IAAK,wBACLiE,MYt6B2B,kBZu6B3BlD,YAAY,IAEZf,IAAK,yBACLiE,MYz6B4B,oCZ06B5BlD,YAAY,IAEZf,IAAK,mBACLiE,MY56BsB,IZ66BtBlD,YAAY,IAEZf,IAAK,iBACLiE,MY/6BoB,OZg7BpBlD,YAAY,IAEZf,IAAK,qBACLiE,MYl7BwB,KZy7BxBlD,YAAY,KYj8BC2D,EAAWxE,UAgC5BiM,SAAQ,WACJ,MAAOvN,MAAKmN,WAjCCrH,EAAWxE,UAuC5BqL,QAAO,WACH,MAAO3M,MAAK8P,UAxCChK,EAAWxE,UA8C5BoM,GAAE,WACE,MAAO1N,MAAKmN,WAAanN,KAAKmN,UAAUO,IA/C3B5H,EAAWxE,UAqD5BkM,KAAI,WACA,IAAKxN,KAAKsN,YAActN,KAAKqN,eAAgB,KAAM,IAAIrC,OAAM,uBAC7D,OAAOhL,MAAKyN,OAvDC3H,EAAWxE,UA6D5B2O,KAAI,WACA,IAAKjQ,KAAKsN,UAAW,KAAM,IAAItC,OAAM,uBAIrC,OAHKhL,MAAK+P,QACN/P,KAAK+P,MAAQ/P,KAAKyN,MAAQxD,KAAKK,MAAMtK,KAAKyN,OAAS,MAEhDzN,KAAK+P,OAlECjK,EAAWxE,UAyE5B4M,MAAK,SAACgC,GAEF,GAAIlQ,KAAK0N,OAASwC,EAAa,MAAO,KAEtC,IAAIjC,IAAWjO,KAAKmN,WAAanN,KAAKmN,UAAUgD,OAASnQ,KAAKmN,UAAUgD,OAAS,IAAM,KACxEnQ,KAAKmN,WAAanN,KAAKmN,UAAUiD,WAAapQ,KAAKmN,UAAUiD,WAAa,GAEzF,KAEQpQ,KAAKiQ,OAAOhC,UAASA,EAAUjO,KAAKiQ,OAAOhC,SAC3CjO,KAAKiQ,OAAOI,oBAAmBpC,EAAUjO,KAAKiQ,OAAOI,mBACrDrQ,KAAKiQ,OAAOK,cAAarC,EAAUjO,KAAKiQ,OAAOK,aAErD,MAAOvC,IAET,MAAOE,IAxFMnI,EAAWxE,UA+F5BiP,UAAS,WAEL,IAAKvQ,KAAKqN,eAAgB,KAAM,IAAIrC,OAAM,4BAE1C,KAAKhL,KAAKgQ,WAAW/N,OAAQ,CAIzB,GAAIuL,GAAOxN,KAAKwN,MAEhB,KAAKA,EAAM,KAAM,IAAIxC,OAAM,mBAE3B,IAAIwF,GAAWxQ,KAAKyQ,kBAAkBC,MAAM,qBAAqB,EAEjE,KAAKF,EAAU,KAAM,IAAIxF,OAAM,uBAE/B,IAAI2F,GAAQnD,EAAKoD,WAAWvJ,MAAMvB,EAAY+K,mBAAqBL,EAKnE,IAHwB,KAApBG,EAAM,GAAGlJ,QAAekJ,EAAMG,QAC9BH,EAAMA,EAAM1O,OAAS,GAAGwF,QAAU3B,EAAY+K,oBAAoBF,EAAMI,MAExEJ,EAAM1O,OAAS,EAAG,KAAM,IAAI+I,OAAM,mBAItC,IAAIgG,GAAalL,EAAYiG,OAAO4E,EAAMG,QAAS9Q,KAAKmN,UAAUgD,OAAQnQ,KAAKmN,UAAUiD,YAAYH,MAIrGjQ,MAAKgQ,WAAaW,EAAMM,IAAI,SAACC,EAAalP,GAEtC,GAAImO,GAASa,EAAWzD,SAASvL,GAAGmO,MAEpC,OAAOrK,GAAYiG,OAAOmF,EAAMf,KAMxC,MAAOnQ,MAAKgQ,YAtIClK,EAAWxE,UA0I5B6P,eAAc,SAAClC,GACX,MAAOjP,MAAKyQ,kBAAkBjJ,QAAQyH,GAAe,IA3IxCnJ,EAAWxE,UA8I5BmP,gBAAe,WACX,MAAOzQ,MAAKmN,UAAUkB,QAAQ+C,IAAItL,EAAYkJ,eAAiB,IA/IlDlJ,EAAWxE,UAkJ5B+L,aAAY,WACR,MAAOrN,MAAKmR,eAAerL,EAAYuL,wBAnJ1BvL,EAAWxE,UAsJ5BgQ,cAAa,WACT,MAAOtR,MAAKmR,eAAerL,EAAYoJ,yBAvJ1BpJ,EAAWxE,UA0J5BgM,QAAO,WACH,MAAOtN,MAAKmR,eAAerL,EAAY+I,mBA3J1B/I,EAqKViG,OAAM,SAACyB,EAAM2C,EAAQC,GAExB5C,EAAOA,GAAQ,GACf2C,EAASA,GAAU,IACnBC,EAAaA,GAAc,KAE3B5C,EAAOA,EAAK+D,QAAQ,MAAO,GAE3B,IAAIlD,GAAU,GAAAxL,GAAA0G,QACViI,EAAiBhE,EAAKnG,MAAMvB,EAAY2L,gBACxCC,EAAeF,EAAevP,OAAS,EAAKuP,EAAeV,QAAU,EAgBzE,OAdAtD,GAAOgE,EAAevK,KAAKnB,EAAY2L,iBAEtCC,GAAe,IACXrK,MAAM,MACNX,QAAQ,SAACiL,GAEN,GAAItK,GAAQsK,EAAOlK,OAAOJ,MAAMvB,EAAY8L,kBACxCxQ,EAAMiG,EAAMyJ,QAAQrJ,OACpBpC,EAAQgC,EAAMJ,KAAKnB,EAAY8L,kBAAkBnK,MAEjDrG,IAAKiN,EAAQwD,OAAOzQ,EAAKiE,KAI9B,GAAIS,GAAY,KAAMyJ,EAAMF,eAAe7B,GAC9Ca,QAASA,EACT8B,OAAQA,EACRC,WAAYA,IACZ5C,IAnMS1H,IZ6nCrBpG,GAAQ,WY7nCaoG,EZ8nCrBnG,EAAOD,QAAUA,EAAQ,YAInB,SAASC,EAAQD,EAASW,GAEhC,YAIA,SAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAEzF,QAASS,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAEhH,QAASiK,GAAUC,EAAUC,GAAc,GAA0B,kBAAfA,IAA4C,OAAfA,EAAuB,KAAM,IAAInK,WAAU,iEAAoEmK,GAAeD,GAASvK,UAAYD,OAAO0K,OAAOD,GAAcA,EAAWxK,WAAa0K,aAAe3G,MAAOwG,EAAU1J,YAAY,EAAOE,UAAU,EAAMD,cAAc,KAAe0J,IAAYzK,OAAO4K,eAAiB5K,OAAO4K,eAAeJ,EAAUC,GAAcD,EAASK,UAAYJ,GANjepM,EAAQsB,YAAa,CAQrB,IAAI8Q,GAAYzR,EajpCK,IbmpCjB0R,EAAajR,EAAuBgR,GAEpC7O,EAAc5C,EappCkB,GbspChC6C,EAAepC,EAAuBmC,GappCrB4C,EAAM,SAAAmM,GAEZ,QAFMnM,Kb0pCbrE,EAAgBxB,Ka1pCH6F,GAGbmM,EAAAtR,KAAAV,MACAA,KAAKiS,UAAY,GAAAF,GAAA,WbmrCrB,MAhCAnG,GavpCiB/F,EAAMmM,GAANnM,EAAMvE,UAOvB4Q,SAAQ,WACJ,MAAOlS,MAAKiS,WARCpM,EAAMvE,UAWjB4L,cAAa,SAACP,Gb0pChB,GaxpCIwF,EbypCJ,OAAOtF,oBAAmBC,MAAM,SAAwBC,GACpD,OAAU,OAAQA,EAAYC,KAAOD,EAAY7E,MAC7C,IAAK,GAGD,Ma9pCRiK,GAAOnS,KAAKiS,UAAUG,KAAKzF,Gb6pCnBI,EAAY7E,KAAO,EACZ2E,mBAAmBI,Ma5pCzBkF,EAAKE,YAAY1F,Gb8pCtB,KAAK,GACD,MAAOI,GAAYY,OAAO,SAAUZ,EAAYK,KAEpD,KAAK,GACL,IAAK,MACD,MAAOL,GAAYe,SAE5B,KAAM9N,OaprCI6F,GbwrClB3C,EAAa,WAEhBxD,GAAQ,Wa1rCamG,Eb2rCrBlG,EAAOD,QAAUA,EAAQ,YAInB,SAASC,EAAQD,EAASW,GAEhC,YAIA,SAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAEzF,QAASS,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAJhHjC,EAAQsB,YAAa,CAMrB,IAAIsR,GAAQjS,Ec5sCK,Id8sCbkS,EAASzR,EAAuBwR,Gc5sCfnM,EAAQ,WAEd,QAFMA,KdgtCb3E,EAAgBxB,KchtCHmG,GAGbnG,KAAKwS,Udu2CT,Mc12CiBrM,GAAQ7E,UAMzBmR,IAAG,SAACN,GAEA,MADAnS,MAAKwS,OAAOzL,KAAKoL,GACVnS,MARMmG,EAAQ7E,UAWzBoR,MAAK,WAED,MADA1S,MAAKwS,UACExS,MAbMmG,EAAQ7E,UAgBzB8Q,KAAI,SAACzF,GAID,GAAIwF,GAAOnS,KAAKwS,OAAO1B,OAEvB,KAAKqB,EAAM,KAAM,IAAInH,OAAM,mCAAqC2B,EAAQ4B,OAAS,IAAM5B,EAAQ2B,IAE/F,KAAK6D,EAAKQ,KAAKhG,GAAU,KAAM,IAAI3B,OAAM,iBAAmB2B,EAAQ4B,OAAS,IAAM5B,EAAQ2B,IAClD,sBAAwB6D,EAAK5D,SAAW,IAAM4D,EAAKS,OAE5F,OAAOT,IA3BMhM,EAAQ7E,UA+BzBuR,QAAO,SAACtE,EAAeqE,EAAarF,EAAc4C,EAAQC,GAItD,MAFApQ,MAAKyS,IAAI,GAAAF,GAAA,WAAShE,EAAQqE,EAAMrF,EAAU4C,EAAQC,IAE3CpQ,MAnCMmG,EAAQ7E,UAuCzBwR,eAAc,WAYV,MAVA9S,MAAK6S,QAAQ,OAAQ,wBACjBE,aAAgB,eAChBC,WAAc,SACdC,WAAc,KACdC,cAAiB,gBACjBC,yBAA4B,MAC5BC,MAAS,kBACTC,YAAc,GAAIC,OAAOC,UAAY,OAGlCvT,MAnDMmG,EAAQ7E,UAuDzBkS,OAAM,WAIF,MAFAxT,MAAK6S,QAAQ,OAAQ,4BAEd7S,MA3DMmG,EAAQ7E,UA+DzBmS,aAAY,SAACjT,GAiBT,MAfAR,MAAK6S,QAAQ,MAAO,qCAAuCrS,EAAK,aAC5DkT,IAAO,uEAAyElT,EAAK,YACrFmT,WACID,IAAO,uEAAyElT,EAChFA,GAAMA,EACNoT,gBAAmB,OAEvBC,eACAC,eAAkB,YAClBC,gBAAmB,UACnBC,WAAc,YACdC,UAAa,eACbC,YAAe1T,IAGZR,MAhFMmG,EAAQ7E,UAoFzB6S,iBAAgB,SAACC,GAEbA,EAAYA,GAAa,IAEzB,IAAIC,GAAO,GAAIf,KAqBf,OAnBAtT,MAAK6S,QAAQ,OAAQ,8BACjByB,cACI,gDAEJC,eAAkB,GAAIjB,MAAKe,EAAKd,UAAyB,IAAZa,GAAmBI,cAChEJ,UAAaA,EACbK,cACIC,cAAiB,SACjBC,YAAc,EACdC,QAAW,UACXC,cAAiB,YACjBC,UAAa,aAEjBtU,GAAM,cACNuU,aAAgBV,EAAKG,cACrBrE,OAAU,SACVuD,IAAO,2EAGJ1T,MA7GMmG,EAAQ7E,UAiHzB0T,oBAAmB,SAACxU,EAAIyU,GAEpBzU,EAAKA,GAAM,GAEX,IAAI6T,GAAO,GAAIf,KAoBf,OAlBAtT,MAAK6S,QAAQ,OAAQ,8BACjByB,cAAiB,qCAAuC9T,EAAK,aAAeyU,EAAW,+BAAiC,KACxHV,eAAkB,GAAIjB,MAAKe,EAAKd,UAAa,MAAsBiB,cACnEC,cACIC,cAAiB,SACjBC,YAAc,EACdC,QAAW,UACXC,cAAiB,YACjBC,UAAa,YACbI,oBAAuB,MACvBC,cAAiB,4BAErBJ,aAAgBV,EAAKG,cACrBhU,GAAM,cACN2P,OAAU,SACVuD,IAAO,2EAGJ1T,MAzIMmG,EAAQ7E,UA6IzB8T,aAAY,SAACC,GAuBT,MArBKA,GAaDrV,KAAK6S,QAAQ,OAAQ,wBACjB5E,QAAW,cACXoC,kBAAqB,cACrBC,YAAe,eAChB,KAfHtQ,KAAK6S,QAAQ,OAAQ,wBACjBE,aAAgB,4BAChBC,WAAc,SACdC,WAAc,KACdC,cAAiB,6BACjBC,yBAA4B,MAC5BC,MAAS,oBAaVpT,MApKMmG,Id62CrBzG,GAAQ,Wc72CayG,Ed82CrBxG,EAAOD,QAAUA,EAAQ,YAInB,SAASC,EAAQD,EAASW,GAEhC,YAIA,SAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAEzF,QAASS,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAJhHjC,EAAQsB,YAAa,CAMrB,IAAImC,GAAmB9C,Ee93CC,Ifg4CpB+C,EAAoBtC,EAAuBqC,GAE3CV,EAAapC,Eej4CG,Gfm4ChBgD,EAAahD,Eel4CY,IAER+F,EAAI,WAEV,QAFMA,GAELmI,EAAQqE,EAAM3C,EAAME,EAAQC,EAAYjI,Gfk4ChD3G,EAAgBxB,Kep4CHoG,GAGbpG,KAAKsV,QAAU/G,EAAOgH,cACtBvV,KAAKwV,MAAQ5C,EACb5S,KAAK+P,MAAQE,MACbjQ,KAAKyV,OAAStN,GAAS,GACvBnI,KAAK0V,QAAUvF,GAAU,IACzBnQ,KAAK2V,YAAcvF,GAAc,Kfm7CrC,Me37CiBhK,GAAI9E,UAWrBsR,KAAI,WACA,MAAO5S,MAAKwV,OAZCpP,EAAI9E,UAerBiN,OAAM,WACF,MAAOvO,MAAKsV,SAhBClP,EAAI9E,UAmBrBqR,KAAI,SAAChG,GAED,MAAOA,GAAQ2B,IAAI9G,QAAQxH,KAAKwV,OAAS,IAClC7I,EAAQ4B,OAAOgH,eAAiBvV,KAAKsV,SAtB/BlP,EAAI9E,UA0Bf+Q,YAAW,SAAC1F,Gfk4Cd,MAAOE,oBAAmBC,MAAM,SAAsBC,GAClD,OAAU,OAAQA,EAAYC,KAAOD,EAAY7E,MAC7C,IAAK,GAED,MADA6E,GAAY7E,KAAO,EACZ2E,mBAAmBI,Mep4ChCxK,EAAA0F,MAAMnI,KAAKyV,Qfs4CT,KAAK,GACD,MAAO1I,GAAYY,OAAO,Ser4C/B3N,KAAKqP,eAAerP,KAAK+P,Ofu4CxB,KAAK,GACL,IAAK,MACD,MAAOhD,GAAYe,SAE5B,KAAM9N,Oez6CIoG,EAAI9E,UAkCrB+N,eAAc,SAACY,EAAM7B,GAEjBA,EAAOA,MAEPA,EAAK+B,OAAS/B,EAAK+B,QAAUnQ,KAAK0V,QAClCtH,EAAKgC,WAAahC,EAAKgC,YAAcpQ,KAAK2V,WAE1C,IAAIC,GAAM3L,KAAKC,UAAU+F,GACrBL,EAAMvM,EAAAgM,eAAeuG,EAAKxH,EAI9B,OAFAwB,GAAIvB,QAAQwH,IAAIzS,EAAA,WAAY4L,aAAc5L,EAAA,WAAYyL,kBAE/Ce,GA9CMxJ,If87CrB1G,GAAQ,We97Ca0G,Ef+7CrBzG,EAAOD,QAAUA,EAAQ,YAInB,SAASC,EAAQD,EAASW,GAEhC,YAMA,SAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAEzF,QAASS,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAEhH,QAASiK,GAAUC,EAAUC,GAAc,GAA0B,kBAAfA,IAA4C,OAAfA,EAAuB,KAAM,IAAInK,WAAU,iEAAoEmK,GAAeD,GAASvK,UAAYD,OAAO0K,OAAOD,GAAcA,EAAWxK,WAAa0K,aAAe3G,MAAOwG,EAAU1J,YAAY,EAAOE,UAAU,EAAMD,cAAc,KAAe0J,IAAYzK,OAAO4K,eAAiB5K,OAAO4K,eAAeJ,EAAUC,GAAcD,EAASK,UAAYJ,GARjepM,EAAQsB,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,EgBr9CC,GhBu9CnB2C,EAAmBlC,EAAuBiC,GAE1C+S,EAASzV,EgBx9CK,IhB09Cd0V,EAAUjV,EAAuBgV,GAEjCE,EAAQ3V,EgB39CK,IhB69Cb4V,EAASnV,EAAuBkV,GAIhCvT,GAFiBpC,EgB99CC,GhBg+CLA,EgB/9CqC,IAEjC2F,EAAQ,SAAAsG,GA0Bd,QA1BMtG,GA0BLnB,EAAQa,EAAOX,EAAQC,EAAQC,GhB0/CvCzD,EAAgBxB,KgBphDHgG,GA4BbsG,EAAA5L,KAAAV,MhB4/CAA,KgB1gDJ6K,QACIqL,YAAa,cACbC,aAAc,eACdC,WAAY,aACZC,cAAe,gBACfC,eAAgB,iBAChBC,aAAc,eACdC,aAAc,eACdC,cAAe,gBACfC,YAAa,eAOb1W,KAAK2W,QAAU5R,EACf/E,KAAK4W,QAAU5R,EACfhF,KAAK6W,WAAa5R,EAGlBjF,KAAKyE,OAASiB,EAGd1F,KAAK4E,QAAUC,EAEf7E,KAAK8W,OAAS,GAAAf,GAAA,WAAU/V,KAAKyE,OAAQuB,EAAS+Q,SAAW,YAEzD/W,KAAKgX,MAAQ,GAAAf,GAAA,WAASjW,KAAKyE,OAAQuB,EAAS+Q,UhBsqEhD,MAhvBAnL,GgBh+CiB5F,EAAQsG,GhBk+CzB1K,EgBl+CiBoE,EAAQ,OhBm+CrB5E,IAAK,aACLiE,MgBl+CgB,WhBm+ChBlD,YAAY,IAEZf,IAAK,cACLiE,MgBr+CiB,OhBs+CjBlD,YAAY,IAEZf,IAAK,kBACLiE,MgBx+CqB,KhB0+CrBlD,YAAY,IAEZf,IAAK,mBACLiE,MgB5+CsB,KhB8+CtBlD,YAAY,IAEZf,IAAK,2BACLiE,MgBh/C8B,OhBk/C9BlD,YAAY,IAEZf,IAAK,iBACLiE,MgBp/CoB,uBhBq/CpBlD,YAAY,IAEZf,IAAK,kBACLiE,MgBv/CqB,wBhBw/CrBlD,YAAY,IAEZf,IAAK,qBACLiE,MgB1/CwB,2BhB2/CxBlD,YAAY,IAEZf,IAAK,kBACLiE,MgB7/CqB,IhB8/CrBlD,YAAY,IAEZf,IAAK,WACLiE,MgBhgDc,WhBigDdlD,YAAY,IAEZf,IAAK,4BACLiE,OgBngD+B,EhBogD/BlD,YAAY,KgBhhDC6D,EAAQ1E,UAiDzB2V,KAAI,WACA,MAAOjX,MAAKgX,OAlDChR,EAAQ1E,UAwDzBuD,OAAM,WACF,MAAO7E,MAAK4E,SAzDCoB,EAAQ1E,UAoEzB4V,UAAS,SAACtE,EAAMpO,GAEZoO,EAAOA,GAAQ,GACfpO,EAAUA,KAEV,IAAI2S,GAAW,GACXC,EAAqC,IAA3BxE,EAAKpL,QAAQ,YAAgD,IAA5BoL,EAAKpL,QAAQ,WAa5D,OAXIhD,GAAQ6S,YAAcD,IAASD,GAAYnX,KAAK2W,SAEX,IAArC/D,EAAKpL,QAAQxB,EAASsR,aAAsBF,IAASD,GAAYnR,EAASsR,WAAa,IAAMtR,EAASuR,aAE1GJ,GAAYvE,GAERpO,EAAQgT,WAAahT,EAAQiT,YAAUN,GAAavE,EAAKpL,QAAQ,KAAO,GAAK,IAAM,KAEnFhD,EAAQgT,YAAWL,GAAY,WAAa3S,EAAQgT,WACpDhT,EAAQiT,WAAUN,IAAa3S,EAAQgT,UAAY,IAAM,IAAM,gBAAkBxX,KAAKgX,MAAMU,eAEzFP,GAvFMnR,EAAQ1E,UAmGzBqW,QAAO,SAACnT,GAIJ,MAFAA,GAAUA,MAEHxE,KAAKkX,UAAUlR,EAAS4R,mBAAqB,IAAMnV,EAAA6D,gBAClDuR,cAAiB,OACjBC,aAAgBtT,EAAQuT,aAAe,GACvCC,UAAahY,KAAK4W,QAClBqB,MAASzT,EAAQyT,OAAS,GAC1BC,SAAY1T,EAAQ2T,SAAW,GAC/BC,QAAW5T,EAAQ4T,SAAW,GAC9BC,OAAU7T,EAAQ6T,QAAU,MAC3BhB,WAAW,KA/GPrR,EAAQ1E,UAuHzBgX,qBAAoB,SAAChK,GAEjB,GAAIiK,GAAK9V,EAAAyE,iBAAiBoH,EAAIjH,MAAM,KAAKmR,UAAU,IAC/CtK,EAAQqK,EAAGlI,mBAAqBkI,EAAGrK,KAEvC,IAAIA,EAAO,CACP,GAAIH,GAAI,GAAI/C,OAAMkD,EAElB,MADAH,GAAEG,MAAQqK,EAAGrK,MACPH,EAGV,MAAOwK,IAlIMvS,EAAQ1E,UAyInBmX,SAAQ,WhBwgDV,MAAO5L,oBAAmBC,MAAM,SAAmBC,GAC/C,OAAU,OAAQA,EAAYC,KAAOD,EAAY7E,MAC7C,IAAK,GAGD,MAFA6E,GAAYC,KAAO,EACnBD,EAAY7E,KAAO,EACZ2E,mBAAmBI,MgB1gD5BjN,KAAK0Y,wBhB4gDP,KAAK,GACD,MAAO3L,GAAYY,OAAO,UgB5gD3B,EhB8gDH,KAAK,GAGD,MAFAZ,GAAYC,KAAO,EACnBD,EAAYa,GAAKb,EAAY,SAAS,GAC/BA,EAAYY,OAAO,UgB/gD3B,EhBihDH,KAAK,GACL,IAAK,MACD,MAAOZ,GAAYe,SAE5B,KAAM9N,OAAQ,EAAG,MgBpqDPgG,EAAQ1E,UA6JnBqX,MAAK,SAACnU,GhBqhDR,GgB3gDQsK,GAuBAlC,EACAqD,ChBo/CR,OAAOpD,oBAAmBC,MAAM,SAAgBC,GAC5C,OAAU,OAAQA,EAAYC,KAAOD,EAAY7E,MAC7C,IAAK,GA+BD,MA9BA6E,GAAYC,KAAO,EgBrhD3BxI,EAAUA,MAEVA,EAAQoU,SAAWpU,EAAQoU,WAAY,EAEvC5Y,KAAKiL,KAAKjL,KAAK6K,OAAOqL,aAElBpH,GACA+J,iBAAoB7S,EAAS8S,gBAC7BC,kBAAqBvU,EAAQoU,SAAW5S,EAASgT,yBAA2BhT,EAASiT,kBAGpFzU,EAAQ0U,KAOF1U,EAAQ0U,OAEfpK,EAAKqK,WAAa,qBAClBrK,EAAKoK,KAAO1U,EAAQ0U,KACpBpK,EAAKgJ,aAAetT,EAAQuT,cAT5BjJ,EAAKqK,WAAa,WAClBrK,EAAKsK,SAAW5U,EAAQ4U,SACxBtK,EAAKuK,SAAW7U,EAAQ6U,SACxBvK,EAAK6E,UAAYnP,EAAQmP,WAAa,IAWtCnP,EAAQ8U,aAAYxK,EAAKyK,YAAc/U,EAAQ8U,YhBuhD3CvM,EAAY7E,KAAO,EACZ2E,mBAAmBI,MgBthDVjN,KAAKwZ,cAAcxT,EAASyT,eAAgB3K,GhBwhDhE,KAAK,GAQD,MgBhiDJlC,GAAWG,EAAAK,KACX6C,EAAOrD,EAAYqD,OAEvBjQ,KAAKgX,MACA0C,QAAQzJ,GACR0J,YAAYnV,EAAQoU,UAEzB5Y,KAAKiL,KAAKjL,KAAK6K,OAAOsL,aAAcvJ,GhByhDrBG,EAAYY,OAAO,SgBvhD3Bf,EhByhDH,KAAK,IAQD,KAPAG,GAAYC,KAAO,GACnBD,EAAYa,GAAKb,EAAY,SAAS,GgBvhD9C/M,KAAKyE,OAAO8F,QAEZvK,KAAKiL,KAAKjL,KAAK6K,OAAOuL,WAAUrJ,EAAAa,IhB2hDlBb,EAAYa,EAEtB,KAAK,IACL,IAAK,MACD,MAAOb,GAAYe,SAE5B,KAAM9N,OAAQ,EAAG,OgB9uDPgG,EAAQ1E,UAwNnBsY,QAAO,WhB8hDT,GgB//CQhK,GAMAK,ChB0/CR,OAAOpD,oBAAmBC,MAAM,SAAkBC,GAC9C,OAAU,OAAQA,EAAYC,KAAOD,EAAY7E,MAC7C,IAAK,GAKD,GAJA6E,EAAYC,KAAO,EgB9hD3BhN,KAAKiL,KAAKjL,KAAK6K,OAAOwL,gBAElBrW,KAAK8W,OAAO+C,WAAU,ChBiiDd9M,EAAY7E,KAAO,CACnB,OAIJ,MADA6E,GAAY7E,KAAO,EACZ2E,mBAAmBI,MgBpiDxBjN,KAAK8W,OAAOjP,OhBsiDlB,KAAK,GACD,GgBriDC7H,KAAK8Z,sBAAqB,ChBsiDvB/M,EAAY7E,KAAO,CACnB,OAGJ,KgBziDM,IAAI8C,OAAM,qChB2iDpB,KAAK,GAID,MgB5iDJhL,MAAKiL,KAAKjL,KAAK6K,OAAOyL,eAAgB,MhB4iD3BvJ,EAAYY,OAAO,SgB1iDvB,KhB4iDP,KAAK,GAMD,MgB9iDR3N,MAAK8W,OAAOiD,QhB6iDJhN,EAAY7E,KAAO,GACZ2E,mBAAmBI,MgB3iD5BxK,EAAA0F,MAAMnC,EAASgU,iBhB6iDjB,KAAK,IACD,GgB3iDHha,KAAKgX,MAAMiD,eAAc,ChB4iDlBlN,EAAY7E,KAAO,EACnB,OAGJ,KgBhjD8B,IAAI8C,OAAM,2BhBkjD5C,KAAK,IACD,GgBljDHhL,KAAKgX,MAAMkD,oBAAmB,ChBmjDvBnN,EAAY7E,KAAO,EACnB,OAGJ,KgBvjDmC,IAAI8C,OAAM,4BhByjDjD,KAAK,IACD,GgBzjDHhL,KAAK8W,OAAO+C,WAAU,ChB0jDf9M,EAAY7E,KAAO,EACnB,OAGJ,KgB9jD2B,IAAI8C,OAAM,wChBgkDzC,KAAK,IAED,MADA+B,GAAY7E,KAAO,GACZ2E,mBAAmBI,MgB/jDlBjN,KAAKwZ,cAAcxT,EAASyT,gBACpCN,WAAc,gBACdjG,cAAiBlT,KAAKgX,MAAMiD,eAC5BpB,iBAAoB7S,EAAS8S,gBAC7BC,kBAAqB/Y,KAAKgX,MAAM4B,WAAa5S,EAASgT,yBAA2BhT,EAASiT,mBhBkkD9F,KAAK,IAID,GgB1kDJrJ,EAAG7C,EAAAK,KAMH6C,EAAOL,EAAIK,OAEVA,EAAK8C,aAAY,ChBmkDVhG,EAAY7E,KAAO,EACnB,OAGJ,KgBtkDElI,MAAK4E,QAAQiJ,UAAU,GAAI7C,OAAM,4BAA6B4E,EhBwkDpE,KAAK,IAOD,MgB5kDR5P,MAAKgX,MAAM0C,QAAQzJ,GACnBjQ,KAAK8W,OAAOqD,SAEZna,KAAKiL,KAAKjL,KAAK6K,OAAOyL,eAAgB1G,GhBykDvB7C,EAAYY,OAAO,SgBvkD3BiC,EhBykDH,KAAK,IAYD,KAXA7C,GAAYC,KAAO,GACnBD,EAAYa,GAAKb,EAAY,SAAS,GgBvkD9CA,EAAAa,GAAI5N,KAAK4E,QAAQiJ,UAASd,EAAAa,IAEtB5H,EAASoU,2BACTpa,KAAKyE,OAAO8F,QAGhBvK,KAAKiL,KAAKjL,KAAK6K,OAAO0L,aAAYxJ,EAAAa,IhB2kDpBb,EAAYa,EAEtB,KAAK,IACL,IAAK,MACD,MAAOb,GAAYe,SAE5B,KAAM9N,OAAQ,EAAG,OgBn2DPgG,EAAQ1E,UA6RnBkS,OAAM,WhB8kDR,GgBtkDQ5D,EhBukDR,OAAO/C,oBAAmBC,MAAM,SAAiBC,GAC7C,OAAU,OAAQA,EAAYC,KAAOD,EAAY7E,MAC7C,IAAK,GAQD,MAPA6E,GAAYC,KAAO,EgB9kD3BhN,KAAKiL,KAAKjL,KAAK6K,OAAO2L,cAEtBxW,KAAK8W,OAAOiD,QhBklDJhN,EAAY7E,KAAO,EACZ2E,mBAAmBI,MgBjlDlBjN,KAAKwZ,cAAcxT,EAASqU,iBACxCC,MAAOta,KAAKgX,MAAMU,gBhBolDlB,KAAK,GAQD,MgB7lDJ9H,GAAG7C,EAAAK,KAIPpN,KAAK8W,OAAOqD,SACZna,KAAKyE,OAAO8F,QAEZvK,KAAKiL,KAAKjL,KAAK6K,OAAO4L,cAAe7G,GhBslDtB7C,EAAYY,OAAO,SgBplD3BiC,EhBslDH,KAAK,IAQD,KAPA7C,GAAYC,KAAO,GACnBD,EAAYa,GAAKb,EAAY,SAAS,GgBplD9C/M,KAAK8W,OAAOqD,SAEZna,KAAKiL,KAAKjL,KAAK6K,OAAO6L,YAAW3J,EAAAa,IhBwlDnBb,EAAYa,EAEtB,KAAK,IACL,IAAK,MACD,MAAOb,GAAYe,SAE5B,KAAM9N,OAAQ,EAAG,OgBl5DPgG,EAAQ1E,UAkUnBiZ,eAAc,SAAC5N,EAASnI,GhB2lD1B,MAAOqI,oBAAmBC,MAAM,SAAyBC,GACrD,OAAU,OAAQA,EAAYC,KAAOD,EAAY7E,MAC7C,IAAK,GAID,GgB/lDZ1D,EAAUA,OAENA,EAAQgW,cAAa,ChB8lDTzN,EAAY7E,KAAO,CACnB,OAGJ,MAAO6E,GAAYY,OAAO,SgBlmDJhB,EhBomD1B,KAAK,GAED,MADAI,GAAY7E,KAAO,EACZ2E,mBAAmBI,MgBpmDhCjN,KAAK0Y,wBhBsmDH,KAAK,GAOD,MgB3mDZ/L,GAAQ0B,QAAQwH,IAAI,gBAAiB7V,KAAKya,ehB2mDvB1N,EAAYY,OAAO,SgBtmD/BhB,EhBwmDC,KAAK,GACL,IAAK,MACD,MAAOI,GAAYe,SAE5B,KAAM9N,OgB37DIgG,EAAQ1E,UAyVnBoL,YAAW,SAACC,EAASnI,GhB6mDvB,MAAOqI,oBAAmBC,MAAM,SAAsBC,GAClD,OAAU,OAAQA,EAAYC,KAAOD,EAAY7E,MAC7C,IAAK,GAGD,MAFA6E,GAAYC,KAAO,EACnBD,EAAY7E,KAAO,EACZ2E,mBAAmBI,MgB9mDlBjN,KAAKua,eAAe5N,EAASnI,GhBgnDzC,KAAK,GAGD,MgBnnDRmI,GAAOI,EAAAK,KhBknDCL,EAAY7E,KAAO,EACZ2E,mBAAmBI,MgBjnDpBjN,KAAK4E,QAAQ8H,YAAYC,GhBmnDnC,KAAK,GACD,MAAOI,GAAYY,OAAO,SAAUZ,EAAYK,KAEpD,KAAK,GAID,GAHAL,EAAYC,KAAO,EACnBD,EAAYa,GAAKb,EAAY,SAAS,GgBnnDzCA,EAAAa,GAAEhB,aAAgBG,EAAAa,GAAEhB,YAAYW,YAAkD,KAAnCR,EAAAa,GAAEhB,YAAYW,WAAW4C,OAAc,ChBsnD/EpD,EAAY7E,KAAO,EACnB,OAGJ,KAAM6E,GAAYa,EAEtB,KAAK,IAKD,MgB/nDR5N,MAAKgX,MAAM0D,oBhB8nDH3N,EAAY7E,KAAO,GACZ2E,mBAAmBI,MgB7nDpBjN,KAAK0M,YAAYC,EAASnI,GhB+nDpC,KAAK,IACD,MAAOuI,GAAYY,OAAO,SAAUZ,EAAYK,KAEpD,KAAK,IACL,IAAK,MACD,MAAOL,GAAYe,SAE5B,KAAM9N,OAAQ,EAAG,MgB9+DPgG,EAAQ1E,UAwXnBqZ,KAAI,WhBqoDN,GgBroDOnW,GAAO4G,UAAAnJ,QAAA,GAAAlC,SAAAqL,UAAA,MAAKA,UAAA,EhBsoDnB,OAAOyB,oBAAmBC,MAAM,SAAeC,GAC3C,OAAU,OAAQA,EAAYC,KAAOD,EAAY7E,MAC7C,IAAK,GAMD,MgB3oDZ1D,GAAQ8J,IAAMtO,KAAKkX,UAAU1S,EAAQ8J,KAAM+I,WAAW,IhB0oD1CtK,EAAY7E,KAAO,EACZ2E,mBAAmBI,MgBzoDzBjN,KAAK0M,YAAY1M,KAAK4E,QAAQuJ,cAAc3J,GAAUA,GhB2oD3D,KAAK,GACD,MAAOuI,GAAYY,OAAO,SAAUZ,EAAYK,KAEpD,KAAK,GACL,IAAK,MACD,MAAOL,GAAYe,SAE5B,KAAM9N,OgB/gEIgG,EAAQ1E,UAyYnB8P,IAAG,SAAC9C,EAAKK,EAAOnK,GhBmpDlB,MAAOqI,oBAAmBC,MAAM,SAAcC,GAC1C,OAAU,OAAQA,EAAYC,KAAOD,EAAY7E,MAC7C,IAAK,GAMD,MgB1pDZ1D,GAAUA,MACVA,EAAQ+J,OAAS,MACjB/J,EAAQ8J,IAAMA,EACd9J,EAAQmK,MAAQA,EhBspDJ5B,EAAY7E,KAAO,EACZ2E,mBAAmBI,MgBtpDzBjN,KAAK2a,KAAKnW,GhBwpDf,KAAK,GACD,MAAOuI,GAAYY,OAAO,SAAUZ,EAAYK,KAEpD,KAAK,GACL,IAAK,MACD,MAAOL,GAAYe,SAE5B,KAAM9N,OgB7iEIgG,EAAQ1E,UA0ZnBsZ,KAAI,SAACtM,EAAKQ,EAAMH,EAAOnK,GhBiqDzB,MAAOqI,oBAAmBC,MAAM,SAAeC,GAC3C,OAAU,OAAQA,EAAYC,KAAOD,EAAY7E,MAC7C,IAAK,GAOD,MgBzqDZ1D,GAAUA,MACVA,EAAQ+J,OAAS,OACjB/J,EAAQ8J,IAAMA,EACd9J,EAAQmK,MAAQA,EAChBnK,EAAQsK,KAAOA,EhBoqDH/B,EAAY7E,KAAO,EACZ2E,mBAAmBI,MgBpqDzBjN,KAAK2a,KAAKnW,GhBsqDf,KAAK,GACD,MAAOuI,GAAYY,OAAO,SAAUZ,EAAYK,KAEpD,KAAK,GACL,IAAK,MACD,MAAOL,GAAYe,SAE5B,KAAM9N,OgB7kEIgG,EAAQ1E,UA4anBuZ,IAAG,SAACvM,EAAKQ,EAAMH,EAAOnK,GhB+qDxB,MAAOqI,oBAAmBC,MAAM,SAAcC,GAC1C,OAAU,OAAQA,EAAYC,KAAOD,EAAY7E,MAC7C,IAAK,GAOD,MgBvrDZ1D,GAAUA,MACVA,EAAQ+J,OAAS,MACjB/J,EAAQ8J,IAAMA,EACd9J,EAAQmK,MAAQA,EAChBnK,EAAQsK,KAAOA,EhBkrDH/B,EAAY7E,KAAO,EACZ2E,mBAAmBI,MgBlrDzBjN,KAAK2a,KAAKnW,GhBorDf,KAAK,GACD,MAAOuI,GAAYY,OAAO,SAAUZ,EAAYK,KAEpD,KAAK,GACL,IAAK,MACD,MAAOL,GAAYe,SAE5B,KAAM9N,OgB7mEIgG,EAAQ1E,UA6bnB,UAAQ,SAACgN,EAAKK,EAAOnK,GhB6rDvB,MAAOqI,oBAAmBC,MAAM,SAAkBC,GAC9C,OAAU,OAAQA,EAAYC,KAAOD,EAAY7E,MAC7C,IAAK,GAMD,MgBpsDZ1D,GAAUA,MACVA,EAAQ+J,OAAS,SACjB/J,EAAQ8J,IAAMA,EACd9J,EAAQmK,MAAQA,EhBgsDJ5B,EAAY7E,KAAO,EACZ2E,mBAAmBI,MgBhsDzBjN,KAAK2a,KAAKnW,GhBksDf,KAAK,GACD,MAAOuI,GAAYY,OAAO,SAAUZ,EAAYK,KAEpD,KAAK,GACL,IAAK,MACD,MAAOL,GAAYe,SAE5B,KAAM9N,OgB3oEIgG,EAAQ1E,UAqcnBkY,cAAa,SAAC5G,EAAM9D,GhB0sDtB,MAAOjC,oBAAmBC,MAAM,SAAwBC,GACpD,OAAU,OAAQA,EAAYC,KAAOD,EAAY7E,MAC7C,IAAK,GAED,MADA6E,GAAY7E,KAAO,EACZ2E,mBAAmBI,MgB5sDzBjN,KAAK2a,MACdrM,IAAKsE,EACL4H,eAAe,EACf1L,KAAMA,EACNP,OAAQ,OACRF,SACIyM,cAAiB,SAAW9a,KAAK+a,UACjCC,eAAgB,uChBgtDhB,KAAK,GACD,MAAOjO,GAAYY,OAAO,SAAUZ,EAAYK,KAEpD,KAAK,GACL,IAAK,MACD,MAAOL,GAAYe,SAE5B,KAAM9N,OgBrqEIgG,EAAQ1E,UAodnBoX,sBAAqB,WhBqtDvB,MAAO7L,oBAAmBC,MAAM,SAAgCC,GAC5D,OAAU,OAAQA,EAAYC,KAAOD,EAAY7E,MAC7C,IAAK,GACD,IgBttDRlI,KAAK8Z,sBAAqB,ChButDd/M,EAAY7E,KAAO,CACnB,OAGJ,MAAO6E,GAAYY,OAAO,SgB3tDC,KhB6tD/B,KAAK,GAED,MADAZ,GAAY7E,KAAO,EACZ2E,mBAAmBI,MgB9tDzBjN,KAAK4Z,UhBguDV,KAAK,GACD,MAAO7M,GAAYY,OAAO,SAAUZ,EAAYK,KAEpD,KAAK,GACL,IAAK,MACD,MAAOL,GAAYe,SAE5B,KAAM9N,OgB9rEIgG,EAAQ1E,UA2dzBwY,oBAAmB,WAEf,MAAQ9Z,MAAKgX,MAAMiE,qBAAuBjb,KAAK8W,OAAO+C,YA7dzC7T,EAAQ1E,UAiezByZ,QAAO,WACH,GAAIG,GAASlb,KAAK4W,QAAU,IAAM5W,KAAK6W,UACvC,OAAuB,kBAARsE,MAAsBA,KAAKD,GAAU,GAAIE,QAAOF,GAAQtK,SAAS,WAnenE5K,EAAQ1E,UAsezBmZ,YAAW,WACP,GAAIH,GAAQta,KAAKgX,MAAMU,aACvB,OAAO1X,MAAKgX,MAAMqE,aAAef,EAAQ,IAAMA,EAAQ,KAxe1CtU,GhBitElBhD,EAAiB,WAEpBtD,GAAQ,WgBntEasG,EhBotErBrG,EAAOD,QAAUA,EAAQ,YAUnB,SAASC,EAAQD,EAASW,GAEhC,YAMA,SAASmB,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAJhHjC,EAAQsB,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,EiB9uEC,GjBgvElBoC,EAAapC,EiB/uEe,GAEX4F,EAAK,WAKX,QALMA,GAKLP,EAAO4V,GjBsvEf9Z,EAAgBxB,KiB3vEHiG,GAObjG,KAAKyE,OAASiB,EACd1F,KAAK+W,SAAWuE,EAChBtb,KAAKub,SAAW,KjBkyEpB,MA3DA3Z,GiBhvEiBqE,EAAK,OjBivElB7E,IAAK,gBACLiE,MiBhvEmB,IjBivEnBlD,YAAY,IAEZf,IAAK,kBACLiE,MiBnvEqB,IjBovErBlD,YAAY,KiBvvEC8D,EAAK3E,UAatBuY,SAAQ,WAEJ,GAAIrQ,GAAUxJ,KAAKyE,OACf6W,EAAUtb,KAAK+W,SACfyE,EAAOhS,EAAQY,QAAQkR,EAE3B,SAASE,GAAQlI,KAAKmI,MAAQC,SAASF,GAAQvV,EAAM0V,iBAnBxC1V,EAAK3E,UAsBtByY,MAAK,WAED,MADA/Z,MAAKyE,OAAOqF,QAAQ9J,KAAK+W,SAAUzD,KAAKmI,OACjCzb,MAxBMiG,EAAK3E,UA2BtB6Y,OAAM,WAEF,MADAna,MAAKyE,OAAO0F,WAAWnK,KAAK+W,UACrB/W,MA7BMiG,EAAK3E,UAgCtBuG,KAAI,WjBsvEA,GAAIkD,GAAQ/K,IiBpvEZ,OAAIA,MAAKub,SAAiBvb,KAAKub,UAE/Bvb,KAAKub,SAAW,GAAA1Y,GAAA8F,QAAY,SAACC,EAASC,GAElCpG,EAAAoF,KAAK,SAACK,GAEF,MAAI6C,GAAK8O,WAAmB3R,KAE5B6C,EAAKwQ,SAAW,KAEhBxQ,EAAKoP,aAELvR,GAAQ,QAET3C,EAAM2V,iBAIN5b,KAAKub,WApDCtV,IjB8yErBvG,GAAQ,WiB9yEauG,EjB+yErBtG,EAAOD,QAAUA,EAAQ,YAInB,SAASC,EAAQD,GAEvB,YAMA,SAAS8B,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAJhHjC,EAAQsB,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,MkB5zE5gBqE,EAAI,WAKV,QALMA,GAKLL,EAAO4V,GlBw0Ef9Z,EAAgBxB,KkB70EH+F,GAQb/F,KAAKyE,OAASiB,EACd1F,KAAK+W,SAAWuE,ElB+8EpB,MAvJA1Z,GkBj0EiBmE,EAAI,OlBk0EjB3E,IAAK,oBACLiE,MkBj0E8B,IlBm0E9BlD,YAAY,IAEZf,IAAK,kBACLiE,MkBr0EqB,SlBs0ErBlD,YAAY,KkBz0EC4D,EAAIzE,UAarBoW,YAAW,WACP,MAAO1X,MAAK+J,OAAOgJ,cAdNhN,EAAIzE,UAiBrB2Y,aAAY,WACR,MAAOja,MAAK+J,OAAOmJ,eAlBNnN,EAAIzE,UAqBrB+Z,UAAS,WACL,MAAOrb,MAAK+J,OAAOiJ,YAtBNjN,EAAIzE,UA4BrByI,KAAI,WAEA,MAAO/J,MAAKyE,OAAO2F,QAAQpK,KAAK+W,YACxB/D,WAAY,GACZD,aAAc,GACdE,WAAY,EACZC,cAAe,GACfC,yBAA0B,IAnCrBpN,EAAIzE,UA4CrBoY,QAAO,SAACmC,GAEJA,EAAUA,KAEV,IAAI9R,GAAO/J,KAAK+J,MAWhB,OATA1I,QAAOoF,KAAKoV,GAASnV,QAAQ,SAACtF,GAC1B2I,EAAK3I,GAAOya,EAAQza,KAGxB2I,EAAK+R,YAAcxI,KAAKmI,MAA2B,IAAlB1R,EAAKkJ;AACtClJ,EAAKgS,0BAA4BzI,KAAKmI,MAAyC,IAAhC1R,EAAKoJ,yBAEpDnT,KAAKyE,OAAOqF,QAAQ9J,KAAK+W,SAAUhN,GAE5B/J,MA3DM+F,EAAIzE,UAmErB2Z,iBAAgB,WAEZ,GAAIe,GAAWhc,KAAK+J,MACpB,OAAQiS,GAAShJ,aAAejN,EAAKkW,iBAAoBD,EAASF,YAAc/V,EAAKmW,kBAAoB5I,KAAKmI,OAtEjG1V,EAAIzE,UA8ErB4Y,kBAAiB,WAEb,MAAQla,MAAK+J,OAAOgS,0BAA4BzI,KAAKmI,OAhFxC1V,EAAIzE,UAuFrBoZ,kBAAiB,WAEb,MAAO1a,MAAK0Z,SACR3G,aAAc,GACdE,WAAY,KA3FHlN,EAAIzE,UAoGrB6a,oBAAmB,WAUf,MARAnc,MAAK0Z,SACD1G,WAAYjN,EAAKkW,gBACjBlJ,aAAc,GACdE,WAAY,EACZC,cAAe,GACfC,yBAA0B,IAGvBnT,MA9GM+F,EAAIzE,UAsHrBqY,YAAW,SAACf,GAER,MAAO5Y,MAAK0Z,SAASd,SAAUA,KAxHlB7S,EAAIzE,UA+HrBsX,SAAQ,WAEJ,QAAS5Y,KAAK+J,OAAO6O,UAjIR7S,IlB29ErBrG,GAAQ,WkB39EaqG,ElB49ErBpG,EAAOD,QAAUA,EAAQ,YAInB,SAASC,EAAQD,EAASW,GAEhC,YAIA,SAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAEzF,QAASS,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAJhHjC,EAAQsB,YAAa,CAMrB,IAAIob,GAAgB/b,EmB1+EG,InB4+EnBgc,EAAiBvb,EAAuBsb,GAExCvZ,EAAiBxC,EmB7+EA,GAEAgG,EAAiB,WAEvB,QAFMA,KnB++Eb7E,EAAgBxB,KmB/+EHqG,GAGbrG,KAAKsc,WAAazZ,EAAAuC,OAAOkX,WnBq/E7B,MmBx/EiBjW,GAAiB/E,UAMlC8M,KAAI,SAAC5J,GACD,MAAO,IAAA6X,GAAA,WAAe7X,IAPT6B,InB2/ErB3G,GAAQ,WmB3/Ea2G,EnB4/ErB1G,EAAOD,QAAUA,EAAQ,YAInB,SAASC,EAAQD,EAASW,GAEhC,YAIA,SAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAEzF,QAASS,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAEhH,QAASiK,GAAUC,EAAUC,GAAc,GAA0B,kBAAfA,IAA4C,OAAfA,EAAuB,KAAM,IAAInK,WAAU,iEAAoEmK,GAAeD,GAASvK,UAAYD,OAAO0K,OAAOD,GAAcA,EAAWxK,WAAa0K,aAAe3G,MAAOwG,EAAU1J,YAAY,EAAOE,UAAU,EAAMD,cAAc,KAAe0J,IAAYzK,OAAO4K,eAAiB5K,OAAO4K,eAAeJ,EAAUC,GAAcD,EAASK,UAAYJ,GANjepM,EAAQsB,YAAa,CAQrB,IAAI+B,GAAkB1C,EoB/gFC,GpBihFnB2C,EAAmBlC,EAAuBiC,GAE1CF,EAAiBxC,EoBlhFA,GAEAkc,EAAU,SAAAjQ,GAEhB,QAFMiQ,GAEL/X,GpBohFRhD,EAAgBxB,KoBthFHuc,GAGbjQ,EAAA5L,KAAAV,MACAA,KAAKwE,QAAUA,EACfxE,KAAKsc,WAAazZ,EAAAuC,OAAOkX,WpBsiF7B,MAxBA1Q,GoBnhFiB2Q,EAAUjQ,GAAViQ,EAAUjb,UAQ3Bkb,MAAK,aARYD,EAAUjb,UAU3Bmb,UAAS,SAACjY,GACNxE,KAAK4K,GAAG,WAAapG,EAAQkY,QAASlY,EAAQyJ,UAXjCsO,EAAUjb,UAc3Bqb,YAAW,SAACnY,GACRxE,KAAKwK,IAAI,WAAahG,EAAQkY,UAfjBH,EAAUjb,UAkB3Bsb,eAAc,SAACC,EAAKH,GAChB1c,KAAKiL,KAAK,WAAayR,EAASG,EAAK,MAAOH,IAnB/BH,GpB4iFlBvZ,EAAiB,WAEpBtD,GAAQ,WoB9iFa6c,EpB+iFrB5c,EAAOD,QAAUA,EAAQ,YAInB,SAASC,EAAQD,EAASW,GAEhC,YAMA,SAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAEzF,QAASS,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAEhH,QAASiK,GAAUC,EAAUC,GAAc,GAA0B,kBAAfA,IAA4C,OAAfA,EAAuB,KAAM,IAAInK,WAAU,iEAAoEmK,GAAeD,GAASvK,UAAYD,OAAO0K,OAAOD,GAAcA,EAAWxK,WAAa0K,aAAe3G,MAAOwG,EAAU1J,YAAY,EAAOE,UAAU,EAAMD,cAAc,KAAe0J,IAAYzK,OAAO4K,eAAiB5K,OAAO4K,eAAeJ,EAAUC,GAAcD,EAASK,UAAYJ,GARjepM,EAAQsB,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,EqBpkFC,GrBskFnB2C,EAAmBlC,EAAuBiC,GAE1CE,EAAc5C,EqBvkFC,GrB2kFfoC,GAFe3B,EAAuBmC,GAEzB5C,EqB1kFe,IAEX6F,EAAY,SAAAoG,GAelB,QAfMpG,GAeLf,EAAeK,EAAUE,GrBykFjClE,EAAgBxB,KqBxlFHkG,GAiBboG,EAAA5L,KAAAV,MrB2kFAA,KqBvlFJ6K,QACIiS,aAAc,eACdC,cAAe,gBACfC,YAAa,cACbC,aAAc,eACdC,WAAY,aACZC,iBAAkB,mBAClBC,eAAgB,kBAOhBpd,KAAKkF,eAAiBC,EACtBnF,KAAK8E,UAAYU,EACjBxF,KAAKyE,OAASiB,EACd1F,KAAKkJ,QAAU,KACflJ,KAAKqd,SAAW,KAChBrd,KAAKsd,iBrBw+FT,MArbA1R,GqB3kFiB1F,EAAYoG,GrB6kF7B1K,EqB7kFiBsE,EAAY,OrB8kFzB9E,IAAK,mBACLiE,MqB7kFsB,KrB8kFtBlD,YAAY,IAEZf,IAAK,gBACLiE,MqBhlFmB,IrBilFnBlD,YAAY,KqBplFC+D,EAAY5E,UA+B7Bic,MAAK,WAED,SAAUvd,KAAKsd,cAAc9c,IACnBR,KAAKsd,cAAc7I,cACnBzU,KAAKsd,cAAc7I,aAAaI,eAChC7U,KAAKsd,cAAc7I,aAAaG,SAChCtB,KAAKmI,MAAQzb,KAAKuU,mBArCfrO,EAAY5E,UAyC7BiT,eAAc,WACV,MAAO,IAAIjB,MAAKtT,KAAKsd,cAAc/I,gBAAkB,GAAGhB,UAAYrN,EAAasX,kBA1CpEtX,EAAY5E,UA6C7Bmc,gBAAe,SAACC,GAYZ,MAVAA,GAAeA,MAEf1d,KAAK2d,gBAEL3d,KAAKsd,cAAgBI,EAEhB1d,KAAKkJ,SAASlJ,KAAK4d,qBAExB5d,KAAK6d,cAEE7d,MAzDMkG,EAAY5E,UA6D7Boc,aAAY,WACR,MAAO1d,MAAKsd,eA9DCpX,EAAY5E,UAsEvBwc,SAAQ,SAACtZ,GrBgmFX,MAAOqI,oBAAmBC,MAAM,SAAmBC,GAC/C,OAAU,OAAQA,EAAYC,KAAOD,EAAY7E,MAC7C,IAAK,GACD,IqBjmFRlI,KAAKud,QAAO,CrBkmFAxQ,EAAY7E,KAAO,CACnB,OAIJ,MADA6E,GAAY7E,KAAO,EACZ2E,mBAAmBI,MqBtmFrBjN,KAAK+d,MAAMvZ,GrBwmFpB,KAAK,GACD,MAAOuI,GAAYY,OAAO,SAAUZ,EAAYK,KAEpD,KAAK,GAED,MADAL,GAAY7E,KAAO,EACZ2E,mBAAmBI,MqB3mFrBjN,KAAKyc,UAAUjY,GrB6mFxB,KAAK,GACD,MAAOuI,GAAYY,OAAO,SAAUZ,EAAYK,KAEpD,KAAK,GACL,IAAK,MACD,MAAOL,GAAYe,SAE5B,KAAM9N,OqB/rFIkG,EAAY5E,UAgF7BgT,aAAY,WACR,MAAOtU,MAAKsd,cAAchJ,kBAjFbpO,EAAY5E,UAwF7B0c,gBAAe,SAACnT,GAEZ,MADA7K,MAAKie,gBAAgBje,KAAKsU,eAAe4J,OAAOrT,IACzC7K,MA1FMkG,EAAY5E,UAiG7B2c,gBAAe,SAACpT,GAEZ,MADA7K,MAAKsd,cAAchJ,aAAezJ,EAC3B7K,MAnGMkG,EAAY5E,UA0GvBmb,UAAS,SAACjY,GrBsnFZ,GqB1mFQ+I,GAMA0C,CrBqmFR,OAAOpD,oBAAmBC,MAAM,SAAoBC,GAChD,OAAU,OAAQA,EAAYC,KAAOD,EAAY7E,MAC7C,IAAK,GASD,GARA6E,EAAYC,KAAO,EqBtnF3BxI,EAAUA,MAENA,EAAQqG,QAAQ7K,KAAKie,gBAAgBzZ,EAAQqG,QAEjD7K,KAAK2d,gBAEA3d,KAAKsU,eAAerS,OAAM,CrBynFnB8K,EAAY7E,KAAO,CACnB,OAGJ,KqB7nF+B,IAAI8C,OAAM,uBrB+nF7C,KAAK,GAED,MADA+B,GAAY7E,KAAO,EACZ2E,mBAAmBI,MqB/nFbjN,KAAK8E,UAAU8V,KAAK,8BACjCtG,aAActU,KAAKme,uBACnB1J,cACIC,cAAe,YrBmoFvB,KAAK,GAMD,MqB5oFJnH,GAAQR,EAAAK,KAMR6C,EAAO1C,EAAS0C,OAEpBjQ,KAAKyd,gBAAgBxN,GAChBhF,KAAKjL,KAAK6K,OAAOsS,iBAAkB5P,GrBmoFzBR,EAAYY,OAAO,SqBjoF3BJ,ErBmoFH,KAAK,IAQD,KAPAR,GAAYC,KAAO,GACnBD,EAAYa,GAAKb,EAAY,SAAS,GqBhoF9CA,EAAAa,GAAI5N,KAAK8E,UAAUD,SAASgJ,UAASd,EAAAa,IAErC5N,KAAKoe,QACAnT,KAAKjL,KAAK6K,OAAOuS,eAAcrQ,EAAAa,IrBmoFtBb,EAAYa,EAEtB,KAAK,IACL,IAAK,MACD,MAAOb,GAAYe,SAE5B,KAAM9N,OAAQ,EAAG,OqBlxFPkG,EAAY5E,UAqJvByc,MAAK,SAACvZ,GrBsoFR,GqBxnFQ+I,GAIA0C,CrBqnFR,OAAOpD,oBAAmBC,MAAM,SAAgBC,GAC5C,OAAU,OAAQA,EAAYC,KAAOD,EAAY7E,MAC7C,IAAK,GASD,GARA6E,EAAYC,KAAO,EqBtoF3BxI,EAAUA,MAENA,EAAQqG,QAAQ7K,KAAKie,gBAAgBzZ,EAAQqG,QAEjD7K,KAAK2d,gBAEA3d,KAAKud,QAAO,CrByoFLxQ,EAAY7E,KAAO,CACnB,OAGJ,KqB7oFiB,IAAI8C,OAAM,4BrB+oF/B,KAAK,GACD,GqB9oFHhL,KAAKsU,eAAerS,OAAM,CrB+oFnB8K,EAAY7E,KAAO,CACnB,OAGJ,KqBnpF+B,IAAI8C,OAAM,uBrBqpF7C,KAAK,GAED,MADA+B,GAAY7E,KAAO,GACZ2E,mBAAmBI,MqBrpFbjN,KAAK8E,UAAU+V,IAAI,8BAAgC7a,KAAKsd,cAAc9c,IACvF8T,aAActU,KAAKme,yBrBwpFnB,KAAK,IAMD,MqB/pFJ5Q,GAAQR,EAAAK,KAIR6C,EAAO1C,EAAS0C,OAEpBjQ,KAAKyd,gBAAgBxN,GAChBhF,KAAKjL,KAAK6K,OAAOoS,aAAc1P,GrBwpFrBR,EAAYY,OAAO,SqBtpF3BJ,ErBwpFH,KAAK,IAQD,KAPAR,GAAYC,KAAO,GACnBD,EAAYa,GAAKb,EAAY,SAAS,GqBtpF9CA,EAAAa,GAAI5N,KAAK8E,UAAUD,SAASgJ,UAASd,EAAAa,IAErC5N,KAAKoe,QACAnT,KAAKjL,KAAK6K,OAAOqS,WAAUnQ,EAAAa,IrBypFlBb,EAAYa,EAEtB,KAAK,IACL,IAAK,MACD,MAAOb,GAAYe,SAE5B,KAAM9N,OAAQ,EAAG,OqBl1FPkG,EAAY5E,UA8LvB+c,OAAM,WrB4pFR,GqBtpFQ9Q,ErBupFR,OAAOV,oBAAmBC,MAAM,SAAiBC,GAC7C,OAAU,OAAQA,EAAYC,KAAOD,EAAY7E,MAC7C,IAAK,GAGD,GAFA6E,EAAYC,KAAO,EqB5pFtBhN,KAAKud,QAAO,CrB+pFLxQ,EAAY7E,KAAO,CACnB,OAGJ,KqBnqFiB,IAAI8C,OAAM,4BrBqqF/B,KAAK,GAED,MADA+B,GAAY7E,KAAO,EACZ2E,mBAAmBI,MqBrqFbjN,KAAK8E,UAAS,UAAQ,8BAAgC9E,KAAKsd,cAAc9c,IrBuqF1F,KAAK,GAKD,MqB5qFJ+M,GAAQR,EAAAK,KAEZpN,KAAKoe,QACAnT,KAAKjL,KAAK6K,OAAOkS,cAAexP,GrByqFtBR,EAAYY,OAAO,SqBvqF3BJ,ErByqFH,KAAK,IAQD,KAPAR,GAAYC,KAAO,GACnBD,EAAYa,GAAKb,EAAY,SAAS,GqBvqF9CA,EAAAa,GAAI5N,KAAK8E,UAAUD,SAASgJ,UAASd,EAAAa,IAErC5N,KAAKiL,KAAKjL,KAAK6K,OAAOmS,YAAWjQ,EAAAa,IrB2qFnBb,EAAYa,EAEtB,KAAK,IACL,IAAK,MACD,MAAOb,GAAYe,SAE5B,KAAM9N,OAAQ,EAAG,OqBh4FPkG,EAAY5E,UA2N7B8c,MAAK,WAID,MAHApe,MAAK2d,gBACD3d,KAAKud,SAAWvd,KAAKkJ,SAASlJ,KAAKkJ,QAAQyT,aAAaD,QAAS1c,KAAKsd,cAAc7I,aAAaG,UACrG5U,KAAKsd,iBACEtd,MA/NMkG,EAAY5E,UAwO7Bgd,iBAAgB,SAACC,EAAU1T,GrB+qFvB,GAAIE,GAAQ/K,IqB7qFZA,MAAK4K,IAAI5K,KAAK6K,OAAOsS,iBAAkBnd,KAAK6K,OAAOoS,cAAe,WAE9DlS,EAAKtG,OAAOqF,QAAQyU,EAAUxT,EAAK2S,kBAIvC1d,KAAK4K,GAAG5K,KAAK6K,OAAOqS,WAAY,WAE5BnS,EAAKqT,QACAH,gBAAgBpT,GAChBiT,YAIT,IAAIU,GAAyBxe,KAAKyE,OAAO2F,QAAQmU,EAEjD,IAAIC,EACA,IACIxe,KAAKyd,gBAAgBe,GACvB,MAAOzQ,QAET/N,MAAKie,gBAAgBpT,EAGzB,OAAO7K,OAlQMkG,EAAY5E,UAsQ7B6c,qBAAoB,WrB2qFhB,GAAIjT,GAASlL,IqBzqFb,OAAOA,MAAKsU,eAAerD,IAAI,SAACvG,GAC5B,MAAOQ,GAAKpG,UAAUoS,UAAUxM,MAzQvBxE,EAAY5E,UA8Q7Buc,YAAW,WrB2qFP,GAAInS,GAAS1L,IqBvqFb,IAFAA,KAAK2d,iBAEA3d,KAAKud,QAAS,KAAM,IAAIvS,OAAM,4BAUnC,OARAvI,GAAAoF,KAAK,SAACK,GAEF,MAAIwD,GAAK6R,QAAgBrV,QAEzBwD,GAAKqS,SAEN7X,EAAa0V,cAAe5b,KAAKqd,UAE7Brd,MA5RMkG,EAAY5E,UAgS7Bqc,cAAa,WAIT,MAFAlb,GAAAwF,YAAYjI,KAAKqd,UAEVrd,MApSMkG,EAAY5E,UAwS7Bmd,SAAQ,SAACxQ,GAEL,IAAKjO,KAAKud,QAAS,KAAM,IAAIvS,OAAM,4BAEnC,IAAIhL,KAAKsd,cAAc7I,aAAaU,cAAe,CAE/C,GAAI/P,GAASpF,KAAKkF,cAElB+I,GAAU7I,EAAOkX,WAAWoC,QAAQzQ,EAASjO,KAAKsd,cAAc7I,aAAaU,eACzEwJ,YAAY,EACZC,YAAa,SACbC,UAAW,IACXnQ,KAAM,QAKd,MAAOT,IAzTM/H,EAAY5E,UA6T7Bwd,QAAO,SAAC7Q,GAIJ,MAFAjO,MAAKiL,KAAKjL,KAAK6K,OAAOiS,aAAc9c,KAAKye,SAASxQ,IAE3CjO,MAjUMkG,EAAY5E,UAqU7Bsc,mBAAkB,WAEd,IAAK5d,KAAKud,QAAS,KAAM,IAAIvS,OAAM,4BAEnC,IAAI5F,GAASpF,KAAKkF,cAelB,OAbAlF,MAAKkJ,QAAU9D,EAAOgJ,MAClB2Q,KAAK,EACLC,cAAehf,KAAKsd,cAAc7I,aAAaI,gBAGnD7U,KAAKkJ,QAAQsT,QAEbxc,KAAKkJ,QAAQuT,WACTC,QAAS1c,KAAKsd,cAAc7I,aAAaG,QACzC3G,QAASjO,KAAK8e,QAAQG,KAAKjf,MAC3Bkf,QAAS,eAGNlf,MAxVMkG,GrBigGlBlD,EAAiB,WAEpBtD,GAAQ,WqBngGawG,ErBogGrBvG,EAAOD,QAAUA,EAAQ,YAInB,SAASC,EAAQD,IsB5gGvB,SAAAyf,IAUA,SAAAA,GACA,YAwBA,SAAAC,GAAAC,EAAAC,EAAAC,EAAAC,GAEA,GAAAC,GAAApe,OAAA0K,QAAAuT,GAAAI,GAAApe,WACAqe,EAAA,GAAAC,GAAAJ,MAMA,OAFAC,GAAAI,QAAAC,EAAAT,EAAAE,EAAAI,GAEAF,EAcA,QAAAM,GAAAjY,EAAA/G,EAAAuG,GACA,IACA,OAAc0Y,KAAA,SAAA1Y,IAAAQ,EAAApH,KAAAK,EAAAuG,IACT,MAAA2Y,GACL,OAAcD,KAAA,QAAA1Y,IAAA2Y,IAiBd,QAAAP,MACA,QAAAQ,MACA,QAAAC,MASA,QAAAC,GAAA9e,IACA,OAAA,QAAA,UAAAoF,QAAA,SAAA6H,GACAjN,EAAAiN,GAAA,SAAAjH,GACA,MAAAtH,MAAA6f,QAAAtR,EAAAjH,MAkCA,QAAA+Y,GAAA/Y,GACAtH,KAAAsH,IAAAA,EAGA,QAAAgZ,GAAAb,GAGA,QAAAc,GAAAhS,EAAAjH,GACA,GAAAiE,GAAAkU,EAAAlR,GAAAjH,GACAjC,EAAAkG,EAAAlG,KACA,OAAAA,aAAAgb,GACA1X,QAAAC,QAAAvD,EAAAiC,KAAAkZ,KAAAC,EAAAC,GACA/X,QAAAC,QAAAvD,GAAAmb,KAAA,SAAAG,GAiBA,MADApV,GAAAlG,MAAAsb,EACApV,IAaA,QAAAqV,GAAArS,EAAAjH,GACA,QAAAuZ,KACA,MAAAN,GAAAhS,EAAAjH,GAGA,MAAAwZ,GAaAA,EAAAA,EAAAN,KACAK,EAGAA,GACA,GAAAlY,SAAA,SAAAC,GACAA,EAAAiY,OAjCA,gBAAAtY,UAAAA,QAAAwY,SACAR,EAAAhY,QAAAwY,OAAA9B,KAAAsB,GAGA,IAGAO,GAHAL,EAAAF,EAAAtB,KAAAQ,EAAA,QACAiB,EAAAH,EAAAtB,KAAAQ,EAAA,QACAc,GAAAtB,KAAAQ,EAAA,SAiCAzf,MAAA6f,QAAAe,EAoBA,QAAAd,GAAAT,EAAAE,EAAAI,GACA,GAAA1H,GAAA+I,CAEA,OAAA,UAAAzS,EAAAjH,GACA,GAAA2Q,IAAAgJ,EACA,KAAA,IAAAjW,OAAA,+BAGA,IAAAiN,IAAAiJ,EAAA,CACA,GAAA,UAAA3S,EACA,KAAAjH,EAKA,OAAA6Z,KAGA,OAAA,CACA,GAAAC,GAAAzB,EAAAyB,QACA,IAAAA,EAAA,CACA,GAAA,WAAA7S,GACA,UAAAA,GAAA6S,EAAAC,SAAA9S,KAAAxO,EAAA,CAGA4f,EAAAyB,SAAA,IAIA,IAAAE,GAAAF,EAAAC,SAAA,SACA,IAAAC,EAAA,CACA,GAAAC,GAAAxB,EAAAuB,EAAAF,EAAAC,SAAA/Z,EACA,IAAA,UAAAia,EAAAvB,KAAA,CAGAzR,EAAA,QACAjH,EAAAia,EAAAja,GACA,WAIA,GAAA,WAAAiH,EAGA,SAIA,GAAAgT,GAAAxB,EACAqB,EAAAC,SAAA9S,GACA6S,EAAAC,SACA/Z,EAGA,IAAA,UAAAia,EAAAvB,KAAA,CACAL,EAAAyB,SAAA,KAIA7S,EAAA,QACAjH,EAAAia,EAAAja,GACA,UAMAiH,EAAA,OACAjH,EAAAvH,CAEA,IAAAyhB,GAAAD,EAAAja,GACA,KAAAka,EAAAC,KAKA,MADAxJ,GAAAyJ,EACAF,CAJA7B,GAAAyB,EAAAO,YAAAH,EAAAnc,MACAsa,EAAAzX,KAAAkZ,EAAAQ,QAMAjC,EAAAyB,SAAA,KAGA,GAAA,SAAA7S,EACA0J,IAAAyJ,EACA/B,EAAAvS,KAAA9F,EAEAqY,EAAAvS,KAAArN,MAGS,IAAA,UAAAwO,EAAA,CACT,GAAA0J,IAAA+I,EAEA,KADA/I,GAAAiJ,EACA5Z,CAGAqY,GAAAkC,kBAAAva,KAGAiH,EAAA,OACAjH,EAAAvH,OAGS,WAAAwO,GACToR,EAAAhS,OAAA,SAAArG,EAGA2Q,GAAAgJ,CAEA,IAAAM,GAAAxB,EAAAV,EAAAE,EAAAI,EACA,IAAA,WAAA4B,EAAAvB,KAAA,CAGA/H,EAAA0H,EAAA8B,KACAP,EACAQ,CAEA,IAAAF,IACAnc,MAAAkc,EAAAja,IACAma,KAAA9B,EAAA8B,KAGA,IAAAF,EAAAja,MAAAwa,EAOA,MAAAN,EANA7B,GAAAyB,UAAA,SAAA7S,IAGAjH,EAAAvH,OAMS,UAAAwhB,EAAAvB,OACT/H,EAAAiJ,EAGA3S,EAAA,QACAjH,EAAAia,EAAAja,OAkBA,QAAAya,GAAAC,GACA,GAAAC,IAAiBC,OAAAF,EAAA,GAEjB,KAAAA,KACAC,EAAAE,SAAAH,EAAA,IAGA,IAAAA,KACAC,EAAAG,WAAAJ,EAAA,GACAC,EAAAI,SAAAL,EAAA,IAGAhiB,KAAAsiB,WAAAvb,KAAAkb,GAGA,QAAAM,GAAAN,GACA,GAAAV,GAAAU,EAAAO,cACAjB,GAAAvB,KAAA,eACAuB,GAAAja,IACA2a,EAAAO,WAAAjB,EAGA,QAAA3B,GAAAJ,GAIAxf,KAAAsiB,aAAwBJ,OAAA,SACxB1C,EAAA9Y,QAAAqb,EAAA/hB,MACAA,KAAAoe,OAAA,GA8BA,QAAAqE,GAAAC,GACA,GAAAA,EAAA,CACA,GAAAC,GAAAD,EAAAE,EACA,IAAAD,EACA,MAAAA,GAAAjiB,KAAAgiB,EAGA,IAAA,kBAAAA,GAAAxa,KACA,MAAAwa,EAGA,KAAAG,MAAAH,EAAAzgB,QAAA,CACA,GAAAD,GAAA,GAAAkG,EAAA,QAAAA,KACA,OAAAlG,EAAA0gB,EAAAzgB,QACA,GAAA6gB,EAAApiB,KAAAgiB,EAAA1gB,GAGA,MAFAkG,GAAA7C,MAAAqd,EAAA1gB,GACAkG,EAAAuZ,MAAA,EACAvZ,CAOA,OAHAA,GAAA7C,MAAAtF,EACAmI,EAAAuZ,MAAA,EAEAvZ,EAGA,OAAAA,GAAAA,KAAAA,GAKA,OAAYA,KAAAiZ,GAIZ,QAAAA,KACA,OAAY9b,MAAAtF,EAAA0hB,MAAA,GAvcZ,GACA1hB,GADA+iB,EAAAzhB,OAAAC,UAAAC,eAEAqhB,EACA,kBAAAG,SAAAA,OAAA1B,UAAA,aAEA2B,EAAA,gBAAArjB,GACAsjB,EAAA9D,EAAAtS,kBACA,IAAAoW,EAQA,YAPAD,IAGArjB,EAAAD,QAAAujB,GASAA,GAAA9D,EAAAtS,mBAAAmW,EAAArjB,EAAAD,WAaAujB,EAAA7D,KAAAA,CAoBA,IAAA4B,GAAA,iBACAU,EAAA,iBACAT,EAAA,YACAC,EAAA,YAIAY,KAUAoB,EAAA/C,EAAA7e,UAAAoe,EAAApe,SACA4e,GAAA5e,UAAA4hB,EAAAlX,YAAAmU,EACAA,EAAAnU,YAAAkU,EACAA,EAAAiD,YAAA,oBAYAF,EAAAG,oBAAA,SAAAC,GACA,GAAAC,GAAA,kBAAAD,IAAAA,EAAArX,WACA,OAAAsX,GACAA,IAAApD,GAGA,uBAAAoD,EAAAH,aAAAG,EAAA7T,OACA,GAGAwT,EAAAM,KAAA,SAAAF,GAOA,MANAhiB,QAAA4K,eACA5K,OAAA4K,eAAAoX,EAAAlD,GAEAkD,EAAAnX,UAAAiU,EAEAkD,EAAA/hB,UAAAD,OAAA0K,OAAAmX,GACAG,GAQAJ,EAAAhW,MAAA,SAAA3F,GACA,MAAA,IAAA+Y,GAAA/Y,IA8EA8Y,EAAAE,EAAAhf,WAKA2hB,EAAAnW,MAAA,SAAAuS,EAAAC,EAAAC,EAAAC,GACA,GAAAgE,GAAA,GAAAlD,GACAlB,EAAAC,EAAAC,EAAAC,EAAAC,GAGA,OAAAyD,GAAAG,oBAAA9D,GACAkE,EACAA,EAAAtb,OAAAsY,KAAA,SAAAjV,GACA,MAAAA,GAAAkW,KAAAlW,EAAAlG,MAAAme,EAAAtb,UAoJAkY,EAAA8C,GAEAA,EAAAN,GAAA,WACA,MAAA5iB,OAGAkjB,EAAAtS,SAAA,WACA,MAAA,sBAkCAqS,EAAAxc,KAAA,SAAAgd,GACA,GAAAhd,KACA,KAAA,GAAArF,KAAAqiB,GACAhd,EAAAM,KAAA3F,EAMA,OAJAqF,GAAA+R,UAIA,QAAAtQ,KACA,KAAAzB,EAAAxE,QAAA,CACA,GAAAb,GAAAqF,EAAAsK,KACA,IAAA3P,IAAAqiB,GAGA,MAFAvb,GAAA7C,MAAAjE,EACA8G,EAAAuZ,MAAA,EACAvZ,EAQA,MADAA,GAAAuZ,MAAA,EACAvZ,IAsCA+a,EAAAR,OAAAA,EAMA7C,EAAAte,WACA0K,YAAA4T,EAEAxB,MAAA,SAAAsF,GASA,GARA1jB,KAAAgN,KAAA,EACAhN,KAAAkI,KAAA,EACAlI,KAAAoN,KAAArN,EACAC,KAAAyhB,MAAA,EACAzhB,KAAAohB,SAAA,KAEAphB,KAAAsiB,WAAA5b,QAAA6b,IAEAmB,EACA,IAAA,GAAAjU,KAAAzP,MAEA,MAAAyP,EAAAkU,OAAA,IACAb,EAAApiB,KAAAV,KAAAyP,KACAoT,OAAApT,EAAAmU,MAAA,MACA5jB,KAAAyP,GAAA1P,IAMA+N,KAAA,WACA9N,KAAAyhB,MAAA,CAEA,IAAAoC,GAAA7jB,KAAAsiB,WAAA,GACAwB,EAAAD,EAAArB,UACA,IAAA,UAAAsB,EAAA9D,KACA,KAAA8D,GAAAxc,GAGA,OAAAtH,MAAA+jB,MAGAlC,kBAAA,SAAAmC,GAMA,QAAAC,GAAAC,EAAAC,GAIA,MAHA5C,GAAAvB,KAAA,QACAuB,EAAAja,IAAA0c,EACArE,EAAAzX,KAAAgc,IACAC,EATA,GAAAnkB,KAAAyhB,KACA,KAAAuC,EAWA,KAAA,GARArE,GAAA3f,KAQAgC,EAAAhC,KAAAsiB,WAAArgB,OAAA,EAA8CD,GAAA,IAAQA,EAAA,CACtD,GAAAigB,GAAAjiB,KAAAsiB,WAAAtgB,GACAuf,EAAAU,EAAAO,UAEA,IAAA,SAAAP,EAAAC,OAIA,MAAA+B,GAAA,MAGA,IAAAhC,EAAAC,QAAAliB,KAAAgN,KAAA,CACA,GAAAoX,GAAAtB,EAAApiB,KAAAuhB,EAAA,YACAoC,EAAAvB,EAAApiB,KAAAuhB,EAAA,aAEA,IAAAmC,GAAAC,EAAA,CACA,GAAArkB,KAAAgN,KAAAiV,EAAAE,SACA,MAAA8B,GAAAhC,EAAAE,UAAA,EACa,IAAAniB,KAAAgN,KAAAiV,EAAAG,WACb,MAAA6B,GAAAhC,EAAAG,gBAGW,IAAAgC,GACX,GAAApkB,KAAAgN,KAAAiV,EAAAE,SACA,MAAA8B,GAAAhC,EAAAE,UAAA,OAGW,CAAA,IAAAkC,EAMX,KAAA,IAAArZ,OAAA,yCALA,IAAAhL,KAAAgN,KAAAiV,EAAAG,WACA,MAAA6B,GAAAhC,EAAAG,gBAUAzU,OAAA,SAAAqS,EAAA1Y,GACA,IAAA,GAAAtF,GAAAhC,KAAAsiB,WAAArgB,OAAA,EAA8CD,GAAA,IAAQA,EAAA,CACtD,GAAAigB,GAAAjiB,KAAAsiB,WAAAtgB,EACA,IAAAigB,EAAAC,QAAAliB,KAAAgN,MACA8V,EAAApiB,KAAAuhB,EAAA,eACAjiB,KAAAgN,KAAAiV,EAAAG,WAAA,CACA,GAAAkC,GAAArC,CACA,QAIAqC,IACA,UAAAtE,GACA,aAAAA,IACAsE,EAAApC,QAAA5a,GACAA,GAAAgd,EAAAlC,aAGAkC,EAAA,KAGA,IAAA/C,GAAA+C,EAAAA,EAAA9B,aAUA,OATAjB,GAAAvB,KAAAA,EACAuB,EAAAja,IAAAA,EAEAgd,EACAtkB,KAAAkI,KAAAoc,EAAAlC,WAEApiB,KAAAukB,SAAAhD,GAGAO,GAGAyC,SAAA,SAAAhD,EAAAc,GACA,GAAA,UAAAd,EAAAvB,KACA,KAAAuB,GAAAja,GAGA,WAAAia,EAAAvB,MACA,aAAAuB,EAAAvB,KACAhgB,KAAAkI,KAAAqZ,EAAAja,IACO,WAAAia,EAAAvB,MACPhgB,KAAA+jB,KAAAxC,EAAAja,IACAtH,KAAAkI,KAAA,OACO,WAAAqZ,EAAAvB,MAAAqC,IACPriB,KAAAkI,KAAAma,IAIAmC,OAAA,SAAApC,GACA,IAAA,GAAApgB,GAAAhC,KAAAsiB,WAAArgB,OAAA,EAA8CD,GAAA,IAAQA,EAAA,CACtD,GAAAigB,GAAAjiB,KAAAsiB,WAAAtgB,EACA,IAAAigB,EAAAG,aAAAA,EAGA,MAFApiB,MAAAukB,SAAAtC,EAAAO,WAAAP,EAAAI,UACAE,EAAAN,GACAH,IAKA2C,QAAA,SAAAvC,GACA,IAAA,GAAAlgB,GAAAhC,KAAAsiB,WAAArgB,OAAA,EAA8CD,GAAA,IAAQA,EAAA,CACtD,GAAAigB,GAAAjiB,KAAAsiB,WAAAtgB,EACA,IAAAigB,EAAAC,SAAAA,EAAA,CACA,GAAAX,GAAAU,EAAAO,UACA,IAAA,UAAAjB,EAAAvB,KAAA,CACA,GAAA0E,GAAAnD,EAAAja,GACAib,GAAAN,GAEA,MAAAyC,IAMA,KAAA,IAAA1Z,OAAA,0BAGA2Z,cAAA,SAAAjC,EAAAf,EAAAC,GAOA,MANA5hB,MAAAohB,UACAC,SAAAoB,EAAAC,GACAf,WAAAA,EACAC,QAAAA,GAGAE,KAOA,gBAAA3C,GAAAA,EACA,gBAAA1W,QAAAA,OACA,gBAAA8W,MAAAA,KAAAvf,QtBihG6BU,KAAKhB,EAAU,WAAa,MAAOM","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 diff --git a/demo/apiKey.html b/demo/apiKey.html index 367bef27..6901c23c 100644 --- a/demo/apiKey.html +++ b/demo/apiKey.html @@ -88,18 +88,18 @@

function app() { - var rcsdk = new RingCentral({ - server: localStorage.getItem('ringcentral-demo-server') || RingCentral.server.sandbox, + var rcsdk = new RingCentral.SDK({ + server: localStorage.getItem('ringcentral-demo-server') || RingCentral.SDK.server.sandbox, appKey: localStorage.getItem('ringcentral-demo-appKey'), appSecret: localStorage.getItem('ringcentral-demo-appSecret') }), - platform = rcsdk.getPlatform(); + platform = rcsdk.platform(); - isTokenValid.style.display = platform.isAccessTokenValid() ? '' : 'none'; + isTokenValid.style.display = platform.auth().accessTokenValid() ? '' : 'none'; - appKeyField.value = platform.getAppCredentials().appKey; - appSecretField.value = platform.getAppCredentials().appSecret; - serverField.value = platform.getServer(); + appKeyField.value = platform._appKey; + appSecretField.value = platform._appSecret; + serverField.value = platform._server; } diff --git a/demo/core.html b/demo/core.html index f6d67804..a0d69d4d 100644 --- a/demo/core.html +++ b/demo/core.html @@ -22,8 +22,8 @@ var appKey = localStorage.getItem('ringcentral-demo-appKey'), appSecret = localStorage.getItem('ringcentral-demo-appSecret'), server = localStorage.getItem('ringcentral-demo-server'), - rcsdk = new RingCentral.sdk.SDK({server: server, appKey: appKey, appSecret: appSecret}), - platform = rcsdk.getPlatform(); + rcsdk = new RingCentral.SDK({server: server, appKey: appKey, appSecret: appSecret}), + platform = rcsdk.platform(); function showExtension() { @@ -38,7 +38,7 @@ platform.get('/account/~/extension/~') .then(function(ajax) { - cb(ajax.getJson()); + cb(ajax.json()); }) .catch(function(e) { console.error(e); @@ -50,7 +50,7 @@ platform.get('/account/~/extension/~/presence', {query: {detailedTelephonyState: true}}) .then(function(ajax) { - cb(ajax.getJson()); + cb(ajax.json()); }).catch(function(e) { console.error(e); }); @@ -61,7 +61,7 @@ platform.get('/account/~/extension/~/call-log') .then(function(data) { - cb(data.getJson().records); + cb(data.json().records); }) .catch(function(e) { console.error(e); @@ -71,7 +71,7 @@ function getPresenceSubscription(event, cb) { - var subscription = rcsdk.getSubscription(); + var subscription = rcsdk.createSubscription(); subscription.on(subscription.events.notification, function(msg) { cb(msg.body); @@ -137,7 +137,7 @@ document.getElementById('login-submit').addEventListener('click', function() { platform - .authorize({ + .login({ username: document.getElementById('login-username').value, extension: document.getElementById('login-extension').value, password: document.getElementById('login-password').value @@ -167,7 +167,13 @@ document.getElementById('login-password').value = localStorage.getItem('ringcentral-demo-login-password'); document.getElementById('login-extension').value = localStorage.getItem('ringcentral-demo-login-extension'); - platform.isAuthorized().then(showExtension).catch(showLogin); + platform.loggedIn().then(function(res){ + if (res) { + showExtension(); + } else { + showLogin(); + } + }); }); diff --git a/demo/doubleSubscription.html b/demo/doubleSubscription.html new file mode 100644 index 00000000..77485c75 --- /dev/null +++ b/demo/doubleSubscription.html @@ -0,0 +1,198 @@ + + + + Core — RingCentral™ Platform + + + + + + + + + + + + + + + + +
+ +

+ +

+ +
+ +
+ +
+ + +
+ +
+
+ +
+ + +
+ +
+
+ +
+ + +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+

+ +

+
+
+
+
+ +
+ +

+ © 1999 – RingCentral™, Inc. All rights reserved. + +

+ +
+ + + \ No newline at end of file diff --git a/demo/requirejs.html b/demo/requirejs.html index e44748e2..bff58839 100644 --- a/demo/requirejs.html +++ b/demo/requirejs.html @@ -34,7 +34,9 @@

RingCentral JS SDK Properties

- + diff --git a/utils/test-polyfills.html b/utils/test-polyfills.html index 62f87c0f..e38dc565 100644 --- a/utils/test-polyfills.html +++ b/utils/test-polyfills.html @@ -30,7 +30,7 @@ - + diff --git a/utils/test-requirejs.html b/utils/test-requirejs.html index 9deff3d4..84e3e152 100644 --- a/utils/test-requirejs.html +++ b/utils/test-requirejs.html @@ -15,7 +15,7 @@ require.config({ paths: { 'ringcentral': '../build/ringcentral', - 'ringcentral-tests': '../build/tests/specs', + 'ringcentral-tests': '../build/tests/ringcentral-tests', 'pubnub': '../bower_components/pubnub/web/pubnub', 'fetch': '../bower_components/fetch/fetch', 'es6-promise': '../bower_components/es6-promise/promise', diff --git a/utils/wrap-tests.js b/utils/wrap-tests.js deleted file mode 100644 index f5e84a2c..00000000 --- a/utils/wrap-tests.js +++ /dev/null @@ -1,21 +0,0 @@ -(function(r, factory) { - - if (typeof define === 'function' && define.amd) { - - define(['ringcentral', 'mocha', 'chai', 'sinon', 'sinon-chai'], function(SDK, mocha, chai, sinon, sinonChai) { - mocha.setup('bdd'); - factory({sdk: SDK}, r.Promise, mocha, chai, sinon, sinonChai); - }); - - } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') { - - var rq = require; - factory({sdk: rq('../ringcentral')}, rq('es6-promise').Promise, rq('mocha'), rq('chai'), rq('sinon'), rq('sinon-chai')); - - } else { - - factory(r.RingCentral, r.Promise, r.mocha, r.chai, r.sinon); - - } - -}(this, function(RingCentral, Promise, mocha, chai, sinon, sinonChai) {/*{%= body %}*/})); \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 00000000..240e0dfa --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,87 @@ +(function() { + + var webpack = require('webpack'), + externals = [ + {'resumer': createExternal('resumer')}, + {'mocha': createExternal('mocha')}, + {'chai': createExternal('chai', 'chai', 'chai')}, + {'sinon': createExternal('sinon', 'sinon', 'sinon')}, + {'sinon-chai': createExternal('sinon-chai', 'sinon-chai')} + ], + bundleExternals = [ + {'pubnub': createExternal('pubnub', 'pubnub')}, + {'es6-promise': createExternal('es6-promise')}, + {'node-fetch': createExternal('node-fetch')} + ]; + + function createExternal(cjs, amd, root) { + var ext = {}; + if (cjs) ext['commonjs'] = cjs; + if (cjs) ext['commonjs2'] = cjs; + if (amd) ext['amd'] = amd; + if (root) ext['root'] = root; + return ext; + } + + function extendConfig(conf) { + + var config = { + context: __dirname, + debug: true, + devtool: '#source-map', + output: { + library: ['RingCentral', 'SDK'], + libraryTarget: 'umd', + path: __dirname + '/build', + publicPath: '/build/', + sourcePrefix: '', + filename: "[name].js", + chunkFilename: "[id].chunk.js" + }, + resolve: { + extensions: ['', '.js'], + alias: { + 'pubnub': require.resolve('./bower_components/pubnub/web/pubnub.js'), + 'node-fetch': require.resolve('./bower_components/fetch/fetch.js'), + 'es6-promise': require.resolve('./bower_components/es6-promise/promise.js') + } + }, + module: { + loaders: [ + {test: /\.js$/, loaders: ['babel-loader?cacheDirectory'], exclude: /node_modules|bower_components/} //TODO: &optional[]=runtime + ] + }, + node: { + Buffer: false, + process: false, + timers: false + } + }; + + Object.keys(conf).forEach(function(key) { + config[key] = conf[key]; + }); + + return config; + + } + + module.exports = [ + extendConfig({ + entry: {'ringcentral': ['./src/SDK.js']}, + externals: externals.concat(bundleExternals) + }), + extendConfig({ + entry: {'ringcentral-bundle': ['./src/SDK.js']}, + externals: externals + }), + extendConfig({ + entry: {'tests/ringcentral-tests': ['./src/test/glob.js']}, + externals: externals.concat(bundleExternals).concat([ + {'../SDK': createExternal('../ringcentral', '../ringcentral', ['RingCentral', 'SDK'])}, + {'./SDK': createExternal('../ringcentral', '../ringcentral', ['RingCentral', 'SDK'])} + ]) + }) + ]; + +})(); \ No newline at end of file