{"version":3,"file":"connectycube.min.js","mappings":"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","sources":["webpack://ConnectyCube/webpack/universalModuleDefinition","webpack://ConnectyCube/./node_modules/@xmpp/base64/browser.js","webpack://ConnectyCube/./node_modules/@xmpp/client-core/index.js","webpack://ConnectyCube/./node_modules/@xmpp/client-core/lib/Client.js","webpack://ConnectyCube/./node_modules/@xmpp/connection/index.js","webpack://ConnectyCube/./node_modules/@xmpp/connection/lib/StreamError.js","webpack://ConnectyCube/./node_modules/@xmpp/connection/lib/util.js","webpack://ConnectyCube/./node_modules/@xmpp/error/index.js","webpack://ConnectyCube/./node_modules/@xmpp/events/index.js","webpack://ConnectyCube/./node_modules/@xmpp/events/lib/Deferred.js","webpack://ConnectyCube/./node_modules/@xmpp/events/lib/TimeoutError.js","webpack://ConnectyCube/./node_modules/@xmpp/events/lib/delay.js","webpack://ConnectyCube/./node_modules/@xmpp/events/lib/promise.js","webpack://ConnectyCube/./node_modules/@xmpp/events/lib/timeout.js","webpack://ConnectyCube/./node_modules/@xmpp/id/index.js","webpack://ConnectyCube/./node_modules/@xmpp/iq/callee.js","webpack://ConnectyCube/./node_modules/@xmpp/iq/caller.js","webpack://ConnectyCube/./node_modules/@xmpp/jid/index.js","webpack://ConnectyCube/./node_modules/@xmpp/jid/lib/JID.js","webpack://ConnectyCube/./node_modules/@xmpp/jid/lib/escaping.js","webpack://ConnectyCube/./node_modules/@xmpp/jid/lib/parse.js","webpack://ConnectyCube/./node_modules/@xmpp/middleware/index.js","webpack://ConnectyCube/./node_modules/@xmpp/middleware/lib/Context.js","webpack://ConnectyCube/./node_modules/@xmpp/middleware/lib/IncomingContext.js","webpack://ConnectyCube/./node_modules/@xmpp/middleware/lib/OutgoingContext.js","webpack://ConnectyCube/./node_modules/@xmpp/middleware/lib/StanzaError.js","webpack://ConnectyCube/./node_modules/@xmpp/reconnect/index.js","webpack://ConnectyCube/./node_modules/@xmpp/resolve/index.js","webpack://ConnectyCube/./node_modules/@xmpp/resolve/lib/alt-connections.js","webpack://ConnectyCube/./node_modules/@xmpp/resolve/lib/http.js","webpack://ConnectyCube/./node_modules/@xmpp/resolve/resolve.js","webpack://ConnectyCube/./node_modules/@xmpp/resource-binding/index.js","webpack://ConnectyCube/./node_modules/@xmpp/sasl-anonymous/index.js","webpack://ConnectyCube/./node_modules/@xmpp/sasl-plain/index.js","webpack://ConnectyCube/./node_modules/@xmpp/sasl/index.js","webpack://ConnectyCube/./node_modules/@xmpp/sasl/lib/SASLError.js","webpack://ConnectyCube/./node_modules/@xmpp/session-establishment/index.js","webpack://ConnectyCube/./node_modules/@xmpp/stream-features/index.js","webpack://ConnectyCube/./node_modules/@xmpp/stream-features/route.js","webpack://ConnectyCube/./node_modules/@xmpp/websocket/index.js","webpack://ConnectyCube/./node_modules/@xmpp/websocket/lib/Connection.js","webpack://ConnectyCube/./node_modules/@xmpp/websocket/lib/FramedParser.js","webpack://ConnectyCube/./node_modules/@xmpp/websocket/lib/Socket.js","webpack://ConnectyCube/./node_modules/@xmpp/xml/index.js","webpack://ConnectyCube/./node_modules/@xmpp/xml/lib/Parser.js","webpack://ConnectyCube/./node_modules/@xmpp/xml/lib/XMLError.js","webpack://ConnectyCube/./node_modules/@xmpp/xml/lib/parse.js","webpack://ConnectyCube/./lib/cubeAddressBook.js","webpack://ConnectyCube/./lib/cubeAuth.js","webpack://ConnectyCube/./lib/cubeConfig.js","webpack://ConnectyCube/./lib/cubeData.js","webpack://ConnectyCube/./lib/cubeDependencies.js","webpack://ConnectyCube/./lib/cubeInternalUtils.js","webpack://ConnectyCube/./lib/cubeMain.js","webpack://ConnectyCube/./lib/cubeMeeting.js","webpack://ConnectyCube/./lib/cubeProxy.js","webpack://ConnectyCube/./lib/cubePushNotifications.js","webpack://ConnectyCube/./lib/cubeStorage.js","webpack://ConnectyCube/./lib/cubeUsers.js","webpack://ConnectyCube/./lib/cubeWhiteboard.js","webpack://ConnectyCube/./lib/messaging/cubeChat.js","webpack://ConnectyCube/./lib/messaging/cubeChatHelpers.js","webpack://ConnectyCube/./lib/messaging/cubeChatInternalUtils.js","webpack://ConnectyCube/./lib/messaging/cubeContactList.js","webpack://ConnectyCube/./lib/messaging/cubeDialog.js","webpack://ConnectyCube/./lib/messaging/cubeMessage.js","webpack://ConnectyCube/./lib/messaging/cubeMultiUserChat.js","webpack://ConnectyCube/./lib/messaging/cubePrivacyList.js","webpack://ConnectyCube/./lib/messaging/cubeStreamManagement.js","webpack://ConnectyCube/./lib/messaging/xmpp.js","webpack://ConnectyCube/./lib/videocalling/cubeRTCPeerConnection.js","webpack://ConnectyCube/./lib/videocalling/cubeWebRTCClient.js","webpack://ConnectyCube/./lib/videocalling/cubeWebRTCConstants.js","webpack://ConnectyCube/./lib/videocalling/cubeWebRTCHelpers.js","webpack://ConnectyCube/./lib/videocalling/cubeWebRTCSession.js","webpack://ConnectyCube/./lib/videocalling/cubeWebRTCSignalingProcessor.js","webpack://ConnectyCube/./lib/videocalling/cubeWebRTCSignalingProvider.js","webpack://ConnectyCube/./lib/videocalling_conference/JanusVideoConferencingWrapper.js","webpack://ConnectyCube/./lib/videocalling_conference/cubeConferenceClient.js","webpack://ConnectyCube/./lib/videocalling_conference/cubeConferenceConstants.js","webpack://ConnectyCube/./lib/videocalling_conference/cubeConferenceSession.js","webpack://ConnectyCube/./lib/videocalling_conference/janus.js","webpack://ConnectyCube/./node_modules/crypto-js/core.js","webpack://ConnectyCube/./node_modules/crypto-js/hmac-sha1.js","webpack://ConnectyCube/./node_modules/crypto-js/hmac-sha256.js","webpack://ConnectyCube/./node_modules/crypto-js/hmac.js","webpack://ConnectyCube/./node_modules/crypto-js/sha1.js","webpack://ConnectyCube/./node_modules/crypto-js/sha256.js","webpack://ConnectyCube/./node_modules/events/events.js","webpack://ConnectyCube/./node_modules/fbemitter/index.js","webpack://ConnectyCube/./node_modules/fbemitter/lib/BaseEventEmitter.js","webpack://ConnectyCube/./node_modules/fbemitter/lib/EmitterSubscription.js","webpack://ConnectyCube/./node_modules/fbemitter/lib/EventSubscription.js","webpack://ConnectyCube/./node_modules/fbemitter/lib/EventSubscriptionVendor.js","webpack://ConnectyCube/./node_modules/fbjs/lib/emptyFunction.js","webpack://ConnectyCube/./node_modules/fbjs/lib/invariant.js","webpack://ConnectyCube/./node_modules/koa-compose/index.js","webpack://ConnectyCube/./node_modules/sasl-anonymous/lib/mechanism.js","webpack://ConnectyCube/./node_modules/sasl-anonymous/main.js","webpack://ConnectyCube/./node_modules/sasl-plain/lib/mechanism.js","webpack://ConnectyCube/./node_modules/sasl-plain/main.js","webpack://ConnectyCube/./node_modules/saslmechanisms/lib/factory.js","webpack://ConnectyCube/./node_modules/saslmechanisms/main.js","webpack://ConnectyCube/external umd \"form-data\"","webpack://ConnectyCube/external umd \"node-fetch\"","webpack://ConnectyCube/./node_modules/@babel/runtime/helpers/arrayLikeToArray.js","webpack://ConnectyCube/./node_modules/@babel/runtime/helpers/arrayWithHoles.js","webpack://ConnectyCube/./node_modules/@babel/runtime/helpers/asyncToGenerator.js","webpack://ConnectyCube/./node_modules/@babel/runtime/helpers/classCallCheck.js","webpack://ConnectyCube/./node_modules/@babel/runtime/helpers/createClass.js","webpack://ConnectyCube/./node_modules/@babel/runtime/helpers/defineProperty.js","webpack://ConnectyCube/./node_modules/@babel/runtime/helpers/interopRequireDefault.js","webpack://ConnectyCube/./node_modules/@babel/runtime/helpers/iterableToArrayLimit.js","webpack://ConnectyCube/./node_modules/@babel/runtime/helpers/nonIterableRest.js","webpack://ConnectyCube/./node_modules/@babel/runtime/helpers/objectWithoutProperties.js","webpack://ConnectyCube/./node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js","webpack://ConnectyCube/./node_modules/@babel/runtime/helpers/regeneratorRuntime.js","webpack://ConnectyCube/./node_modules/@babel/runtime/helpers/slicedToArray.js","webpack://ConnectyCube/./node_modules/@babel/runtime/helpers/toPrimitive.js","webpack://ConnectyCube/./node_modules/@babel/runtime/helpers/toPropertyKey.js","webpack://ConnectyCube/./node_modules/@babel/runtime/helpers/typeof.js","webpack://ConnectyCube/./node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js","webpack://ConnectyCube/./node_modules/@babel/runtime/regenerator/index.js","webpack://ConnectyCube/./node_modules/ltx/lib/Element.js","webpack://ConnectyCube/./node_modules/ltx/lib/createElement.js","webpack://ConnectyCube/./node_modules/ltx/lib/escape.js","webpack://ConnectyCube/./node_modules/ltx/lib/parsers/ltx.js","webpack://ConnectyCube/webpack/bootstrap","webpack://ConnectyCube/webpack/runtime/global","webpack://ConnectyCube/webpack/runtime/node module decorator","webpack://ConnectyCube/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"node-fetch\"), require(\"form-data\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"node-fetch\", \"form-data\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ConnectyCube\"] = factory(require(\"node-fetch\"), require(\"form-data\"));\n\telse\n\t\troot[\"ConnectyCube\"] = factory(root[\"node-fetch\"], root[\"form-data\"]);\n})(self, (__WEBPACK_EXTERNAL_MODULE__8849__, __WEBPACK_EXTERNAL_MODULE__6245__) => {\nreturn ","\"use strict\";\n\nmodule.exports.encode = function encode(string) {\n  return global.btoa(string);\n};\n\nmodule.exports.decode = function decode(string) {\n  return global.atob(string);\n};\n","\"use strict\";\n\nconst Client = require(\"./lib/Client\");\nconst xml = require(\"@xmpp/xml\");\nconst jid = require(\"@xmpp/jid\");\n\nmodule.exports.Client = Client;\nmodule.exports.xml = xml;\nmodule.exports.jid = jid;\n","\"use strict\";\n\nconst Connection = require(\"@xmpp/connection\");\n\nclass Client extends Connection {\n  constructor(options) {\n    super(options);\n    this.transports = [];\n  }\n\n  send(element, ...args) {\n    return this.Transport.prototype.send.call(this, element, ...args);\n  }\n\n  sendMany(...args) {\n    return this.Transport.prototype.sendMany.call(this, ...args);\n  }\n\n  _findTransport(service) {\n    return this.transports.find((Transport) => {\n      try {\n        return Transport.prototype.socketParameters(service) !== undefined;\n      } catch {\n        return false;\n      }\n    });\n  }\n\n  connect(service) {\n    const Transport = this._findTransport(service);\n\n    if (!Transport) {\n      throw new Error(\"No compatible connection method found.\");\n    }\n\n    this.Transport = Transport;\n    this.Socket = Transport.prototype.Socket;\n    this.Parser = Transport.prototype.Parser;\n\n    return super.connect(service);\n  }\n\n  socketParameters(...args) {\n    return this.Transport.prototype.socketParameters(...args);\n  }\n\n  header(...args) {\n    return this.Transport.prototype.header(...args);\n  }\n\n  headerElement(...args) {\n    return this.Transport.prototype.headerElement(...args);\n  }\n\n  footer(...args) {\n    return this.Transport.prototype.footer(...args);\n  }\n\n  footerElement(...args) {\n    return this.Transport.prototype.footerElement(...args);\n  }\n}\n\nClient.prototype.NS = \"jabber:client\";\n\nmodule.exports = Client;\n","\"use strict\";\n\nconst { EventEmitter, promise } = require(\"@xmpp/events\");\nconst jid = require(\"@xmpp/jid\");\nconst xml = require(\"@xmpp/xml\");\nconst StreamError = require(\"./lib/StreamError\");\nconst { parseHost, parseService } = require(\"./lib/util\");\n\nconst NS_STREAM = \"urn:ietf:params:xml:ns:xmpp-streams\";\nconst NS_JABBER_STREAM = \"http://etherx.jabber.org/streams\";\n\nclass Connection extends EventEmitter {\n  constructor(options = {}) {\n    super();\n    this.jid = null;\n    this.timeout = 2000;\n    this.options = options;\n    this.socketListeners = Object.create(null);\n    this.parserListeners = Object.create(null);\n    this.status = \"offline\";\n    this.socket = null;\n    this.parser = null;\n    this.root = null;\n  }\n\n  _reset() {\n    this.jid = null;\n    this.status = \"offline\";\n    this._detachSocket();\n    this._detachParser();\n  }\n\n  async _streamError(condition, children) {\n    try {\n      await this.send(\n        // prettier-ignore\n        xml('stream:error', {}, [\n          xml(condition, {xmlns: NS_STREAM}, children),\n        ]),\n      );\n    } catch {}\n\n    return this._end();\n  }\n\n  _onData(data) {\n    const str = data.toString(\"utf8\");\n    this.emit(\"input\", str);\n    this.parser.write(str);\n  }\n\n  _onParserError(error) {\n    // https://xmpp.org/rfcs/rfc6120.html#streams-error-conditions-bad-format\n    // \"This error can be used instead of the more specific XML-related errors,\n    // such as <bad-namespace-prefix/>, <invalid-xml/>, <not-well-formed/>, <restricted-xml/>,\n    // and <unsupported-encoding/>. However, the more specific errors are RECOMMENDED.\"\n    this._streamError(\"bad-format\");\n    this._detachParser();\n    this.emit(\"error\", error);\n  }\n\n  _attachSocket(socket) {\n    this.socket = socket;\n    const listeners = this.socketListeners;\n\n    listeners.data = this._onData.bind(this);\n\n    listeners.close = (dirty, event) => {\n      this._reset();\n      this._status(\"disconnect\", { clean: !dirty, event });\n    };\n\n    listeners.connect = () => {\n      this._status(\"connect\");\n    };\n\n    listeners.error = (error) => {\n      this.emit(\"error\", error);\n    };\n\n    this.socket.on(\"close\", listeners.close);\n    this.socket.on(\"data\", listeners.data);\n    this.socket.on(\"error\", listeners.error);\n    this.socket.on(\"connect\", listeners.connect);\n  }\n\n  _detachSocket() {\n    const { socketListeners, socket } = this;\n    for (const k of Object.getOwnPropertyNames(socketListeners)) {\n      socket.removeListener(k, socketListeners[k]);\n      delete socketListeners[k];\n    }\n    this.socket = null;\n    return socket;\n  }\n\n  _onElement(element) {\n    const isStreamError = element.is(\"error\", NS_JABBER_STREAM);\n\n    if (isStreamError) {\n      this._onStreamError(element);\n    }\n\n    this.emit(\"element\", element);\n    this.emit(this.isStanza(element) ? \"stanza\" : \"nonza\", element);\n\n    if (isStreamError) {\n      // \"Stream Errors Are Unrecoverable\"\n      // \"The entity that receives the stream error then SHALL close the stream\"\n      this._end();\n    }\n  }\n\n  // https://xmpp.org/rfcs/rfc6120.html#streams-error\n  _onStreamError(element) {\n    const error = StreamError.fromElement(element);\n\n    if (error.condition === \"see-other-host\") {\n      return this._onSeeOtherHost(error);\n    }\n\n    this.emit(\"error\", error);\n  }\n\n  // https://xmpp.org/rfcs/rfc6120.html#streams-error-conditions-see-other-host\n  async _onSeeOtherHost(error) {\n    const { protocol } = parseService(this.options.service);\n\n    const host = error.element.getChildText(\"see-other-host\");\n    const { port } = parseHost(host);\n\n    let service;\n    service = port\n      ? `${protocol || \"xmpp:\"}//${host}`\n      : (protocol ? `${protocol}//` : \"\") + host;\n\n    try {\n      await promise(this, \"disconnect\");\n      const { domain, lang } = this.options;\n      await this.connect(service);\n      await this.open({ domain, lang });\n    } catch (err) {\n      this.emit(\"error\", err);\n    }\n  }\n\n  _attachParser(parser) {\n    this.parser = parser;\n    const listeners = this.parserListeners;\n\n    listeners.element = this._onElement.bind(this);\n    listeners.error = this._onParserError.bind(this);\n\n    listeners.end = (element) => {\n      this._detachParser();\n      this._status(\"close\", element);\n    };\n\n    listeners.start = (element) => {\n      this._status(\"open\", element);\n    };\n\n    this.parser.on(\"error\", listeners.error);\n    this.parser.on(\"element\", listeners.element);\n    this.parser.on(\"end\", listeners.end);\n    this.parser.on(\"start\", listeners.start);\n  }\n\n  _detachParser() {\n    const listeners = this.parserListeners;\n    for (const k of Object.getOwnPropertyNames(listeners)) {\n      this.parser.removeListener(k, listeners[k]);\n      delete listeners[k];\n    }\n    this.parser = null;\n  }\n\n  _jid(id) {\n    this.jid = jid(id);\n    return this.jid;\n  }\n\n  _status(status, ...args) {\n    this.status = status;\n    this.emit(\"status\", status, ...args);\n    this.emit(status, ...args);\n  }\n\n  async _end() {\n    let el;\n    try {\n      el = await this.close();\n    } catch {}\n\n    try {\n      await this.disconnect();\n    } catch {}\n\n    return el;\n  }\n\n  /**\n   * Opens the socket then opens the stream\n   */\n  async start() {\n    if (this.status !== \"offline\") {\n      throw new Error(\"Connection is not offline\");\n    }\n\n    const { service, domain, lang } = this.options;\n\n    await this.connect(service);\n\n    const promiseOnline = promise(this, \"online\");\n\n    await this.open({ domain, lang });\n\n    return promiseOnline;\n  }\n\n  /**\n   * Connects the socket\n   */\n  async connect(service) {\n    this._status(\"connecting\", service);\n    const socket = new this.Socket();\n    this._attachSocket(socket);\n    // The 'connect' status is set by the socket 'connect' listener\n    socket.connect(this.socketParameters(service));\n    return promise(socket, \"connect\");\n  }\n\n  /**\n   * Disconnects the socket\n   * https://xmpp.org/rfcs/rfc6120.html#streams-close\n   * https://tools.ietf.org/html/rfc7395#section-3.6\n   */\n  async disconnect(timeout = this.timeout) {\n    if (this.socket) this._status(\"disconnecting\");\n\n    this.socket.end();\n\n    // The 'disconnect' status is set by the socket 'close' listener\n    await promise(this.socket, \"close\", \"error\", timeout);\n  }\n\n  /**\n   * Opens the stream\n   */\n  async open(options) {\n    this._status(\"opening\");\n\n    if (typeof options === \"string\") {\n      options = { domain: options };\n    }\n\n    const { domain, lang, timeout = this.timeout } = options;\n\n    const headerElement = this.headerElement();\n    headerElement.attrs.to = domain;\n    headerElement.attrs[\"xml:lang\"] = lang;\n    this.root = headerElement;\n\n    this._attachParser(new this.Parser());\n\n    await this.write(this.header(headerElement));\n    return promise(this, \"open\", \"error\", timeout);\n  }\n\n  /**\n   * Closes the stream then closes the socket\n   * https://xmpp.org/rfcs/rfc6120.html#streams-close\n   * https://tools.ietf.org/html/rfc7395#section-3.6\n   */\n  async stop() {\n    const el = await this._end();\n    if (this.status !== \"offline\") this._status(\"offline\", el);\n    return el;\n  }\n\n  /**\n   * Closes the stream and wait for the server to close it\n   * https://xmpp.org/rfcs/rfc6120.html#streams-close\n   * https://tools.ietf.org/html/rfc7395#section-3.6\n   */\n  async close(timeout = this.timeout) {\n    const fragment = this.footer(this.footerElement());\n\n    const p = Promise.all([\n      promise(this.parser, \"end\", \"error\", timeout),\n      this.write(fragment),\n    ]);\n\n    if (this.parser && this.socket) this._status(\"closing\");\n    const [el] = await p;\n    this.root = null;\n    return el;\n    // The 'close' status is set by the parser 'end' listener\n  }\n\n  /**\n   * Restart the stream\n   * https://xmpp.org/rfcs/rfc6120.html#streams-negotiation-restart\n   */\n  async restart() {\n    this._detachParser();\n    const { domain, lang } = this.options;\n    return this.open({ domain, lang });\n  }\n\n  async send(element) {\n    element.parent = this.root;\n    await this.write(element.toString());\n    this.emit(\"send\", element);\n  }\n\n  sendReceive(element, timeout = this.timeout) {\n    return Promise.all([\n      this.send(element),\n      promise(this, \"element\", \"error\", timeout),\n    ]).then(([, el]) => el);\n  }\n\n  write(string) {\n    return new Promise((resolve, reject) => {\n      // https://xmpp.org/rfcs/rfc6120.html#streams-close\n      // \"Refrain from sending any further data over its outbound stream to the other entity\"\n      if (this.status === \"closing\") {\n        reject(new Error(\"Connection is closing\"));\n        return;\n      }\n\n      this.socket.write(string, (err) => {\n        if (err) {\n          return reject(err);\n        }\n\n        this.emit(\"output\", string);\n        resolve();\n      });\n    });\n  }\n\n  isStanza(element) {\n    const { name } = element;\n    return name === \"iq\" || name === \"message\" || name === \"presence\";\n  }\n\n  isNonza(element) {\n    return !this.isStanza(element);\n  }\n\n  // Override\n  header(el) {\n    return el.toString();\n  }\n\n  // Override\n  headerElement() {\n    return new xml.Element(\"\", {\n      version: \"1.0\",\n      xmlns: this.NS,\n    });\n  }\n\n  // Override\n  footer(el) {\n    return el.toString();\n  }\n\n  // Override\n  footerElement() {}\n\n  // Override\n  socketParameters() {}\n}\n\n// Overrirde\nConnection.prototype.NS = \"\";\nConnection.prototype.Socket = null;\nConnection.prototype.Parser = null;\n\nmodule.exports = Connection;\n","\"use strict\";\n\nconst XMPPError = require(\"@xmpp/error\");\n\n// https://xmpp.org/rfcs/rfc6120.html#streams-error\n\nclass StreamError extends XMPPError {\n  constructor(...args) {\n    super(...args);\n    this.name = \"StreamError\";\n  }\n}\n\nmodule.exports = StreamError;\n","\"use strict\";\n\nfunction parseURI(URI) {\n  let { port, hostname, protocol } = new URL(URI);\n  // https://github.com/nodejs/node/issues/12410#issuecomment-294138912\n  if (hostname === \"[::1]\") {\n    hostname = \"::1\";\n  }\n\n  return { port, hostname, protocol };\n}\n\nfunction parseHost(host) {\n  const { port, hostname } = parseURI(`http://${host}`);\n  return { port, hostname };\n}\n\nfunction parseService(service) {\n  return service.includes(\"://\") ? parseURI(service) : parseHost(service);\n}\n\nObject.assign(module.exports, { parseURI, parseHost, parseService });\n","\"use strict\";\n\n// https://xmpp.org/rfcs/rfc6120.html#rfc.section.4.9.2\n\nclass XMPPError extends Error {\n  constructor(condition, text, application) {\n    super(condition + (text ? ` - ${text}` : \"\"));\n    this.name = \"XMPPError\";\n    this.condition = condition;\n    this.text = text;\n    this.application = application;\n  }\n\n  static fromElement(element) {\n    const [condition, second, third] = element.children;\n    let text;\n    let application;\n\n    if (second) {\n      if (second.is(\"text\")) {\n        text = second;\n      } else if (second) {\n        application = second;\n      }\n\n      if (third) application = third;\n    }\n\n    const error = new this(\n      condition.name,\n      text ? text.text() : \"\",\n      application,\n    );\n    error.element = element;\n    return error;\n  }\n}\n\nmodule.exports = XMPPError;\n","\"use strict\";\n\nconst timeout = require(\"./lib/timeout\");\nconst delay = require(\"./lib/delay\");\nconst TimeoutError = require(\"./lib/TimeoutError\");\nconst promise = require(\"./lib/promise\");\nconst EventEmitter = require(\"events\");\nconst Deferred = require(\"./lib/Deferred\");\n\nexports.EventEmitter = EventEmitter;\nexports.timeout = timeout;\nexports.delay = delay;\nexports.TimeoutError = TimeoutError;\nexports.promise = promise;\nexports.Deferred = Deferred;\n","\"use strict\";\n\nmodule.exports = function Deferred() {\n  this.promise = new Promise((resolve, reject) => {\n    this.resolve = resolve;\n    this.reject = reject;\n  });\n};\n","\"use strict\";\n\nmodule.exports = class TimeoutError extends Error {\n  constructor(message) {\n    super(message);\n    this.name = \"TimeoutError\";\n  }\n};\n","\"use strict\";\n\nmodule.exports = function delay(ms) {\n  let timeout;\n  const promise = new Promise((resolve) => {\n    timeout = setTimeout(resolve, ms);\n  });\n  promise.timeout = timeout;\n  return promise;\n};\n","\"use strict\";\n\nconst TimeoutError = require(\"./TimeoutError\");\n\nmodule.exports = function promise(EE, event, rejectEvent = \"error\", timeout) {\n  return new Promise((resolve, reject) => {\n    let timeoutId;\n\n    const cleanup = () => {\n      clearTimeout(timeoutId);\n      EE.removeListener(event, onEvent);\n      EE.removeListener(rejectEvent, onError);\n    };\n\n    function onError(reason) {\n      reject(reason);\n      cleanup();\n    }\n\n    function onEvent(value) {\n      resolve(value);\n      cleanup();\n    }\n\n    EE.once(event, onEvent);\n    if (rejectEvent) {\n      EE.once(rejectEvent, onError);\n    }\n\n    if (timeout) {\n      timeoutId = setTimeout(() => {\n        cleanup();\n        reject(new TimeoutError());\n      }, timeout);\n    }\n  });\n};\n","\"use strict\";\n\nconst TimeoutError = require(\"./TimeoutError\");\nconst delay = require(\"./delay\");\n\nmodule.exports = function timeout(promise, ms) {\n  const promiseDelay = delay(ms);\n\n  function cancelDelay() {\n    clearTimeout(promiseDelay.timeout);\n  }\n\n  return Promise.race([\n    promise.finally(cancelDelay),\n    promiseDelay.then(() => {\n      throw new TimeoutError();\n    }),\n  ]);\n};\n","\"use strict\";\n\nmodule.exports = function id() {\n  let i;\n  while (!i) {\n    i = Math.random().toString(36).slice(2, 12);\n  }\n\n  return i;\n};\n","\"use strict\";\n\n/**\n * References\n * https://xmpp.org/rfcs/rfc6120.html#stanzas-semantics-iq\n * https://xmpp.org/rfcs/rfc6120.html#stanzas-error\n */\n\nconst xml = require(\"@xmpp/xml\");\n\nconst NS_STANZA = \"urn:ietf:params:xml:ns:xmpp-stanzas\";\n\nfunction isQuery({ name, type }) {\n  if (name !== \"iq\") return false;\n  if (type === \"error\" || type === \"result\") return false;\n  return true;\n}\n\nfunction isValidQuery({ type }, children, child) {\n  if (type !== \"get\" && type !== \"set\") return false;\n  if (children.length !== 1) return false;\n  if (!child) return false;\n  return true;\n}\n\nfunction buildReply({ stanza }) {\n  return xml(\"iq\", {\n    to: stanza.attrs.from,\n    from: stanza.attrs.to,\n    id: stanza.attrs.id,\n  });\n}\n\nfunction buildReplyResult(ctx, child) {\n  const reply = buildReply(ctx);\n  reply.attrs.type = \"result\";\n  if (child) {\n    reply.append(child);\n  }\n\n  return reply;\n}\n\nfunction buildReplyError(ctx, error, child) {\n  const reply = buildReply(ctx);\n  reply.attrs.type = \"error\";\n  if (child) {\n    reply.append(child);\n  }\n\n  reply.append(error);\n  return reply;\n}\n\nfunction buildError(type, condition) {\n  return xml(\"error\", { type }, xml(condition, NS_STANZA));\n}\n\nfunction iqHandler(entity) {\n  return async function iqHandler(ctx, next) {\n    if (!isQuery(ctx)) return next();\n\n    const { stanza } = ctx;\n    const children = stanza.getChildElements();\n    const [child] = children;\n\n    if (!isValidQuery(ctx, children, child)) {\n      return buildReplyError(ctx, buildError(\"modify\", \"bad-request\"), child);\n    }\n\n    ctx.element = child;\n\n    let reply;\n    try {\n      reply = await next();\n    } catch (err) {\n      entity.emit(\"error\", err);\n      reply = buildError(\"cancel\", \"internal-server-error\");\n    }\n\n    if (!reply) {\n      reply = buildError(\"cancel\", \"service-unavailable\");\n    }\n\n    if (reply instanceof xml.Element && reply.is(\"error\")) {\n      return buildReplyError(ctx, reply, child);\n    }\n\n    return buildReplyResult(\n      ctx,\n      reply instanceof xml.Element ? reply : undefined,\n    );\n  };\n}\n\nfunction route(type, ns, name, handler) {\n  return (ctx, next) => {\n    if ((ctx.type !== type) | !ctx.element || !ctx.element.is(name, ns))\n      return next();\n    return handler(ctx, next);\n  };\n}\n\nmodule.exports = function iqCallee({ middleware, entity }) {\n  middleware.use(iqHandler(entity));\n\n  return {\n    get(ns, name, handler) {\n      middleware.use(route(\"get\", ns, name, handler));\n    },\n    set(ns, name, handler) {\n      middleware.use(route(\"set\", ns, name, handler));\n    },\n  };\n};\n","\"use strict\";\n\nconst xid = require(\"@xmpp/id\");\nconst StanzaError = require(\"@xmpp/middleware/lib/StanzaError\");\nconst { Deferred } = require(\"@xmpp/events\");\nconst timeoutPromise = require(\"@xmpp/events\").timeout;\nconst xml = require(\"@xmpp/xml\");\n\nfunction isReply({ name, type }) {\n  if (name !== \"iq\") return false;\n  if (type !== \"error\" && type !== \"result\") return false;\n  return true;\n}\n\nclass IQCaller {\n  constructor({ entity, middleware }) {\n    this.handlers = new Map();\n    this.entity = entity;\n    this.middleware = middleware;\n  }\n\n  start() {\n    this.middleware.use(this._route.bind(this));\n  }\n\n  _route({ type, name, id, stanza }, next) {\n    if (!isReply({ name, type })) return next();\n\n    const deferred = this.handlers.get(id);\n\n    if (!deferred) {\n      return next();\n    }\n\n    if (type === \"error\") {\n      deferred.reject(StanzaError.fromElement(stanza.getChild(\"error\")));\n    } else {\n      deferred.resolve(stanza);\n    }\n\n    this.handlers.delete(id);\n  }\n\n  async request(stanza, timeout = 30 * 1000) {\n    if (!stanza.attrs.id) {\n      stanza.attrs.id = xid();\n    }\n\n    const deferred = new Deferred();\n    this.handlers.set(stanza.attrs.id, deferred);\n\n    try {\n      await this.entity.send(stanza);\n      await timeoutPromise(deferred.promise, timeout);\n    } catch (err) {\n      this.handlers.delete(stanza.attrs.id);\n      throw err;\n    }\n\n    return deferred.promise;\n  }\n\n  _childRequest(type, element, to, ...args) {\n    const {\n      name,\n      attrs: { xmlns },\n    } = element;\n    return this.request(xml(\"iq\", { type, to }, element), ...args).then(\n      (stanza) => stanza.getChild(name, xmlns),\n    );\n  }\n\n  async get(...args) {\n    return this._childRequest(\"get\", ...args);\n  }\n\n  async set(...args) {\n    return this._childRequest(\"set\", ...args);\n  }\n}\n\nmodule.exports = function iqCaller(...args) {\n  const iqCaller = new IQCaller(...args);\n  iqCaller.start();\n  return iqCaller;\n};\n","\"use strict\";\n\nconst JID = require(\"./lib/JID\");\nconst escaping = require(\"./lib/escaping\");\nconst parse = require(\"./lib/parse\");\n\nfunction jid(...args) {\n  if (!args[1] && !args[2]) {\n    return parse(...args);\n  }\n\n  return new JID(...args);\n}\n\nmodule.exports = jid.bind();\nmodule.exports.jid = jid;\nmodule.exports.JID = JID;\nmodule.exports.equal = function equal(a, b) {\n  return a.equals(b);\n};\n\nmodule.exports.detectEscape = escaping.detect;\nmodule.exports.escapeLocal = escaping.escape;\nmodule.exports.unescapeLocal = escaping.unescape;\nmodule.exports.parse = parse;\n","\"use strict\";\n\nconst escaping = require(\"./escaping\");\n\n/**\n * JID implements\n * - XMPP addresses according to RFC6122\n * - XEP-0106: JID Escaping\n *\n * @see http://tools.ietf.org/html/rfc6122#section-2\n * @see http://xmpp.org/extensions/xep-0106.html\n */\nclass JID {\n  constructor(local, domain, resource) {\n    if (typeof domain !== \"string\" || !domain) {\n      throw new TypeError(`Invalid domain.`);\n    }\n\n    this.setDomain(domain);\n    this.setLocal(typeof local === \"string\" ? local : \"\");\n    this.setResource(typeof resource === \"string\" ? resource : \"\");\n  }\n\n  [Symbol.toPrimitive](hint) {\n    if (hint === \"number\") {\n      return NaN;\n    }\n\n    return this.toString();\n  }\n\n  toString(unescape) {\n    let s = this._domain;\n    if (this._local) {\n      s = this.getLocal(unescape) + \"@\" + s;\n    }\n\n    if (this._resource) {\n      s = s + \"/\" + this._resource;\n    }\n\n    return s;\n  }\n\n  /**\n   * Convenience method to distinguish users\n   * */\n  bare() {\n    if (this._resource) {\n      return new JID(this._local, this._domain, null);\n    }\n\n    return this;\n  }\n\n  /**\n   * Comparison function\n   * */\n  equals(other) {\n    return (\n      this._local === other._local &&\n      this._domain === other._domain &&\n      this._resource === other._resource\n    );\n  }\n\n  /**\n   * http://xmpp.org/rfcs/rfc6122.html#addressing-localpart\n   * */\n  setLocal(local, escape) {\n    escape = escape || escaping.detect(local);\n\n    if (escape) {\n      local = escaping.escape(local);\n    }\n\n    this._local = local && local.toLowerCase();\n    return this;\n  }\n\n  getLocal(unescape = false) {\n    let local = null;\n\n    local = unescape ? escaping.unescape(this._local) : this._local;\n\n    return local;\n  }\n\n  /**\n   * http://xmpp.org/rfcs/rfc6122.html#addressing-domain\n   */\n  setDomain(domain) {\n    this._domain = domain.toLowerCase();\n    return this;\n  }\n\n  getDomain() {\n    return this._domain;\n  }\n\n  /**\n   * http://xmpp.org/rfcs/rfc6122.html#addressing-resourcepart\n   */\n  setResource(resource) {\n    this._resource = resource;\n    return this;\n  }\n\n  getResource() {\n    return this._resource;\n  }\n}\n\nObject.defineProperty(JID.prototype, \"local\", {\n  get: JID.prototype.getLocal,\n  set: JID.prototype.setLocal,\n});\n\nObject.defineProperty(JID.prototype, \"domain\", {\n  get: JID.prototype.getDomain,\n  set: JID.prototype.setDomain,\n});\n\nObject.defineProperty(JID.prototype, \"resource\", {\n  get: JID.prototype.getResource,\n  set: JID.prototype.setResource,\n});\n\nmodule.exports = JID;\n","\"use strict\";\n\nmodule.exports.detect = function detect(local) {\n  if (!local) {\n    return false;\n  }\n\n  // Remove all escaped sequences\n  const tmp = local\n    .replace(/\\\\20/g, \"\")\n    .replace(/\\\\22/g, \"\")\n    .replace(/\\\\26/g, \"\")\n    .replace(/\\\\27/g, \"\")\n    .replace(/\\\\2f/g, \"\")\n    .replace(/\\\\3a/g, \"\")\n    .replace(/\\\\3c/g, \"\")\n    .replace(/\\\\3e/g, \"\")\n    .replace(/\\\\40/g, \"\")\n    .replace(/\\\\5c/g, \"\");\n\n  // Detect if we have unescaped sequences\n  const search = tmp.search(/[ \"&'/:<>@\\\\]/g);\n  if (search === -1) {\n    return false;\n  }\n\n  return true;\n};\n\n/**\n * Escape the local part of a JID.\n *\n * @see http://xmpp.org/extensions/xep-0106.html\n * @param String local local part of a jid\n * @return An escaped local part\n */\nmodule.exports.escape = function escape(local) {\n  if (local === null) {\n    return null;\n  }\n\n  return local\n    .replace(/^\\s+|\\s+$/g, \"\")\n    .replace(/\\\\/g, \"\\\\5c\")\n    .replace(/ /g, \"\\\\20\")\n    .replace(/\"/g, \"\\\\22\")\n    .replace(/&/g, \"\\\\26\")\n    .replace(/'/g, \"\\\\27\")\n    .replace(/\\//g, \"\\\\2f\")\n    .replace(/:/g, \"\\\\3a\")\n    .replace(/</g, \"\\\\3c\")\n    .replace(/>/g, \"\\\\3e\")\n    .replace(/@/g, \"\\\\40\");\n};\n\n/**\n * Unescape a local part of a JID.\n *\n * @see http://xmpp.org/extensions/xep-0106.html\n * @param String local local part of a jid\n * @return unescaped local part\n */\nmodule.exports.unescape = function unescape(local) {\n  if (local === null) {\n    return null;\n  }\n\n  return local\n    .replace(/\\\\20/g, \" \")\n    .replace(/\\\\22/g, '\"')\n    .replace(/\\\\26/g, \"&\")\n    .replace(/\\\\27/g, \"'\")\n    .replace(/\\\\2f/g, \"/\")\n    .replace(/\\\\3a/g, \":\")\n    .replace(/\\\\3c/g, \"<\")\n    .replace(/\\\\3e/g, \">\")\n    .replace(/\\\\40/g, \"@\")\n    .replace(/\\\\5c/g, \"\\\\\");\n};\n","\"use strict\";\n\nconst JID = require(\"../lib/JID\");\n\nmodule.exports = function parse(s) {\n  let local;\n  let resource;\n\n  const resourceStart = s.indexOf(\"/\");\n  if (resourceStart !== -1) {\n    resource = s.slice(resourceStart + 1);\n    s = s.slice(0, resourceStart);\n  }\n\n  const atStart = s.indexOf(\"@\");\n  if (atStart !== -1) {\n    local = s.slice(0, atStart);\n    s = s.slice(atStart + 1);\n  }\n\n  return new JID(local, s, resource);\n};\n","\"use strict\";\n\nconst compose = require(\"koa-compose\");\n\nconst IncomingContext = require(\"./lib/IncomingContext\");\nconst OutgoingContext = require(\"./lib/OutgoingContext\");\n\nfunction listener(entity, middleware, Context) {\n  return (stanza) => {\n    const ctx = new Context(entity, stanza);\n    return compose(middleware)(ctx);\n  };\n}\n\nfunction errorHandler(entity) {\n  return (ctx, next) => {\n    next()\n      .then((reply) => reply && entity.send(reply))\n      .catch((err) => entity.emit(\"error\", err));\n  };\n}\n\nmodule.exports = function middleware({ entity }) {\n  const incoming = [errorHandler(entity)];\n  const outgoing = [];\n\n  const incomingListener = listener(entity, incoming, IncomingContext);\n  const outgoingListener = listener(entity, outgoing, OutgoingContext);\n\n  entity.on(\"element\", incomingListener);\n  entity.hookOutgoing = outgoingListener;\n\n  return {\n    use(fn) {\n      incoming.push(fn);\n      return fn;\n    },\n    filter(fn) {\n      outgoing.push(fn);\n      return fn;\n    },\n  };\n};\n","\"use strict\";\n\nmodule.exports = class Context {\n  constructor(entity, stanza) {\n    this.stanza = stanza;\n    this.entity = entity;\n\n    const { name, attrs } = stanza;\n    const { type, id } = attrs;\n\n    this.name = name;\n    this.id = id || \"\";\n\n    if (name === \"message\") {\n      this.type = type || \"normal\";\n    } else if (name === \"presence\") {\n      this.type = type || \"available\";\n    } else {\n      this.type = type || \"\";\n    }\n\n    this.from = null;\n    this.to = null;\n    this.local = \"\";\n    this.domain = \"\";\n    this.resource = \"\";\n  }\n};\n","\"use strict\";\n\nconst Context = require(\"./Context\");\nconst JID = require(\"@xmpp/jid\");\n\nmodule.exports = class IncomingContext extends Context {\n  constructor(entity, stanza) {\n    super(entity, stanza);\n\n    const { jid, domain } = entity;\n\n    const to = stanza.attrs.to || (jid && jid.toString());\n    const from = stanza.attrs.from || domain;\n\n    if (to) this.to = new JID(to);\n\n    if (from) {\n      this.from = new JID(from);\n      this.local = this.from.local;\n      this.domain = this.from.domain;\n      this.resource = this.from.resource;\n    }\n  }\n};\n","\"use strict\";\n\nconst Context = require(\"./Context\");\nconst JID = require(\"@xmpp/jid\");\n\nmodule.exports = class OutgoingContext extends Context {\n  constructor(entity, stanza) {\n    super(entity, stanza);\n\n    const { jid, domain } = entity;\n\n    const from = stanza.attrs.from || (jid && jid.toString());\n    const to = stanza.attrs.to || domain;\n\n    if (from) this.from = new JID(from);\n\n    if (to) {\n      this.to = new JID(to);\n      this.local = this.to.local;\n      this.domain = this.to.domain;\n      this.resource = this.to.resource;\n    }\n  }\n};\n","\"use strict\";\n\n/* https://xmpp.org/rfcs/rfc6120.html#stanzas-error */\n\nconst XMPPError = require(\"@xmpp/error\");\n\nclass StanzaError extends XMPPError {\n  constructor(condition, text, application, type) {\n    super(condition, text, application);\n    this.type = type;\n    this.name = \"StanzaError\";\n  }\n\n  static fromElement(element) {\n    const error = super.fromElement(element);\n    error.type = element.attrs.type;\n    return error;\n  }\n}\n\nmodule.exports = StanzaError;\n","\"use strict\";\n\nconst { EventEmitter } = require(\"@xmpp/events\");\n\nclass Reconnect extends EventEmitter {\n  constructor(entity) {\n    super();\n\n    this.delay = 1000;\n    this.entity = entity;\n    this._timeout = null;\n  }\n\n  scheduleReconnect() {\n    const { entity, delay, _timeout } = this;\n    clearTimeout(_timeout);\n    this._timeout = setTimeout(async () => {\n      if (entity.status !== \"disconnect\") {\n        return;\n      }\n\n      try {\n        await this.reconnect();\n      } catch {\n        // Ignoring the rejection is safe because the error is emitted on entity by #start\n      }\n    }, delay);\n  }\n\n  async reconnect() {\n    const { entity } = this;\n    this.emit(\"reconnecting\");\n\n    const { service, domain, lang } = entity.options;\n    await entity.connect(service);\n    await entity.open({ domain, lang });\n\n    this.emit(\"reconnected\");\n  }\n\n  start() {\n    const { entity } = this;\n    const listeners = {};\n    listeners.disconnect = () => {\n      this.scheduleReconnect();\n    };\n\n    this.listeners = listeners;\n    entity.on(\"disconnect\", listeners.disconnect);\n  }\n\n  stop() {\n    const { entity, listeners, _timeout } = this;\n    entity.removeListener(\"disconnect\", listeners.disconnect);\n    clearTimeout(_timeout);\n  }\n}\n\nmodule.exports = function reconnect({ entity }) {\n  const r = new Reconnect(entity);\n  r.start();\n  return r;\n};\n","\"use strict\";\n\nconst resolve = require(\"./resolve\");\nconst { promise } = require(\"@xmpp/events\");\n\nasync function fetchURIs(domain) {\n  const result = await resolve(domain, {\n    srv: [\n      {\n        service: \"xmpps-client\",\n        protocol: \"tcp\",\n      },\n      {\n        service: \"xmpp-client\",\n        protocol: \"tcp\",\n      },\n    ],\n  });\n\n  return [\n    // Remove duplicates\n    ...new Set(result.map((record) => record.uri)),\n  ];\n}\n\nfunction filterSupportedURIs(entity, uris) {\n  return uris.filter((uri) => entity._findTransport(uri));\n}\n\nasync function fallbackConnect(entity, uris) {\n  if (uris.length === 0) {\n    throw new Error(\"Couldn't connect\");\n  }\n\n  const uri = uris.shift();\n  const Transport = entity._findTransport(uri);\n\n  if (!Transport) {\n    return fallbackConnect(entity, uris);\n  }\n\n  entity._status(\"connecting\", uri);\n  const params = Transport.prototype.socketParameters(uri);\n  const socket = new Transport.prototype.Socket();\n\n  try {\n    socket.connect(params);\n    await promise(socket, \"connect\");\n  } catch {\n    return fallbackConnect(entity, uris);\n  }\n\n  entity._attachSocket(socket);\n  socket.emit(\"connect\");\n  entity.Transport = Transport;\n  entity.Socket = Transport.prototype.Socket;\n  entity.Parser = Transport.prototype.Parser;\n}\n\nmodule.exports = function resolve({ entity }) {\n  const _connect = entity.connect;\n  entity.connect = async function connect(service) {\n    if (!service || /:\\/\\//.test(service)) {\n      return _connect.call(this, service);\n    }\n\n    const uris = filterSupportedURIs(entity, await fetchURIs(service));\n\n    if (uris.length === 0) {\n      throw new Error(\"No compatible transport found.\");\n    }\n\n    try {\n      await fallbackConnect(entity, uris);\n    } catch (err) {\n      entity._reset();\n      entity._status(\"disconnect\");\n      throw err;\n    }\n  };\n};\n","\"use strict\";\n\nfunction isSecure(uri) {\n  return uri.startsWith(\"https\") || uri.startsWith(\"wss\");\n}\n\nmodule.exports.compare = function compare(a, b) {\n  let secure;\n  if (isSecure(a.uri) && !isSecure(b.uri)) {\n    secure = -1;\n  } else if (!isSecure(a.uri) && isSecure(b.uri)) {\n    secure = 1;\n  } else {\n    secure = 0;\n  }\n\n  if (secure !== 0) {\n    return secure;\n  }\n\n  let method;\n  if (a.method === b.method) {\n    method = 0;\n  } else if (a.method === \"websocket\") {\n    method = -1;\n  } else if (b.method === \"websocket\") {\n    method = 1;\n  } else if (a.method === \"xbosh\") {\n    method = -1;\n  } else if (b.method === \"xbosh\") {\n    method = 1;\n  } else if (a.method === \"httppoll\") {\n    method = -1;\n  } else if (b.method === \"httppoll\") {\n    method = 1;\n  } else {\n    method = 0;\n  }\n\n  if (method !== 0) {\n    return method;\n  }\n\n  return 0;\n};\n","\"use strict\";\n\nconst fetch = global.fetch || require(\"node-fetch\");\nconst parse = require(\"@xmpp/xml/lib/parse\");\nconst compareAltConnections = require(\"./alt-connections\").compare;\n\nfunction resolve(domain) {\n  return fetch(`https://${domain}/.well-known/host-meta`)\n    .then((res) => res.text())\n    .then((res) => {\n      return parse(res)\n        .getChildren(\"Link\")\n        .filter((link) =>\n          [\n            \"urn:xmpp:alt-connections:websocket\",\n            \"urn:xmpp:alt-connections:httppoll\",\n            \"urn:xmpp:alt-connections:xbosh\",\n          ].includes(link.attrs.rel),\n        )\n        .map(({ attrs }) => ({\n          rel: attrs.rel,\n          href: attrs.href,\n          method: attrs.rel.split(\":\").pop(),\n          uri: attrs.href,\n        }))\n        .sort(compareAltConnections);\n    })\n    .catch(() => {\n      return [];\n    });\n}\n\nmodule.exports.resolve = resolve;\n","\"use strict\";\n\nconst dns = require(\"./lib/dns\");\nconst http = require(\"./lib/http\");\n\nmodule.exports = function resolve(...args) {\n  return Promise.all([\n    dns.resolve ? dns.resolve(...args) : Promise.resolve([]),\n    http.resolve(...args),\n  ]).then(([records, endpoints]) => [...records, ...endpoints]);\n};\n\nif (dns.resolve) {\n  module.exports.dns = dns;\n}\n\nmodule.exports.http = http;\n","\"use strict\";\n\nconst xml = require(\"@xmpp/xml\");\n\n/*\n * References\n * https://xmpp.org/rfcs/rfc6120.html#bind\n */\n\nconst NS = \"urn:ietf:params:xml:ns:xmpp-bind\";\n\nfunction makeBindElement(resource) {\n  return xml(\"bind\", { xmlns: NS }, resource && xml(\"resource\", {}, resource));\n}\n\nasync function bind(entity, iqCaller, resource) {\n  const result = await iqCaller.set(makeBindElement(resource));\n  const jid = result.getChildText(\"jid\");\n  entity._jid(jid);\n  return jid;\n}\n\nfunction route({ iqCaller }, resource) {\n  return async ({ entity }, next) => {\n    await (typeof resource === \"function\"\n      ? resource((resource) => bind(entity, iqCaller, resource))\n      : bind(entity, iqCaller, resource));\n\n    next();\n  };\n}\n\nmodule.exports = function resourceBinding(\n  { streamFeatures, iqCaller },\n  resource,\n) {\n  streamFeatures.use(\"bind\", NS, route({ iqCaller }, resource));\n};\n","\"use strict\";\n\n/**\n * [XEP-0175: Best Practices for Use of SASL ANONYMOUS](https://xmpp.org/extensions/xep-0175.html)\n * [RFC-4504: Anonymous Simple Authentication and Security Layer (SASL) Mechanism](https://tools.ietf.org/html/rfc4505)\n */\n\nconst mech = require(\"sasl-anonymous\");\n\nmodule.exports = function saslAnonymous(sasl) {\n  sasl.use(mech);\n};\n","\"use strict\";\n\nconst mech = require(\"sasl-plain\");\n\nmodule.exports = function saslPlain(sasl) {\n  sasl.use(mech);\n};\n","\"use strict\";\n\nconst { encode, decode } = require(\"@xmpp/base64\");\nconst SASLError = require(\"./lib/SASLError\");\nconst xml = require(\"@xmpp/xml\");\nconst SASLFactory = require(\"saslmechanisms\");\n\n// https://xmpp.org/rfcs/rfc6120.html#sasl\n\nconst NS = \"urn:ietf:params:xml:ns:xmpp-sasl\";\n\nfunction getMechanismNames(features) {\n  return features.getChild(\"mechanisms\", NS).children.map((el) => el.text());\n}\n\nasync function authenticate(SASL, entity, mechname, credentials) {\n  const mech = SASL.create([mechname]);\n  if (!mech) {\n    throw new Error(\"No compatible mechanism\");\n  }\n\n  const { domain } = entity.options;\n  const creds = {\n    username: null,\n    password: null,\n    server: domain,\n    host: domain,\n    realm: domain,\n    serviceType: \"xmpp\",\n    serviceName: domain,\n    ...credentials,\n  };\n\n  return new Promise((resolve, reject) => {\n    const handler = (element) => {\n      if (element.attrs.xmlns !== NS) {\n        return;\n      }\n\n      if (element.name === \"challenge\") {\n        mech.challenge(decode(element.text()));\n        const resp = mech.response(creds);\n        entity.send(\n          xml(\n            \"response\",\n            { xmlns: NS, mechanism: mech.name },\n            typeof resp === \"string\" ? encode(resp) : \"\",\n          ),\n        );\n        return;\n      }\n\n      if (element.name === \"failure\") {\n        reject(SASLError.fromElement(element));\n      } else if (element.name === \"success\") {\n        resolve();\n      }\n\n      entity.removeListener(\"nonza\", handler);\n    };\n\n    entity.on(\"nonza\", handler);\n\n    if (mech.clientFirst) {\n      entity.send(\n        xml(\n          \"auth\",\n          { xmlns: NS, mechanism: mech.name },\n          encode(mech.response(creds)),\n        ),\n      );\n    }\n  });\n}\n\nmodule.exports = function sasl({ streamFeatures }, credentials) {\n  const SASL = new SASLFactory();\n\n  streamFeatures.use(\"mechanisms\", NS, async ({ stanza, entity }) => {\n    const offered = getMechanismNames(stanza);\n    const supported = SASL._mechs.map(({ name }) => name);\n    // eslint-disable-next-line unicorn/prefer-array-find\n    const intersection = supported.filter((mech) => {\n      return offered.includes(mech);\n    });\n    // eslint-disable-next-line prefer-destructuring\n    let mech = intersection[0];\n\n    if (typeof credentials === \"function\") {\n      await credentials(\n        (creds) => authenticate(SASL, entity, mech, creds, stanza),\n        mech,\n      );\n    } else {\n      if (!credentials.username && !credentials.password) {\n        mech = \"ANONYMOUS\";\n      }\n\n      await authenticate(SASL, entity, mech, credentials, stanza);\n    }\n\n    await entity.restart();\n  });\n\n  return {\n    use(...args) {\n      return SASL.use(...args);\n    },\n  };\n};\n","\"use strict\";\n\nconst XMPPError = require(\"@xmpp/error\");\n\n// https://xmpp.org/rfcs/rfc6120.html#sasl-errors\n\nclass SASLError extends XMPPError {\n  constructor(...args) {\n    super(...args);\n    this.name = \"SASLError\";\n  }\n}\n\nmodule.exports = SASLError;\n","\"use strict\";\n\nconst xml = require(\"@xmpp/xml\");\n\n// https://tools.ietf.org/html/draft-cridland-xmpp-session-01\n\nconst NS = \"urn:ietf:params:xml:ns:xmpp-session\";\n\nmodule.exports = function sessionEstablishment({ iqCaller, streamFeatures }) {\n  streamFeatures.use(\"session\", NS, async (context, next, feature) => {\n    if (feature.getChild(\"optional\")) return next();\n    await iqCaller.set(xml(\"session\", NS));\n    return next();\n  });\n};\n","\"use strict\";\n\n/**\n * References\n * https://xmpp.org/rfcs/rfc6120.html#streams-negotiation Stream Negotiation\n * https://xmpp.org/extensions/xep-0170.html XEP-0170: Recommended Order of Stream Feature Negotiation\n * https://xmpp.org/registrar/stream-features.html XML Stream Features\n */\n\nconst route = require(\"./route\");\n\nmodule.exports = function streamFeatures({ middleware }) {\n  middleware.use(route());\n\n  function use(name, xmlns, handler) {\n    return middleware.use((ctx, next) => {\n      const { stanza } = ctx;\n      if (!stanza.is(\"features\", \"http://etherx.jabber.org/streams\"))\n        return next();\n      const feature = stanza.getChild(name, xmlns);\n      if (!feature) return next();\n      return handler(ctx, next, feature);\n    });\n  }\n\n  return {\n    use,\n  };\n};\n","\"use strict\";\n\nmodule.exports = function route() {\n  return async ({ stanza, entity }, next) => {\n    if (!stanza.is(\"features\", \"http://etherx.jabber.org/streams\"))\n      return next();\n\n    const prevent = await next();\n    if (!prevent && entity.jid) entity._status(\"online\", entity.jid);\n  };\n};\n","\"use strict\";\n\nconst ConnectionWebSocket = require(\"./lib/Connection\");\n\nmodule.exports = function websocket({ entity }) {\n  entity.transports.push(ConnectionWebSocket);\n};\n","\"use strict\";\n\nconst Socket = require(\"./Socket\");\nconst Connection = require(\"@xmpp/connection\");\nconst xml = require(\"@xmpp/xml\");\nconst FramedParser = require(\"./FramedParser\");\n\nconst NS_FRAMING = \"urn:ietf:params:xml:ns:xmpp-framing\";\n\n/* References\n * WebSocket protocol https://tools.ietf.org/html/rfc6455\n * WebSocket Web API https://html.spec.whatwg.org/multipage/comms.html#network\n * XMPP over WebSocket https://tools.ietf.org/html/rfc7395\n */\n\nclass ConnectionWebSocket extends Connection {\n  send(element, ...args) {\n    if (!element.attrs.xmlns && super.isStanza(element)) {\n      element.attrs.xmlns = \"jabber:client\";\n    }\n\n    return super.send(element, ...args);\n  }\n\n  async sendMany(elements) {\n    for (const element of elements) {\n      await this.send(element);\n    }\n  }\n\n  // https://tools.ietf.org/html/rfc7395#section-3.6\n  footerElement() {\n    return new xml.Element(\"close\", {\n      xmlns: NS_FRAMING,\n    });\n  }\n\n  // https://tools.ietf.org/html/rfc7395#section-3.4\n  headerElement() {\n    const el = super.headerElement();\n    el.name = \"open\";\n    el.attrs.xmlns = NS_FRAMING;\n    return el;\n  }\n\n  socketParameters(service) {\n    return /^wss?:\\/\\//.test(service) ? service : undefined;\n  }\n}\n\nConnectionWebSocket.prototype.Socket = Socket;\nConnectionWebSocket.prototype.NS = \"jabber:client\";\nConnectionWebSocket.prototype.Parser = FramedParser;\n\nmodule.exports = ConnectionWebSocket;\n","\"use strict\";\n\nconst { Parser, Element, XMLError } = require(\"@xmpp/xml\");\n\nmodule.exports = class FramedParser extends Parser {\n  onStartElement(name, attrs) {\n    const element = new Element(name, attrs);\n\n    const { cursor } = this;\n\n    if (cursor) {\n      cursor.append(element);\n    }\n\n    this.cursor = element;\n  }\n\n  onEndElement(name) {\n    const { cursor } = this;\n    if (name !== cursor.name) {\n      // <foo></bar>\n      this.emit(\"error\", new XMLError(`${cursor.name} must be closed.`));\n      return;\n    }\n\n    if (cursor.parent) {\n      this.cursor = cursor.parent;\n      return;\n    }\n\n    if (cursor.is(\"open\", \"urn:ietf:params:xml:ns:xmpp-framing\")) {\n      this.emit(\"start\", cursor);\n    } else if (cursor.is(\"close\", \"urn:ietf:params:xml:ns:xmpp-framing\")) {\n      this.emit(\"end\", cursor);\n    } else {\n      this.emit(\"element\", cursor);\n    }\n\n    this.cursor = null;\n  }\n};\n","\"use strict\";\n\nconst WS = require(\"ws\");\nconst WebSocket = global.WebSocket || WS;\nconst EventEmitter = require(\"events\");\n\nconst CODE = \"ECONNERROR\";\n\nclass Socket extends EventEmitter {\n  constructor() {\n    super();\n    this.listeners = Object.create(null);\n  }\n\n  connect(url) {\n    this.url = url;\n    this._attachSocket(new WebSocket(url, [\"xmpp\"]));\n  }\n\n  _attachSocket(socket) {\n    this.socket = socket;\n    const { listeners } = this;\n    listeners.open = () => {\n      this.emit(\"connect\");\n    };\n\n    listeners.message = ({ data }) => this.emit(\"data\", data);\n    listeners.error = (event) => {\n      const { url } = this;\n      // WS\n      let { error } = event;\n      // DOM\n      if (!error) {\n        error = new Error(`WebSocket ${CODE} ${url}`);\n        error.errno = CODE;\n        error.code = CODE;\n      }\n\n      error.event = event;\n      error.url = url;\n      this.emit(\"error\", error);\n    };\n\n    listeners.close = (event) => {\n      this._detachSocket();\n      this.emit(\"close\", !event.wasClean, event);\n    };\n\n    this.socket.addEventListener(\"open\", listeners.open);\n    this.socket.addEventListener(\"message\", listeners.message);\n    this.socket.addEventListener(\"error\", listeners.error);\n    this.socket.addEventListener(\"close\", listeners.close);\n  }\n\n  _detachSocket() {\n    delete this.url;\n    const { socket, listeners } = this;\n    for (const k of Object.getOwnPropertyNames(listeners)) {\n      socket.removeEventListener(k, listeners[k]);\n      delete listeners[k];\n    }\n    delete this.socket;\n  }\n\n  end() {\n    this.socket.close();\n  }\n\n  write(data, fn) {\n    if (WebSocket === WS) {\n      this.socket.send(data, fn);\n    } else {\n      this.socket.send(data);\n      fn();\n    }\n  }\n}\n\nmodule.exports = Socket;\n","\"use strict\";\n\nconst Element = require(\"ltx/lib/Element\");\nconst createElement = require(\"ltx/lib/createElement\");\nconst Parser = require(\"./lib/Parser\");\nconst {\n  escapeXML,\n  unescapeXML,\n  escapeXMLText,\n  unescapeXMLText,\n} = require(\"ltx/lib/escape\");\nconst XMLError = require(\"./lib/XMLError\");\n\nfunction xml(...args) {\n  return createElement(...args);\n}\n\nmodule.exports = xml;\n\nObject.assign(module.exports, {\n  Element,\n  createElement,\n  Parser,\n  escapeXML,\n  unescapeXML,\n  escapeXMLText,\n  unescapeXMLText,\n  XMLError,\n});\n","\"use strict\";\n\nconst LtxParser = require(\"ltx/lib/parsers/ltx\");\nconst Element = require(\"ltx/lib/Element\");\nconst EventEmitter = require(\"events\");\nconst XMLError = require(\"./XMLError\");\n\nclass Parser extends EventEmitter {\n  constructor() {\n    super();\n    const parser = new LtxParser();\n    this.root = null;\n    this.cursor = null;\n\n    parser.on(\"startElement\", this.onStartElement.bind(this));\n    parser.on(\"endElement\", this.onEndElement.bind(this));\n    parser.on(\"text\", this.onText.bind(this));\n\n    this.parser = parser;\n  }\n\n  onStartElement(name, attrs) {\n    const element = new Element(name, attrs);\n\n    const { root, cursor } = this;\n\n    if (!root) {\n      this.root = element;\n      this.emit(\"start\", element);\n    } else if (cursor !== root) {\n      cursor.append(element);\n    }\n\n    this.cursor = element;\n  }\n\n  onEndElement(name) {\n    const { root, cursor } = this;\n    if (name !== cursor.name) {\n      // <foo></bar>\n      this.emit(\"error\", new XMLError(`${cursor.name} must be closed.`));\n      return;\n    }\n\n    if (cursor === root) {\n      this.emit(\"end\", root);\n      return;\n    }\n\n    if (!cursor.parent) {\n      cursor.parent = root;\n      this.emit(\"element\", cursor);\n      this.cursor = root;\n      return;\n    }\n\n    this.cursor = cursor.parent;\n  }\n\n  onText(str) {\n    const { cursor } = this;\n    if (!cursor) {\n      this.emit(\"error\", new XMLError(`${str} must be a child.`));\n      return;\n    }\n\n    cursor.t(str);\n  }\n\n  write(data) {\n    this.parser.write(data);\n  }\n\n  end(data) {\n    if (data) {\n      this.parser.write(data);\n    }\n  }\n}\n\nParser.XMLError = XMLError;\n\nmodule.exports = Parser;\n","\"use strict\";\n\nmodule.exports = class XMLError extends Error {\n  constructor(...args) {\n    super(...args);\n    this.name = \"XMLError\";\n  }\n};\n","\"use strict\";\n\nconst Parser = require(\"./Parser\");\n\nmodule.exports = function parse(data) {\n  const p = new Parser();\n\n  let result = null;\n  let error = null;\n\n  p.on(\"start\", (el) => {\n    result = el;\n  });\n  p.on(\"element\", (el) => {\n    result.append(el);\n  });\n  p.on(\"error\", (err) => {\n    error = err;\n  });\n\n  p.write(data);\n  p.end();\n\n  if (error) {\n    throw error;\n  } else {\n    return result;\n  }\n};\n","const Utils = require('./cubeInternalUtils');\nconst config = require('./cubeConfig');\n\nclass AddressBookService {\n  constructor(proxy) {\n    this.proxy = proxy;\n  }\n\n  uploadAddressBook(list, opts) {\n    if (!Utils.isArray(list)) {\n      new Error('First parameter must be an Array.');\n      return;\n    }\n\n    const data = { contacts: list };\n\n    if (opts) {\n      if (opts.force) {\n        data.force = opts.force;\n      }\n\n      if (opts.udid) {\n        data.udid = opts.udid;\n      }\n    }\n\n    const ajaxParams = {\n      type: 'POST',\n      url: Utils.getUrl(config.urls.addressbook),\n      data: data,\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  get(udid) {\n    const ajaxParams = {\n      type: 'GET',\n      url: Utils.getUrl(config.urls.addressbook),\n    };\n    if (udid) {\n      ajaxParams.data = { udid: udid };\n    }\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  getRegisteredUsers(isCompact) {\n    const ajaxParams = {\n      type: 'GET',\n      url: Utils.getUrl(config.urls.addressbookRegistered),\n    };\n    if (isCompact) {\n      ajaxParams.data = { compact: 1 };\n    }\n\n    return this.proxy.ajax(ajaxParams);\n  }\n}\n\nmodule.exports = AddressBookService;\n","const config = require('./cubeConfig');\nconst Utils = require('./cubeInternalUtils');\n\nclass AuthService {\n  constructor(proxy) {\n    this.proxy = proxy;\n    this.webSessionCheckInterval = null;\n  }\n\n  setSession(session) {\n    this.proxy.setSession(session);\n  }\n\n  getSession() {\n    const ajaxParams = {\n      type: 'GET',\n      url: Utils.getUrl(config.urls.session),\n    };\n\n    return new Promise((resolve, reject) => {\n      this.proxy\n        .ajax(ajaxParams)\n        .then((res) => {\n          resolve(res.session);\n        })\n        .catch((error) => {\n          reject(error);\n        });\n    });\n  }\n\n  createSession(params = {}) {\n    if (config.creds.appId === '' || config.creds.authKey === '' || config.creds.authSecret === '') {\n      throw new Error('Cannot create a new session without app credentials (app ID, auth key and auth secret)');\n    }\n\n    const route = params && params.hasOwnProperty('long') ? config.urls.webSession : config.urls.session;\n\n    const sessionParams = Utils.generateCreateSessionParams(params);\n    sessionParams.signature = Utils.signParams(sessionParams, config.creds.authSecret);\n\n    const ajaxParams = {\n      type: 'POST',\n      url: Utils.getUrl(route),\n      data: sessionParams,\n    };\n\n    return new Promise((resolve, reject) => {\n      this.proxy\n        .ajax(ajaxParams)\n        .then((res) => {\n          const response = res.qr_code ? res.qr_code : res.session;\n          this.proxy.setSession(res.session);\n          this.proxy.setCurrentUserId(res.session.user_id);\n          resolve(response);\n        })\n        .catch((error) => {\n          reject(error);\n        });\n    });\n  }\n\n  destroySession() {\n    const ajaxParams = {\n      type: 'DELETE',\n      url: Utils.getUrl(config.urls.session),\n      dataType: 'text',\n    };\n\n    return new Promise((resolve, reject) => {\n      this.proxy\n        .ajax(ajaxParams)\n        .then((res) => {\n          this.proxy.setSession(null);\n          this.proxy.setCurrentUserId(null);\n\n          resolve();\n        })\n        .catch((error) => {\n          reject(error);\n        });\n    });\n  }\n\n  createWebSession(params) {\n    if (!params) {\n      params = {\n        long: 0,\n      };\n    }\n\n    return this.createSession(params);\n  }\n\n  checkWebSessionUntilUpgrade(callback) {\n    const interval = config.webSession.getSessionTimeInterval;\n    const timeoutError = new Error('The web session check interval was stopped (timeout)');\n\n    let timeleft = config.webSession.getSessionTimeout;\n\n    const _clearWebSessionCheckTimer = () => {\n      this.webSessionCheckInterval && clearInterval(this.webSessionCheckInterval);\n    };\n\n    _clearWebSessionCheckTimer();\n\n    this.webSessionCheckInterval = setInterval(() => {\n      this.getSession()\n        .then((session) => {\n          if (session.user_id !== 0) {\n            _clearWebSessionCheckTimer();\n            this.proxy.setCurrentUserId(session.user_id);\n            this.proxy.setSession(session);\n            callback(null, session);\n          } else {\n            if (timeleft > interval) {\n              timeleft -= interval;\n            } else {\n              _clearWebSessionCheckTimer();\n              callback(timeoutError, null);\n            }\n          }\n        })\n        .catch((error) => {\n          _clearWebSessionCheckTimer();\n          callback(error, null);\n        });\n    }, interval * 1000);\n\n    return this.webSessionCheckInterval;\n  }\n\n  upgradeWebSession(webToken) {\n    const ajaxParams = {\n      type: 'PATCH',\n      url: Utils.getUrl(config.urls.webSession),\n      dataType: 'text',\n      data: {\n        web_token: webToken,\n      },\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  login(params) {\n    const ajaxParams = {\n      type: 'POST',\n      url: Utils.getUrl(config.urls.login),\n      data: params,\n    };\n\n    return new Promise((resolve, reject) => {\n      this.proxy\n        .ajax(ajaxParams)\n        .then((res) => {\n          this.proxy.setCurrentUserId(res.user.id);\n          resolve(res.user);\n        })\n        .catch((error) => {\n          reject(error);\n        });\n    });\n  }\n\n  logout() {\n    const ajaxParams = {\n      type: 'DELETE',\n      url: Utils.getUrl(config.urls.login),\n      dataType: 'text',\n    };\n\n    this.proxy.setCurrentUserId(null);\n\n    return this.proxy.ajax(ajaxParams);\n  }\n}\n\nmodule.exports = AuthService;\n","const config = {\n  version: require('../package.json').version,\n  creds: {\n    appId: '',\n    authKey: '',\n    authSecret: '',\n  },\n  endpoints: {\n    api: 'api.connectycube.com',\n    chat: 'chat.connectycube.com',\n    muc: 'muc.chat.connectycube.com',\n  },\n  hash: 'sha1',\n  chatProtocol: {\n    bosh: 'https://chat.connectycube.com:5281',\n    websocket: 'wss://chat.connectycube.com:5291',\n    active: 2,\n  },\n  webSession: {\n    getSessionTimeInterval: 3,\n    getSessionTimeout: 120,\n  },\n  chat: {\n    contactList: {\n      subscriptionMode: {\n        mutual: true,\n      },\n    },\n    streamManagement: {\n      enable: false,\n    },\n    ping: {\n      enable: false,\n      timeInterval: 60,\n    },\n    reconnect: {\n      enable: true,\n      timeInterval: 5,\n    },\n  },\n  videochat: {\n    alwaysRelayCalls: false,\n    answerTimeInterval: 60,\n    dialingTimeInterval: 5,\n    disconnectTimeInterval: 30,\n    statsReportTimeInterval: false,\n    iceServers: [\n      {\n        urls: 'stun:stun.l.google.com:19302',\n      },\n      {\n        urls: 'stun:turn.connectycube.com',\n      },\n      {\n        urls: 'turn:turn.connectycube.com:5349?transport=udp',\n        username: 'connectycube',\n        credential: '4c29501ca9207b7fb9c4b4b6b04faeb1',\n      },\n      {\n        urls: 'turn:turn.connectycube.com:5349?transport=tcp',\n        username: 'connectycube',\n        credential: '4c29501ca9207b7fb9c4b4b6b04faeb1',\n      },\n    ],\n  },\n  conference: { server: 'wss://janus.connectycube.com:8989' },\n  whiteboard: { server: 'https://whiteboard.connectycube.com' },\n  urls: {\n    session: 'session',\n    webSession: 'session/web',\n    login: 'login',\n    users: 'users',\n    chat: 'chat',\n    blobs: 'blobs',\n    subscriptions: 'subscriptions',\n    events: 'events',\n    data: 'data',\n    addressbook: 'address_book',\n    addressbookRegistered: 'address_book/registered_users',\n    meetings: 'meetings',\n    whiteboards: 'whiteboards',\n    calls: 'calls',\n    type: '.json',\n  },\n  on: {\n    sessionExpired: null,\n    xmppDataWrite: null,\n    xmppDataRead: null,\n  },\n  timeout: null,\n  debug: {\n    mode: 0,\n  },\n};\n\nconfig.set = function (options) {\n  if (typeof options.endpoints === 'object' && options.endpoints.chat) {\n    config.endpoints.muc = 'muc.' + options.endpoints.chat;\n    config.chatProtocol.bosh = 'https://' + options.endpoints.chat + ':5281';\n    config.chatProtocol.websocket = 'wss://' + options.endpoints.chat + ':5291';\n  }\n\n  Object.keys(options).forEach(function (key) {\n    if (key !== 'set' && config.hasOwnProperty(key)) {\n      if (typeof options[key] !== 'object') {\n        config[key] = options[key];\n      } else {\n        Object.keys(options[key]).forEach(function (nextkey) {\n          if (config[key].hasOwnProperty(nextkey)) {\n            config[key][nextkey] = options[key][nextkey];\n          }\n        });\n      }\n    }\n  });\n};\n\nmodule.exports = config;\n","const config = require('./cubeConfig');\nconst Utils = require('./cubeInternalUtils');\n\nclass DataService {\n  constructor(proxy) {\n    this.proxy = proxy;\n  }\n\n  create(className, data) {\n    const ajaxParams = { type: 'POST' };\n\n    if (Utils.isArray(data)) {\n      ajaxParams.url = Utils.getUrl(config.urls.data, `${className}/multi`);\n      ajaxParams.data = { record: {} };\n\n      data.forEach((item, index) => (ajaxParams.data.record[index] = item));\n    } else {\n      ajaxParams.url = Utils.getUrl(config.urls.data, className);\n      ajaxParams.data = data;\n    }\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  list(className, data = {}) {\n    const ajaxParams = {};\n\n    if (typeof data === 'string') {\n      ajaxParams.url = Utils.getUrl(config.urls.data, `${className}/${data}`);\n    } else if (Utils.isArray(data)) {\n      ajaxParams.url = Utils.getUrl(config.urls.data, `${className}/${data.toString()}`);\n    } else if (Utils.isObject(data)) {\n      ajaxParams.url = Utils.getUrl(config.urls.data, className);\n      ajaxParams.data = data;\n    }\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  readPermissions(className, id) {\n    const ajaxParams = {\n      url: Utils.getUrl(config.urls.data, `${className}/${id}`),\n      data: { permissions: 1 },\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  update(className, data = {}) {\n    const ajaxParams = { type: 'PUT' };\n\n    if (Utils.isArray(data)) {\n      ajaxParams.url = Utils.getUrl(config.urls.data, `${className}/multi`);\n      ajaxParams.data = { record: {} };\n\n      data.forEach((item, index) => {\n        const record = item.id ? item : { id: item._id, ...item };\n        ajaxParams.data.record[index + 1] = record;\n      });\n    } else if (data.search_criteria) {\n      ajaxParams.url = Utils.getUrl(config.urls.data, `${className}/by_criteria`);\n      ajaxParams.data = data;\n    } else {\n      ajaxParams.url = Utils.getUrl(config.urls.data, `${className}/${data._id || data.id}`);\n      ajaxParams.data = data;\n    }\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  delete(className, requestedData) {\n    const typesData = {\n      id: 1,\n      ids: 2,\n      criteria: 3,\n    };\n\n    const ajaxParams = {\n      type: 'DELETE',\n    };\n\n    /** Define what type of data passed by client */\n    let requestedTypeOf;\n    if (typeof requestedData === 'string') {\n      requestedTypeOf = typesData.id;\n    } else if (Utils.isArray(requestedData)) {\n      requestedTypeOf = requestedData.length > 1 ? typesData.ids : typesData.id;\n    } else if (Utils.isObject(requestedData)) {\n      requestedTypeOf = typesData.criteria;\n    }\n\n    if (requestedTypeOf === typesData.id) {\n      ajaxParams.url = Utils.getUrl(config.urls.data, `${className}/${requestedData}`);\n      ajaxParams.dataType = 'text';\n    } else if (requestedTypeOf === typesData.ids) {\n      ajaxParams.url = Utils.getUrl(config.urls.data, `${className}/${requestedData.toString()}`);\n    } else if (requestedTypeOf === typesData.criteria) {\n      ajaxParams.url = Utils.getUrl(config.urls.data, `${className}/by_criteria`);\n      ajaxParams.data = requestedData;\n    }\n\n    return this.proxy.ajax(ajaxParams);\n  }\n}\n\nmodule.exports = DataService;\n","const Utils = require('./cubeInternalUtils');\n\nlet fetchImpl, formDataImpl;\n\nlet _adapter,\n  _mediaDevices,\n  _MediaStream,\n  _MediaStreamTrack,\n  _RTCPeerConnection,\n  _RTCSessionDescription,\n  _RTCIceCandidate,\n  _RTCRtpReceiver,\n  _RTCRtpSender,\n  _navigator;\n\nif (Utils.getEnv().browser) {\n  fetchImpl = fetch;\n  formDataImpl = FormData;\n\n  _adapter = window.adapter;\n  _navigator = navigator;\n  _mediaDevices = navigator.mediaDevices;\n  _MediaStream = window.MediaStream;\n  _MediaStreamTrack = window.MediaStreamTrack;\n  _RTCIceCandidate = window.RTCIceCandidate;\n  _RTCPeerConnection = window.RTCPeerConnection;\n  _RTCSessionDescription = window.RTCSessionDescription;\n  _RTCRtpReceiver = window.RTCRtpReceiver;\n  _RTCRtpSender = window.RTCRtpSender;\n} else if (Utils.getEnv().node) {\n  fetchImpl = require('node-fetch').default;\n  formDataImpl = require('form-data');\n}\n\nmodule.exports = {\n  fetchImpl: fetchImpl,\n  formDataImpl: formDataImpl,\n  // WebRTC\n  adapter: _adapter,\n  mediaDevices: _mediaDevices,\n  MediaStream: _MediaStream,\n  MediaStreamTrack: _MediaStreamTrack,\n  RTCIceCandidate: _RTCIceCandidate,\n  RTCPeerConnection: _RTCPeerConnection,\n  RTCRtpReceiver: _RTCRtpReceiver,\n  RTCRtpSender: _RTCRtpSender,\n  RTCSessionDescription: _RTCSessionDescription,\n  navigator: _navigator,\n};\n","const config = require('./cubeConfig');\n\nconst IS_BROWSER_ENV = typeof window === 'object' && typeof document === 'object';\nconst IS_RN_ENV = typeof navigator === 'object' && navigator.product === 'ReactNative';\nconst IS_NS_ENV =\n  typeof global === 'object' && (typeof global.android !== 'undefined' || typeof global.NSObject !== 'undefined');\nconst IS_NODE_ENV = typeof process === 'object' && typeof process.versions === 'object' && !!process.versions.node;\nconst IS_EXPO_ENV = typeof global.Expo !== 'undefined';\nclass InternalUtils {\n  static getEnv() {\n    return {\n      nativescript: IS_NS_ENV,\n      reactnative: IS_RN_ENV,\n      browser: IS_BROWSER_ENV,\n      node: IS_NODE_ENV,\n      expo: IS_EXPO_ENV,\n    };\n  }\n\n  static isRNWebRTCAvailable() {\n    if (IS_RN_ENV && !IS_EXPO_ENV) {\n      const {\n        RTCView,\n        RTCPeerConnection,\n        RTCIceCandidate,\n        RTCSessionDescription,\n        MediaStream,\n        mediaDevices,\n      } = require('./cubeDependencies');\n\n      return RTCView && RTCPeerConnection && RTCIceCandidate && RTCSessionDescription && MediaStream && mediaDevices;\n    }\n\n    return false;\n  }\n\n  static isWebRTCAvailable() {\n    return (\n      (IS_RN_ENV && this.isRNWebRTCAvailable()) ||\n      (IS_BROWSER_ENV && window.RTCPeerConnection && window.RTCIceCandidate && window.RTCSessionDescription)\n    );\n  }\n\n  static safeCallbackCall() {\n    const callback = arguments[0];\n    if (typeof callback !== 'function') {\n      return;\n    }\n\n    const callbackString = callback.toString();\n    const callbackName = callbackString.split('(')[0].split(' ')[1];\n\n    const argumentsCopy = [];\n    let listenerCall;\n\n    for (let i = 0; i < arguments.length; i++) {\n      argumentsCopy.push(arguments[i]);\n    }\n\n    listenerCall = argumentsCopy.shift();\n\n    try {\n      listenerCall.apply(null, argumentsCopy);\n    } catch (err) {\n      if (callbackName === '') {\n        console.error('Error: ' + err);\n      } else {\n        console.error('Error in listener ' + callbackName + ': ' + err);\n      }\n    }\n  }\n\n  static randomNonce() {\n    return Math.floor(Math.random() * 10000);\n  }\n\n  static unixTime() {\n    return Math.floor(Date.now() / 1000);\n  }\n\n  static getUrl(base, id, extension) {\n    let resource = `${id ? '/' + id : ''}`;\n    extension = `${extension ? '/' + extension : ''}`;\n    return `https://${config.endpoints.api}/${base}${resource}${extension}${config.urls.type}`;\n  }\n\n  static isArray(arr) {\n    return Object.prototype.toString.call(arr) === '[object Array]';\n  }\n\n  static isObject(obj) {\n    return Object.prototype.toString.call(obj) === '[object Object]';\n  }\n\n  static getBsonObjectId() {\n    const timestamp = this.unixTime().toString(16);\n    const increment = (ObjectId.increment++).toString(16);\n\n    if (increment > 0xffffff) ObjectId.increment = 0;\n\n    return (\n      '00000000'.substr(0, 8 - timestamp.length) +\n      timestamp +\n      '000000'.substr(0, 6 - ObjectId.machine.length) +\n      ObjectId.machine +\n      '0000'.substr(0, 4 - ObjectId.pid.length) +\n      ObjectId.pid +\n      '000000'.substr(0, 6 - increment.length) +\n      increment\n    );\n  }\n\n  static DLog() {\n    if (this.loggers) {\n      for (let i = 0; i < this.loggers.length; ++i) {\n        this.loggers[i](arguments);\n      }\n\n      return;\n    }\n\n    let logger;\n\n    this.loggers = [];\n\n    const consoleLoggerFunction = function () {\n      const logger = function (args) {\n        console.log.apply(console, Array.prototype.slice.call(args));\n      };\n\n      return logger;\n    };\n\n    if (typeof config.debug === 'object') {\n      if (typeof config.debug.mode === 'number') {\n        if (config.debug.mode == 1) {\n          logger = consoleLoggerFunction();\n          this.loggers.push(logger);\n        }\n      } else if (typeof config.debug.mode === 'object') {\n        config.debug.mode.forEach(function (mode) {\n          if (mode === 1) {\n            logger = consoleLoggerFunction();\n            this.loggers.push(logger);\n          }\n        });\n      }\n    }\n\n    if (this.loggers) {\n      for (let j = 0; j < this.loggers.length; ++j) {\n        this.loggers[j](arguments);\n      }\n    }\n  }\n\n  static isExpiredSessionError(error) {\n    try {\n      return error && error.code === 401 && error.info.errors.base[0] === 'Required session does not exist';\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  static mergeArrays(arrayTo, arrayFrom) {\n    const merged = this.cloneObject(arrayTo);\n\n    firstLevel: for (let i = 0; i < arrayFrom.length; i++) {\n      const newItem = arrayFrom[i];\n\n      for (let j = 0; j < merged.length; j++) {\n        if (newItem.user_id === merged[j].user_id) {\n          merged[j] = newItem;\n          continue firstLevel;\n        }\n      }\n      merged.push(newItem);\n    }\n    return merged;\n  }\n\n  static toBase64(str) {\n    if (this.getEnv().browser) {\n      return btoa(\n        encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) {\n          return String.fromCharCode('0x' + p1);\n        })\n      );\n    } else if (this.getEnv().reactnative) {\n      return global.encodeToBase64(str);\n    } else {\n      // Node.js & NativeScript\n      return Buffer.from(str).toString('base64');\n    }\n  }\n\n  static generateCreateSessionParams(params = {}) {\n    const message = {\n      application_id: config.creds.appId,\n      auth_key: config.creds.authKey,\n      nonce: this.randomNonce(),\n      timestamp: params.timestamp || this.unixTime(),\n    };\n\n    if (params) {\n      if (params.guest) {\n        message.user = params;\n      } else if (params.login && params.password) {\n        message.user = { login: params.login, password: params.password };\n      } else if (params.email && params.password) {\n        message.user = { email: params.email, password: params.password };\n      } else if (params.provider) {\n        // Via social networking provider (e.g. facebook, twitter etc.)\n        message.provider = params.provider;\n        if (params.scope) {\n          message.scope = params.scope;\n        }\n        if (params.keys && params.keys.token) {\n          message.keys = { token: params.keys.token };\n        }\n        if (params.keys && params.keys.secret) {\n          message.keys.secret = params.keys.secret;\n        }\n      } else if (params.hasOwnProperty('long')) {\n        message.long = params.long;\n      }\n    }\n\n    return message;\n  }\n\n  static signParams(message, secret) {\n    const sessionMsg = Object.keys(message)\n      .map(function (val) {\n        if (typeof message[val] === 'object') {\n          return Object.keys(message[val])\n            .map(function (val1) {\n              return val + '[' + val1 + ']=' + message[val][val1];\n            })\n            .sort()\n            .join('&');\n        } else {\n          return val + '=' + message[val];\n        }\n      })\n      .sort()\n      .join('&');\n\n    let cryptoSessionMsg;\n\n    if (config.hash === 'sha1') {\n      const sha1 = require('crypto-js/hmac-sha1');\n      cryptoSessionMsg = sha1(sessionMsg, secret).toString();\n    } else if (config.hash === 'sha256') {\n      const sha256 = require('crypto-js/hmac-sha256');\n      cryptoSessionMsg = sha256(sessionMsg, secret).toString();\n    } else {\n      throw new Error('Unknown crypto standards, available sha1 or sha256');\n    }\n\n    return cryptoSessionMsg;\n  }\n\n  static getSizeOfString(str) {\n    return new Blob([str]).size;\n  }\n\n  static getDateSize(data) {\n    let size = 0;\n    if (data.body) {\n      let body = data.body;\n      if (typeof body != 'string') {\n        body = JSON.stringify(body);\n      }\n      size += this.getSizeOfString(body);\n    }\n    if (data.headers) {\n      size += this.getSizeOfString(JSON.stringify(data.headers));\n    }\n    return size;\n  }\n\n  static callTrafficUsageCallback(callbackName, data) {\n    if (typeof config.on[callbackName] === 'function') {\n      config.on[callbackName](this.getDateSize(data));\n    }\n  }\n\n  static cloneObject(obj = {}, escapeNull = false) {\n    try {\n      const json = JSON.stringify(obj);\n      const jsonObject = escapeNull ? json.replace(/null/g, '\"\"') : json;\n\n      return JSON.parse(jsonObject);\n    } catch (error) {\n      return obj;\n    }\n  }\n}\n\n// The object for type MongoDB.Bson.ObjectId\n// http://docs.mongodb.org/manual/reference/object-id/\nconst ObjectId = {\n  machine: Math.floor(Math.random() * 16777216).toString(16),\n  pid: Math.floor(Math.random() * 32767).toString(16),\n  increment: 0,\n};\n\nmodule.exports = InternalUtils;\n","const config = require('./cubeConfig');\nconst Utils = require('./cubeInternalUtils');\n\nclass ConnectyCube {\n  constructor() {\n    // React Native RTCView\n    if (Utils.getEnv().reactnative && Utils.isWebRTCAvailable()) {\n      this.RTCView = require('./cubeDependencies').RTCView;\n    }\n  }\n\n  init(credentials, configMap = undefined) {\n    if (configMap && typeof configMap === 'object') {\n      config.set(configMap);\n    }\n\n    const Proxy = require('./cubeProxy');\n    const Auth = require('./cubeAuth');\n    const Users = require('./cubeUsers');\n    const Storage = require('./cubeStorage');\n    const PushNotifications = require('./cubePushNotifications');\n    const Data = require('./cubeData');\n    const AddressBook = require('./cubeAddressBook');\n    const Chat = require('./messaging/cubeChat');\n    const DialogProxy = require('./messaging/cubeDialog');\n    const MessageProxy = require('./messaging/cubeMessage');\n    const Meeting = require('./cubeMeeting');\n    const Whiteboard = require('./cubeWhiteboard');\n\n    this.service = new Proxy();\n    this.auth = new Auth(this.service);\n    this.users = new Users(this.service);\n    this.storage = new Storage(this.service);\n    this.pushnotifications = new PushNotifications(this.service);\n    this.data = new Data(this.service);\n    this.addressbook = new AddressBook(this.service);\n    this.chat = new Chat(this.service);\n    this.chat.dialog = new DialogProxy(this.service);\n    this.chat.message = new MessageProxy(this.service);\n    this.meeting = new Meeting(this.service);\n    this.whiteboard = new Whiteboard(this.service);\n    this.utils = Utils;\n\n    // add WebRTC API if API is available\n    if (Utils.isWebRTCAvailable()) {\n      // p2p calls client\n      const WebRTCClient = require('./videocalling/cubeWebRTCClient');\n      // conf calls client\n      const ConferenceClient = require('./videocalling_conference/cubeConferenceClient');\n\n      this.videochat = new WebRTCClient(this.chat.xmppClient, this.service);\n      this.videochatconference = new ConferenceClient(this.service);\n      this.chat.webrtcSignalingProcessor = this.videochat.signalingProcessor;\n    } else {\n      this.videochat = null;\n      this.videochatconference = null;\n    }\n\n    // Initialization by outside token\n    if (credentials.token) {\n      config.creds.appId = credentials.appId;\n      this.service.setSession({ token: credentials.token });\n    } else {\n      config.creds.appId = credentials.appId;\n      config.creds.authKey = credentials.authKey;\n      config.creds.authSecret = credentials.authSecret;\n    }\n  }\n\n  setSession(session) {\n    this.auth.setSession(session);\n  }\n\n  getSession() {\n    return this.auth.getSession();\n  }\n\n  createSession(params = {}) {\n    return this.auth.createSession(params);\n  }\n\n  destroySession() {\n    return this.auth.destroySession();\n  }\n\n  createWebSession(params = null) {\n    return this.auth.createWebSession(params);\n  }\n\n  checkWebSessionUntilUpgrade(callback) {\n    return this.auth.checkWebSessionUntilUpgrade(callback);\n  }\n\n  upgradeWebSession(webToken) {\n    return this.auth.upgradeWebSession(webToken);\n  }\n\n  login(params) {\n    return this.auth.login(params);\n  }\n\n  logout() {\n    return this.auth.logout();\n  }\n}\n\nconst CB = new ConnectyCube();\nCB.ConnectyCube = ConnectyCube;\nmodule.exports = CB;\n","const Config = require('./cubeConfig');\nconst Utils = require('./cubeInternalUtils');\n\nconst MEETINGS_API_URL = Config.urls.meetings;\n\nclass MeetingService {\n  constructor(proxy) {\n    this.proxy = proxy;\n  }\n\n  get(params = {}) {\n    const ajaxParams = {\n      type: 'GET',\n      url: Utils.getUrl(MEETINGS_API_URL),\n      data: params,\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  create(params = {}) {\n    const MINUTE = 60;\n    const startTimestamp = Math.ceil(Date.now() / 1000);\n    const endTimestamp = startTimestamp + 60 * MINUTE;\n    const defaultName = new Date(startTimestamp).toLocaleString('en', {\n      year: 'numeric',\n      month: 'long',\n      day: 'numeric',\n      hour: 'numeric',\n      minute: 'numeric',\n    });\n    const defaultParams = {\n      name: defaultName,\n      start_date: startTimestamp,\n      end_date: endTimestamp,\n      attendees: [],\n      record: false,\n      chat: false,\n    };\n    const ajaxParams = {\n      type: 'POST',\n      url: Utils.getUrl(MEETINGS_API_URL),\n      data: { ...defaultParams, ...params },\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  update(id, params) {\n    const ajaxParams = {\n      type: 'PUT',\n      url: Utils.getUrl(MEETINGS_API_URL, id),\n      data: params,\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  delete(id) {\n    const ajaxParams = {\n      type: 'DELETE',\n      url: Utils.getUrl(MEETINGS_API_URL, id),\n      dataType: 'text',\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  getRecordings(id) {\n    const ajaxParams = {\n      type: 'GET',\n      url: Utils.getUrl(MEETINGS_API_URL, `recordings/${id}`),\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n}\n\nmodule.exports = MeetingService;\n","const config = require('./cubeConfig');\nconst Utils = require('./cubeInternalUtils');\nconst fetchImpl = require('./cubeDependencies').fetchImpl;\nconst formDataImpl = require('./cubeDependencies').formDataImpl;\n\nclass HTTPProxy {\n  constructor() {\n    this.sdkInstance = {\n      config: config,\n      session: null,\n    };\n\n    this.currentUserId = null;\n    this.requestsNumber = 0;\n    this.fetchImpl = fetchImpl;\n    this.abortControllersMap = {};\n  }\n\n  setSession(session) {\n    this.sdkInstance.session = session;\n\n    if (session && session.user_id) {\n      this.setCurrentUserId(session.user_id);\n    }\n  }\n\n  getSession() {\n    return this.sdkInstance.session;\n  }\n\n  setCurrentUserId(userId) {\n    this.currentUserId = userId;\n  }\n\n  getCurrentUserId() {\n    return this.currentUserId;\n  }\n\n  logRequest(params, requestId) {\n    Utils.DLog(`[Request][${requestId}]`, `${params.type || 'GET'} ${params.url}`, params);\n  }\n\n  logResponse(response, requestId) {\n    Utils.DLog(`[Response][${requestId}]`, response);\n  }\n\n  buildRequestAndURL(params) {\n    const isGetOrHeadType = !params.type || params.type === 'GET' || params.type === 'HEAD';\n    const isPostOrPutType = params.type && (params.type === 'POST' || params.type === 'PUT');\n    const token = this.sdkInstance && this.sdkInstance.session && this.sdkInstance.session.token;\n    const isInternalRequest = params.url.indexOf('s3.amazonaws.com') === -1;\n    const isMultipartFormData = params.contentType === false;\n\n    let requestBody;\n    let requestURL = params.url;\n    const requestObject = {};\n\n    requestObject.method = params.type || 'GET';\n\n    if (params.data) {\n      requestBody = this.buildRequestBody(params, isMultipartFormData, isPostOrPutType);\n\n      if (isGetOrHeadType) {\n        requestURL += '?' + requestBody;\n      } else {\n        requestObject.body = requestBody;\n      }\n    }\n\n    if (!isMultipartFormData) {\n      requestObject.headers = {\n        'Content-Type': isPostOrPutType\n          ? 'application/json;charset=utf-8'\n          : 'application/x-www-form-urlencoded; charset=UTF-8',\n      };\n    }\n\n    if (isInternalRequest) {\n      if (!requestObject.headers) {\n        requestObject.headers = {};\n      }\n\n      requestObject.headers['CB-SDK'] = 'JS ' + config.version + ' - Client';\n\n      if (token) {\n        requestObject.headers['CB-Token'] = token;\n      }\n    }\n\n    if (config.timeout) {\n      requestObject.timeout = config.timeout;\n    }\n\n    return [requestObject, requestURL];\n  }\n\n  buildRequestBody(params, isMultipartFormData, isPostOrPutType) {\n    const data = params.data;\n    const useArrayQuery = params.useArrayQuery;\n\n    let dataObject;\n\n    if (isMultipartFormData) {\n      dataObject = new formDataImpl();\n\n      Object.keys(data).forEach(function (item) {\n        if (params.fileToCustomObject && item === 'file') {\n          dataObject.append(item, data[item].data, data[item].name);\n        } else {\n          dataObject.append(item, params.data[item]);\n        }\n      });\n    } else if (isPostOrPutType) {\n      dataObject = JSON.stringify(data);\n    } else {\n      dataObject = this.serializeQueryParams(data, null, useArrayQuery, 0);\n    }\n\n    return dataObject;\n  }\n\n  serializeQueryParams(obj, prefix, useArrayQuery, level) {\n    level = level || 0;\n    const parts = [];\n    let propName = void 0;\n\n    for (propName in obj) {\n      let propQueryName = this.encodeURIComponent(propName);\n      if (Utils.isArray(obj)) {\n        propQueryName = '';\n      }\n\n      const key = prefix ? prefix + `[${propQueryName}]` : propQueryName;\n      let value = obj[propName];\n\n      const isArrayVal = Utils.isArray(value);\n\n      if ((isArrayVal && (useArrayQuery || level === 0)) || Utils.isObject(value)) {\n        parts.push(this.serializeQueryParams(value, key, useArrayQuery, ++level));\n      } else {\n        value = isArrayVal ? value.sort().join(',') : value;\n        parts.push(`${key}=${this.encodeURIComponent(value)}`);\n      }\n    }\n\n    return parts.sort().join('&');\n  }\n\n  encodeURIComponent(str) {\n    return encodeURIComponent(str).replace(/[#$&+,/:;=?@\\[\\]]/g, function (c) {\n      return '%' + c.charCodeAt(0).toString(16);\n    });\n  }\n\n  abortRequest(abortId) {\n    if (this.abortControllersMap[abortId]) {\n      const controllers = this.abortControllersMap[abortId].controllers || {};\n      const controllersArray = Object.values(controllers);\n\n      controllersArray.forEach((controller) => {\n        controller.abort();\n      });\n    }\n  }\n\n  processSuccessfulOrFailedRequest(abort_id) {\n    if (!this.abortControllersMap[abort_id]) {\n      return;\n    }\n\n    const controllers = this.abortControllersMap[abort_id].controllers || {};\n    const createdControllersCount = Object.keys(controllers).length;\n\n    if (!this.abortControllersMap[abort_id].doneRequestsCount) {\n      this.abortControllersMap[abort_id].doneRequestsCount = 1;\n    } else {\n      this.abortControllersMap[abort_id].doneRequestsCount += 1;\n    }\n\n    const doneRequestsCount = this.abortControllersMap[abort_id].doneRequestsCount;\n\n    if (doneRequestsCount === createdControllersCount) {\n      delete this.abortControllersMap[abort_id];\n    }\n  }\n\n  ajax(params) {\n    const requestId = ++this.requestsNumber;\n    return new Promise((resolve, reject) => {\n      this.logRequest(params, requestId);\n\n      const requestAndURL = this.buildRequestAndURL(params);\n      let requestObject = requestAndURL[0];\n      const requestURL = requestAndURL[1];\n      const abort_id = params.abort_id;\n\n      if (abort_id) {\n        let i;\n        if (this.abortControllersMap[abort_id]) {\n          const controllers = this.abortControllersMap[abort_id].controllers || [];\n          const index = Object.keys(controllers).length;\n\n          this.abortControllersMap[abort_id].controllers.push(new AbortController());\n          i = index;\n        } else {\n          this.abortControllersMap[abort_id] = {\n            controllers: [new AbortController()],\n          };\n          i = 0;\n        }\n        const signal = this.abortControllersMap[abort_id].controllers[i].signal;\n        requestObject = { ...requestObject, signal };\n      }\n\n      let response;\n\n      // The Promise returned from fetch() won’t reject on HTTP error\n      // status even if the response is an HTTP 404 or 500.\n      // Instead, it will resolve normally (with ok status set to false),\n      // and it will only reject on network failure or if anything prevented the request from completing.\n      fetchImpl(requestURL, requestObject)\n        .then((resp) => {\n          response = resp;\n          const dataType = params.dataType || 'json';\n          return dataType === 'text' ? response.text() : response.json();\n        })\n        .then((body) => {\n          this.processSuccessfulOrFailedRequest(abort_id);\n          if (!response.ok) {\n            this.processAjaxError(response, body, null, reject, resolve, params, requestId);\n          } else {\n            this.processAjaxResponse(body, resolve, requestId);\n          }\n        })\n        .catch((error) => {\n          this.processSuccessfulOrFailedRequest(abort_id);\n          this.processAjaxError(response, ' ', error, reject, resolve, params, requestId);\n        });\n    });\n  }\n\n  processAjaxResponse(body, resolve, requestId) {\n    const responseBody = body && body !== ' ' ? body : 'empty body';\n    this.logResponse(responseBody, requestId);\n\n    resolve(body);\n  }\n\n  processAjaxError(response, body, error, reject, resolve, params, requestId) {\n    if (!response && error && !error.code) {\n      reject(error);\n      return;\n    }\n\n    const statusCode = response && (response.status || response.statusCode);\n    const errorObject = {\n      code: (response && statusCode) || (error && error.code),\n      info: (body && typeof body === 'string' && body !== ' ' ? JSON.parse(body) : body) || (error && error.errno),\n    };\n\n    const responseBody = body || error || body.errors;\n    this.logResponse(responseBody, requestId);\n\n    if (response.url.indexOf(config.urls.session) === -1) {\n      if (Utils.isExpiredSessionError(errorObject) && typeof config.on.sessionExpired === 'function') {\n        this.handleExpiredSessionResponse(errorObject, null, reject, resolve, params);\n      } else {\n        reject(errorObject);\n      }\n    } else {\n      reject(errorObject);\n    }\n  }\n\n  handleExpiredSessionResponse(error, response, reject, resolve, params) {\n    const handleResponse = () => {\n      if (error) {\n        reject(error);\n      } else {\n        resolve(response);\n      }\n    };\n\n    const retryCallback = (session) => {\n      if (session) {\n        this.setSession(session);\n        this.ajax(params).then(resolve).catch(reject);\n      }\n    };\n\n    config.on.sessionExpired(handleResponse, retryCallback);\n  }\n}\n\nmodule.exports = HTTPProxy;\n","const config = require('./cubeConfig');\nconst Utils = require('./cubeInternalUtils');\n\nclass PushNotificationsService {\n  constructor(proxy) {\n    this.proxy = proxy;\n\n    this.subscriptions = new SubscriptionsService(proxy);\n    this.events = new EventsService(proxy);\n\n    this.base64Encode = function (str) {\n      return Utils.toBase64(str);\n    };\n  }\n}\n\nclass SubscriptionsService {\n  constructor(proxy) {\n    this.proxy = proxy;\n  }\n\n  create(params) {\n    const ajaxParams = {\n      type: 'POST',\n      url: Utils.getUrl(config.urls.subscriptions),\n      data: params,\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  list() {\n    const ajaxParams = {\n      type: 'GET',\n      url: Utils.getUrl(config.urls.subscriptions),\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  delete(id) {\n    const ajaxParams = {\n      type: 'DELETE',\n      dataType: 'text',\n      url: Utils.getUrl(config.urls.subscriptions, id),\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n}\n\nclass EventsService {\n  constructor(proxy) {\n    this.proxy = proxy;\n  }\n\n  create(params) {\n    const ajaxParams = {\n      type: 'POST',\n      url: Utils.getUrl(config.urls.events),\n      data: {\n        event: params,\n      },\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n}\n\nmodule.exports = PushNotificationsService;\n","const config = require('./cubeConfig');\nconst Utils = require('./cubeInternalUtils');\n\nclass StorageService {\n  constructor(proxy) {\n    this.proxy = proxy;\n  }\n\n  list(params) {\n    const ajaxParams = {\n      type: 'GET',\n      url: Utils.getUrl(config.urls.blobs),\n      data: params,\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  create(params) {\n    const ajaxParams = {\n      type: 'POST',\n      url: Utils.getUrl(config.urls.blobs),\n      data: { blob: params },\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  delete(id) {\n    const ajaxParams = {\n      type: 'DELETE',\n      url: Utils.getUrl(config.urls.blobs, id),\n      dataType: 'text',\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  createAndUpload(params) {\n    const file = params.file;\n    const isPublic = params.public;\n    const name = params.name || file.name;\n    const size = params.size || file.size;\n    const content_type = params.type || file.type;\n    const abort_id = params.abort_id;\n    const createParams = { name, content_type, public: isPublic };\n    let blob;\n\n    return this.create(createParams)\n      .then(({ blob: blb }) => {\n        blob = blb;\n        const uri = parseUri(blob.blob_object_access.params);\n        const uploadUrl = `${uri.protocol}://${uri.authority}${uri.path}`;\n        const ajaxParams = { url: uploadUrl, data: {} };\n\n        if (abort_id) {\n          ajaxParams.abort_id = abort_id;\n        }\n\n        Object.keys(uri.queryKey).forEach((key) => {\n          ajaxParams.data[key] = decodeURIComponent(uri.queryKey[key]);\n        });\n\n        ajaxParams.data.file = file;\n\n        return this.upload(ajaxParams).then(() => blob);\n      })\n      .then((blob) => this.markUploaded({ id: blob.id, size }).then(() => blob))\n      .then((blob) => ({ ...blob, size }))\n      .catch((err) => {\n        if (blob) {\n          return { ...blob, size };\n        }\n      });\n  }\n\n  upload(params) {\n    const ajaxParams = {\n      ...params,\n      type: 'POST',\n      dataType: 'text',\n      contentType: false,\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  markUploaded(params) {\n    const ajaxParams = {\n      type: 'PUT',\n      url: Utils.getUrl(config.urls.blobs, params.id, 'complete'),\n      data: {\n        size: params.size,\n      },\n      dataType: 'text',\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  getInfo(id) {\n    const ajaxParams = {\n      url: Utils.getUrl(config.urls.blobs, id),\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  getFile(uid) {\n    const ajaxParams = {\n      url: Utils.getUrl(config.urls.blobs, uid),\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  getFileObject(uid, params) {\n    const ajaxParams = {\n      type: 'GET',\n      url: Utils.getUrl(config.urls.blobs, uid, 'object'),\n      data: params,\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  update(params) {\n    const data = {};\n    data.blob = {};\n    if (typeof params.name !== 'undefined') {\n      data.blob.name = params.name;\n    }\n\n    const ajaxParams = {\n      url: Utils.getUrl(config.urls.blobs, params.id),\n      data: data,\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  privateUrl(fileUID) {\n    return 'https://' + config.endpoints.api + '/blobs/' + fileUID + '?token=' + this.proxy.getSession().token;\n  }\n\n  publicUrl(fileUID) {\n    return 'https://' + config.endpoints.api + '/blobs/' + fileUID;\n  }\n}\n\nmodule.exports = StorageService;\n\n// parseUri 1.2.2\n// (c) Steven Levithan <stevenlevithan.com>\n// MIT License\n// http://blog.stevenlevithan.com/archives/parseuri\nfunction parseUri(str) {\n  const o = parseUri.options;\n  const m = o.parser[o.strictMode ? 'strict' : 'loose'].exec(str);\n\n  const uri = {};\n  let i = 14;\n\n  while (i--) {\n    uri[o.key[i]] = m[i] || '';\n  }\n\n  uri[o.q.name] = {};\n  uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {\n    if ($1) {\n      uri[o.q.name][$1] = $2;\n    }\n  });\n\n  return uri;\n}\n\nparseUri.options = {\n  strictMode: false,\n  key: [\n    'source',\n    'protocol',\n    'authority',\n    'userInfo',\n    'user',\n    'password',\n    'host',\n    'port',\n    'relative',\n    'path',\n    'directory',\n    'file',\n    'query',\n    'anchor',\n  ],\n  q: {\n    name: 'queryKey',\n    parser: /(?:^|&)([^&=]*)=?([^&]*)/g,\n  },\n  parser: {\n    strict:\n      /^(?:([^:\\/?#]+):)?(?:\\/\\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\\/?#]*)(?::(\\d*))?))?((((?:[^?#\\/]*\\/)*)([^?#]*))(?:\\?([^#]*))?(?:#(.*))?)/,\n    loose:\n      /^(?:(?![^:@]+:[^:@\\/]*@)([^:\\/?#.]+):)?(?:\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/,\n  },\n};\n","const config = require('./cubeConfig');\nconst Utils = require('./cubeInternalUtils');\n\nclass UsersService {\n  constructor(proxy) {\n    this.proxy = proxy;\n  }\n\n  getV2(params) {\n    const ajaxParams = {\n      type: 'GET',\n      url: Utils.getUrl(`${config.urls.users}/v2`),\n      data: params,\n      useArrayQuery: true,\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  get(params) {\n    let data = Utils.cloneObject(params);\n    let url, item;\n    const filters = [];\n\n    if (data.order) {\n      data.order = generateOrder(data.order);\n    }\n\n    if (data && data.filter) {\n      if (Utils.isArray(data.filter)) {\n        data.filter.forEach(function (el) {\n          item = generateFilter(el);\n          filters.push(item);\n        });\n      } else {\n        item = generateFilter(data.filter);\n        filters.push(item);\n      }\n      data.filter = filters;\n    }\n\n    if (typeof data === 'number') {\n      url = data;\n      data = {};\n    } else {\n      if (data.login) {\n        url = 'by_login';\n      } else if (data.full_name) {\n        url = 'by_full_name';\n      } else if (data.facebook_id) {\n        url = 'by_facebook_id';\n      } else if (data.twitter_id) {\n        url = 'by_twitter_id';\n      } else if (data.phone) {\n        url = 'phone';\n      } else if (data.email) {\n        url = 'by_email';\n      } else if (data.tags) {\n        url = 'by_tags';\n      } else if (data.external) {\n        url = 'external/' + data.external;\n        data = {};\n      }\n    }\n\n    const ajaxParams = {\n      type: 'GET',\n      url: Utils.getUrl(config.urls.users, url),\n      data: data,\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  signup(params) {\n    const ajaxParams = {\n      type: 'POST',\n      url: Utils.getUrl(config.urls.users),\n      data: {\n        user: params,\n      },\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  update(params) {\n    const ajaxParams = {\n      type: 'PUT',\n      url: Utils.getUrl(config.urls.users, this.proxy.getCurrentUserId()),\n      data: {\n        user: params,\n      },\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  delete() {\n    const ajaxParams = {\n      type: 'DELETE',\n      url: Utils.getUrl(config.urls.users, this.proxy.getCurrentUserId()),\n      dataType: 'text',\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  resetPassword(email) {\n    const ajaxParams = {\n      type: 'GET',\n      url: Utils.getUrl(config.urls.users + '/password/reset'),\n      data: {\n        email: email,\n      },\n      dataType: 'text',\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n}\n\nmodule.exports = UsersService;\n\nconst DATE_FIELDS = ['created_at', 'updated_at', 'last_request_at'];\nconst NUMBER_FIELDS = ['id', 'external_user_id'];\n\nfunction generateFilter(filter) {\n  const obj = Utils.cloneObject(filter);\n  let type = DATE_FIELDS.includes(obj.field) ? 'date' : typeof obj.value;\n\n  if (Utils.isArray(obj.value)) {\n    if (type === 'object') {\n      type = typeof obj.value[0];\n    }\n    obj.value = obj.value.toString();\n  }\n\n  return [type, obj.field, obj.param, obj.value].join(' ');\n}\n\nfunction generateOrder(obj) {\n  const type = obj.field in DATE_FIELDS ? 'date' : obj.field in NUMBER_FIELDS ? 'number' : 'string';\n  return [obj.sort, type, obj.field].join(' ');\n}\n","const Config = require('./cubeConfig');\nconst Utils = require('./cubeInternalUtils');\n\nconst WHITEBOARDS_API_URL = Config.urls.whiteboards;\nconst WHITEBOARDS_SERVER = Config.whiteboard.server;\n\nclass WhiteboardService {\n  constructor(proxy) {\n    this.proxy = proxy;\n  }\n\n  getURL({ id, title, username }) {\n    return `${WHITEBOARDS_SERVER}?whiteboardid=${id}&username=${username}&title=${title}`;\n  }\n\n  get(paramsOrId) {\n    const ajaxParams = {\n      type: 'GET',\n      url: Utils.getUrl(WHITEBOARDS_API_URL),\n      data: typeof paramsOrId === 'string' ? { chat_dialog_id: paramsOrId } : paramsOrId,\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  create(params = {}) {\n    const ajaxParams = {\n      type: 'POST',\n      url: Utils.getUrl(WHITEBOARDS_API_URL),\n      data: params,\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  update(id, params = {}) {\n    const ajaxParams = {\n      type: 'PUT',\n      url: Utils.getUrl(WHITEBOARDS_API_URL, id),\n      data: params,\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  delete(id) {\n    const ajaxParams = {\n      type: 'DELETE',\n      url: Utils.getUrl(WHITEBOARDS_API_URL, id),\n      dataType: 'text',\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n}\n\nmodule.exports = WhiteboardService;\n","const Config = require('../cubeConfig'),\n  Utils = require('../cubeInternalUtils'),\n  ChatUtils = require('./cubeChatInternalUtils'),\n  ChatHelpers = require('./cubeChatHelpers'),\n  StreamManagement = require('./cubeStreamManagement'),\n  ContactListProxy = require('./cubeContactList'),\n  PrivacyListProxy = require('./cubePrivacyList'),\n  MucProxy = require('./cubeMultiUserChat'),\n  XMPP = require('./xmpp');\n\nclass ChatService {\n  constructor(proxy) {\n    this.proxy = proxy;\n\n    this.xmppClient = XMPP.client({\n      service: Config.chatProtocol.websocket,\n      credentials: (auth, mechanism) => {\n        const crds = {\n          username: this.xmppClient.options.username,\n          password: this.xmppClient.options.password,\n        };\n        return auth(crds);\n      },\n    });\n\n    this.webrtcSignalingProcessor = null;\n\n    this.stanzasCallbacks = {};\n    this.earlyIncomingMessagesQueue = [];\n\n    this.isConnected = false;\n    this._isConnecting = false;\n    this._isLogout = false;\n    this._isReconnect = false;\n\n    this._checkPingTimer = undefined;\n\n    this.helpers = new ChatHelpers();\n    this.dialog = null;\n    this.message = null;\n    this.webrtcSignalingProcessor = null;\n\n    this.xmppClientListeners = [];\n\n    this.connectPromise = null;\n\n    // Chat additional modules\n    const options = {\n      xmppClient: this.xmppClient,\n      helpers: this.helpers,\n      stanzasCallbacks: this.stanzasCallbacks,\n    };\n\n    this.contactList = new ContactListProxy(options);\n    this.privacylist = new PrivacyListProxy(options);\n    this.muc = new MucProxy(options);\n\n    if (Config.chat.streamManagement.enable) {\n      if (Config.chatProtocol.active === 2) {\n        this.streamManagement = new StreamManagement();\n        this._sentMessageCallback = (messageLost, messageSent) => {\n          if (typeof this.onSentMessageCallback === 'function') {\n            if (messageSent) {\n              this.onSentMessageCallback(null, messageSent);\n            } else {\n              this.onSentMessageCallback(messageLost);\n            }\n          }\n        };\n      }\n    }\n\n    if (Config.chat.reconnect.enable) {\n      this.xmppClient.reconnect.delay = Config.chat.reconnect.timeInterval * 1000;\n    }\n\n    this.onChatStatusListener = null;\n    this.onConnectionErrorListener = null;\n    this.onDisconnectedListener = null;\n    this.onReconnectListener = null;\n    this.onMessageListener = null;\n    this.onSentMessageCallback = null;\n    this.onSystemMessageListener = null;\n    this.onMessageErrorListener = null;\n    this.onMessageTypingListener = null;\n    this.onMessageUpdateListener = null;\n    this.onMessageDeleteListener = null;\n    this.onMessageReactionsListener = null;\n    this.onDeliveredStatusListener = null;\n    this.onReadStatusListener = null;\n    this.onLastUserActivityListener = null;\n    this.onSubscribeListener = null;\n    this.onConfirmSubscribeListener = null;\n    this.onRejectSubscribeListener = null;\n    this.onContactListListener = null;\n    this.onJoinOccupant = null;\n    this.onLeaveOccupant = null;\n    this.onKickOccupant = null;\n  }\n\n  get connectionStatus() {\n    return this.xmppClient.status;\n  }\n\n  connect(params) {\n    this.connectPromise = new Promise((resolve, reject) => {\n      Utils.DLog('[Chat]', 'Connect with parameter:', params);\n\n      if (this._isConnecting) {\n        Utils.DLog('[Chat]', 'Warning! Already in CONNECTING state');\n        resolve();\n        return;\n      }\n\n      if (this.isConnected) {\n        Utils.DLog('[Chat]', 'Warning! Chat is already connected!');\n        resolve();\n        return;\n      }\n\n      this._isConnecting = true;\n      this._isLogout = false;\n\n      // remove all old listeners\n      this.xmppClientListeners.forEach((listener) => {\n        this.xmppClient.removeListener(listener.name, listener.callback);\n      });\n\n      const callbackConnect = () => {\n        Utils.DLog('[Chat]', this._isReconnect ? 'RECONNECTING' : 'CONNECTING');\n      };\n\n      this.xmppClient.on('connect', callbackConnect);\n      this.xmppClientListeners.push({\n        name: 'connect',\n        callback: callbackConnect,\n      });\n\n      const callbackOnline = () => {\n        Utils.DLog('[Chat]', 'ONLINE');\n        this.startPingTimer();\n        this._postConnectActions();\n        resolve();\n        this.connectPromise = null;\n      };\n      this.xmppClient.on('online', callbackOnline);\n      this.xmppClientListeners.push({\n        name: 'online',\n        callback: callbackOnline,\n      });\n\n      const callbackOffline = () => {\n        Utils.DLog('[Chat]', 'OFFLINE');\n      };\n      this.xmppClient.on('offline', callbackOffline);\n      this.xmppClientListeners.push({\n        name: 'offline',\n        callback: callbackOffline,\n      });\n\n      const callbackDisconnect = () => {\n        Utils.DLog('[Chat]', 'DISCONNECTED');\n\n        if (typeof this.onDisconnectedListener === 'function') {\n          Utils.safeCallbackCall(this.onDisconnectedListener);\n        }\n\n        if (Config.chat.reconnect.enable) {\n          this.isConnected = false;\n          this._isConnecting = false;\n        } else {\n          this.disconnect();\n        }\n\n        this.stopPingTimer();\n      };\n      this.xmppClient.on('disconnect', callbackDisconnect);\n      this.xmppClientListeners.push({\n        name: 'disconnect',\n        callback: callbackDisconnect,\n      });\n\n      const callbackStatus = (status, value) => {\n        Utils.DLog('[Chat]', `status - ${status}`, typeof value === 'object' ? JSON.stringify(value) : '');\n\n        if (typeof this.onChatStatusListener === 'function') {\n          /*\n           * \"online\" - indicates that xmpp is authenticated and addressable\n           * \"offline\" - indicates that xmpp disconnected and no automatic attempt to reconnect will happen (after calling xmpp.stop())\n           * \"connecting\" - socket is connecting\n           * \"connect\" - socket is connected\n           * \"opening\" - stream is opening\n           * \"open\" - stream is open\n           * \"closing\" - stream is closing\n           * \"close\" - stream is closed\n           * \"disconnecting\" - socket is disconnecting\n           * \"disconnect\" - socket is disconnected\n           */\n          Utils.safeCallbackCall(this.onChatStatusListener, status);\n        }\n      };\n      this.xmppClient.on('status', callbackStatus);\n      this.xmppClientListeners.push({\n        name: 'status',\n        callback: callbackStatus,\n      });\n\n      const callbackStanza = (stanza) => {\n        // it can be a case,\n        // when message came after xmpp auth but before resource bindging,\n        // and it can cause some crashes, e.g.\n        // https://github.com/ConnectyCube/connectycube-js-sdk-releases/issues/28\n        if (stanza.is('message') && !this.isConnected) {\n          this.earlyIncomingMessagesQueue.push(stanza);\n          Utils.DLog('[Chat]', \"on 'stanza': enqueue incoming stanza (isConnected=false)\");\n          return;\n        }\n\n        // after 'input' and 'element' (only if stanza, not nonza)\n        if (stanza.is('presence')) {\n          this._onPresence(stanza);\n        } else if (stanza.is('iq')) {\n          this._onIQ(stanza);\n        } else if (stanza.is('message')) {\n          if (stanza.attrs.type === 'headline') {\n            this._onSystemMessageListener(stanza);\n          } else if (stanza.attrs.type === 'error') {\n            this._onMessageErrorListener(stanza);\n          } else {\n            this._onMessage(stanza);\n          }\n        }\n      };\n      this.xmppClient.on('stanza', callbackStanza);\n      this.xmppClientListeners.push({\n        name: 'stanza',\n        callback: callbackStanza,\n      });\n\n      const callbackError = (err) => {\n        Utils.DLog('[Chat]', 'ERROR:', err, {\n          _isReconnect: this._isReconnect,\n          connectPromise: !!this.connectPromise,\n        });\n\n        if (this.connectPromise) {\n          if (!this._isReconnect) {\n            if (err.name == 'SASLError') {\n              err = err.condition;\n            }\n            reject(err);\n            this.connectPromise = null;\n          }\n        } else {\n          if (typeof this.onConnectionErrorListener === 'function') {\n            Utils.safeCallbackCall(this.onConnectionErrorListener, err);\n          }\n        }\n      };\n      this.xmppClient.on('error', callbackError);\n      this.xmppClientListeners.push({ name: 'error', callback: callbackError });\n\n      const callbackOutput = (str) => {\n        Utils.callTrafficUsageCallback('xmppDataWrite', { body: str });\n        Utils.DLog('[Chat]', 'SENT:', str);\n      };\n      this.xmppClient.on('output', callbackOutput);\n      this.xmppClientListeners.push({\n        name: 'output',\n        callback: callbackOutput,\n      });\n\n      const callbackInput = (str) => {\n        Utils.callTrafficUsageCallback('xmppDataRead', { body: str });\n        Utils.DLog('[Chat]', 'RECV:', str);\n      };\n      this.xmppClient.on('input', callbackInput);\n      this.xmppClientListeners.push({ name: 'input', callback: callbackInput });\n\n      // save user connection data so they will be used when authenticate (above)\n      this.xmppClient.options.username = ChatUtils.buildUserJidLocalPart(params.userId);\n      this.xmppClient.options.password = params.password;\n      // start connect\n      this.xmppClient.start().catch((err) => {\n        console.error('[Chat] xmppClient.start error', err);\n        if (this.connectPromise) {\n          reject(err);\n          this.connectPromise = null;\n        } else {\n          if (typeof this.onConnectionErrorListener === 'function') {\n            Utils.safeCallbackCall(this.onConnectionErrorListener, err);\n          }\n        }\n      });\n    });\n\n    return this.connectPromise;\n  }\n\n  /**\n   * @deprecated since version 2.0\n   */\n  getContacts() {\n    return new Promise((resolve, reject) => {\n      this.contactList\n        .get()\n        .then((contacts) => {\n          this.contactList.contacts = contacts;\n          resolve(contacts);\n        })\n        .catch((error) => {\n          reject(reject);\n        });\n    });\n  }\n\n  ping() {\n    return new Promise((resolve, reject) => {\n      const iqParams = {\n        id: ChatUtils.getUniqueId('ping'),\n        to: Config.endpoints.chat,\n        type: 'get',\n      };\n\n      const iqStanza = ChatUtils.createIqStanza(iqParams);\n\n      iqStanza.c('ping', {\n        xmlns: 'urn:xmpp:ping',\n      });\n\n      this.stanzasCallbacks[iqParams.id] = (stanza) => {\n        const error = ChatUtils.getElement(stanza, 'error');\n        if (error) {\n          reject(ChatUtils.buildErrorFromXMPPErrorStanza(error));\n        } else {\n          resolve();\n        }\n      };\n\n      this.xmppClient.send(iqStanza);\n    });\n  }\n\n  pingWithTimeout(timeout = 5000) {\n    return Promise.race([\n      this.ping(),\n      new Promise((_, reject) => setTimeout(() => reject(new Error('Chat ping() timed out')), timeout)),\n    ]);\n  }\n\n  startPingTimer() {\n    this.stopPingTimer();\n\n    if (Config.chat.ping.enable) {\n      // Min time interval between pings is 30 seconds.\n      const validTime = Config.chat.ping.timeInterval < 30 ? 30 : Config.chat.ping.timeInterval;\n\n      this._checkPingTimer = setInterval(() => {\n        this.ping();\n      }, validTime * 1000);\n    }\n  }\n\n  stopPingTimer() {\n    if (this._checkPingTimer) {\n      clearInterval(this._checkPingTimer);\n      this._checkPingTimer = null;\n    }\n  }\n\n  send(jidOrUserId, message) {\n    const stanzaParams = {\n      from: this.helpers.getUserCurrentJid(),\n      to: this.helpers.jidOrUserId(jidOrUserId),\n      type: message.type ? message.type : this.helpers.typeChat(jidOrUserId),\n      id: message.id ? message.id : Utils.getBsonObjectId(),\n    };\n\n    let messageStanza = ChatUtils.createMessageStanza(stanzaParams);\n\n    if (message.body) {\n      messageStanza.c('body').t(message.body).up();\n    }\n\n    if (message.markable) {\n      messageStanza\n        .c('markable', {\n          xmlns: 'urn:xmpp:chat-markers:0',\n        })\n        .up();\n    }\n\n    if (message.extension) {\n      messageStanza.c('extraParams', {\n        xmlns: 'jabber:client',\n      });\n\n      messageStanza = ChatUtils.filledExtraParams(messageStanza, message.extension);\n    }\n\n    if (Config.chat.streamManagement.enable) {\n      message.id = stanzaParams.id;\n      this.xmppClient.send(messageStanza, message);\n    } else {\n      this.xmppClient.send(messageStanza);\n    }\n\n    return stanzaParams.id;\n  }\n\n  sendSystemMessage(jidOrUserId, message) {\n    const stanzaParams = {\n      type: 'headline',\n      id: message.id ? message.id : Utils.getBsonObjectId(),\n      to: this.helpers.jidOrUserId(jidOrUserId),\n    };\n\n    let messageStanza = ChatUtils.createMessageStanza(stanzaParams);\n\n    if (message.body) {\n      messageStanza.c('body').t(message.body).up();\n    }\n\n    // custom parameters\n    if (message.extension) {\n      messageStanza\n        .c('extraParams', {\n          xmlns: 'jabber:client',\n        })\n        .c('moduleIdentifier')\n        .t('SystemNotifications')\n        .up();\n\n      messageStanza = ChatUtils.filledExtraParams(messageStanza, message.extension);\n    }\n\n    this.xmppClient.send(messageStanza);\n\n    return stanzaParams.id;\n  }\n\n  sendIsTypingStatus(jidOrUserId) {\n    const stanzaParams = {\n      from: this.helpers.getUserCurrentJid(),\n      to: this.helpers.jidOrUserId(jidOrUserId),\n      type: this.helpers.typeChat(jidOrUserId),\n    };\n\n    const messageStanza = ChatUtils.createMessageStanza(stanzaParams);\n\n    messageStanza.c('composing', {\n      xmlns: 'http://jabber.org/protocol/chatstates',\n    });\n\n    this.xmppClient.send(messageStanza);\n  }\n\n  sendIsStopTypingStatus(jidOrUserId) {\n    const stanzaParams = {\n      from: this.helpers.getUserCurrentJid(),\n      to: this.helpers.jidOrUserId(jidOrUserId),\n      type: this.helpers.typeChat(jidOrUserId),\n    };\n\n    const messageStanza = ChatUtils.createMessageStanza(stanzaParams);\n\n    messageStanza.c('paused', {\n      xmlns: 'http://jabber.org/protocol/chatstates',\n    });\n\n    this.xmppClient.send(messageStanza);\n  }\n\n  sendDeliveredStatus(params) {\n    const stanzaParams = {\n      type: 'chat',\n      from: this.helpers.getUserCurrentJid(),\n      id: Utils.getBsonObjectId(),\n      to: this.helpers.jidOrUserId(params.userId),\n    };\n\n    const messageStanza = ChatUtils.createMessageStanza(stanzaParams);\n    messageStanza\n      .c('received', {\n        xmlns: 'urn:xmpp:chat-markers:0',\n        id: params.messageId,\n      })\n      .up();\n    messageStanza\n      .c('extraParams', {\n        xmlns: 'jabber:client',\n      })\n      .c('dialog_id')\n      .t(params.dialogId);\n\n    this.xmppClient.send(messageStanza);\n  }\n\n  sendReadStatus(params) {\n    const stanzaParams = {\n      type: 'chat',\n      from: this.helpers.getUserCurrentJid(),\n      to: this.helpers.jidOrUserId(params.userId),\n      id: Utils.getBsonObjectId(),\n    };\n\n    const messageStanza = ChatUtils.createMessageStanza(stanzaParams);\n    messageStanza\n      .c('displayed', {\n        xmlns: 'urn:xmpp:chat-markers:0',\n        id: params.messageId,\n      })\n      .up();\n    messageStanza\n      .c('extraParams', {\n        xmlns: 'jabber:client',\n      })\n      .c('dialog_id')\n      .t(params.dialogId);\n\n    this.xmppClient.send(messageStanza);\n  }\n\n  // params:\n  // - to (user id OR dialog id)\n  // - dialogId\n  // - body\n  // - originMessageId\n  // - last?\n  editMessage(params) {\n    const stanzaParams = {\n      from: this.helpers.getUserCurrentJid(),\n      to: this.helpers.jidOrUserId(params.to),\n      type: this.helpers.typeChat(params.to),\n      id: Utils.getBsonObjectId(),\n    };\n\n    let messageStanza = ChatUtils.createMessageStanza(stanzaParams);\n\n    messageStanza.c('body').t(params.body).up();\n\n    messageStanza\n      .c('replace', {\n        xmlns: 'urn:xmpp:message-correct:0',\n        id: params.originMessageId,\n        last: params.last ? 'true' : 'false',\n      })\n      .up();\n\n    messageStanza\n      .c('extraParams', {\n        xmlns: 'jabber:client',\n      })\n      .c('dialog_id')\n      .t(params.dialogId);\n\n    if (params.extension) {\n      messageStanza = ChatUtils.filledExtraParams(messageStanza, params.extension);\n    }\n\n    this.xmppClient.send(messageStanza);\n  }\n\n  // params:\n  // - to (user id OR dialog id)\n  // - dialogId\n  // - messageId\n  deleteMessage(params) {\n    const stanzaParams = {\n      from: this.helpers.getUserCurrentJid(),\n      to: this.helpers.jidOrUserId(params.to),\n      type: this.helpers.typeChat(params.to),\n      id: Utils.getBsonObjectId(),\n    };\n\n    const messageStanza = ChatUtils.createMessageStanza(stanzaParams);\n\n    messageStanza\n      .c('remove', {\n        xmlns: 'urn:xmpp:message-delete:0',\n        id: params.messageId,\n      })\n      .up();\n\n    messageStanza\n      .c('extraParams', {\n        xmlns: 'jabber:client',\n      })\n      .c('dialog_id')\n      .t(params.dialogId);\n\n    this.xmppClient.send(messageStanza);\n  }\n\n  getLastUserActivity(jidOrUserId) {\n    return new Promise((resolve, reject) => {\n      const iqParams = {\n        from: this.helpers.getUserCurrentJid(),\n        id: ChatUtils.getUniqueId('lastActivity'),\n        to: this.helpers.jidOrUserId(jidOrUserId),\n        type: 'get',\n      };\n      const iqStanza = ChatUtils.createIqStanza(iqParams);\n\n      iqStanza.c('query', { xmlns: 'jabber:iq:last' });\n\n      this.stanzasCallbacks[iqParams.id] = (stanza) => {\n        const error = ChatUtils.getElement(stanza, 'error');\n        const { userId, seconds } = this._onLastActivityStanza(stanza);\n        if (error) {\n          reject(ChatUtils.buildErrorFromXMPPErrorStanza(stanza));\n        } else {\n          resolve({ userId, seconds });\n        }\n      };\n\n      this.xmppClient.send(iqStanza);\n    });\n  }\n\n  _onLastActivityStanza(stanza) {\n    const from = ChatUtils.getAttr(stanza, 'from');\n    const userId = this.helpers.getUserIdFromJID(from);\n    const query = ChatUtils.getElement(stanza, 'query');\n    const seconds = +ChatUtils.getAttr(query, 'seconds');\n\n    // trigger onLastUserActivityListener callback\n    Utils.safeCallbackCall(this.onLastUserActivityListener, userId, seconds);\n\n    return { userId, seconds };\n  }\n\n  markActive() {\n    const iqParams = {\n      id: this.helpers.getUniqueId('markActive'),\n      type: 'set',\n    };\n\n    const iqStanza = ChatUtils.createIqStanza(iqParams);\n    iqStanza.c('mobile', {\n      xmlns: 'http://tigase.org/protocol/mobile#v2',\n      enable: 'false',\n    });\n\n    this.xmppClient.send(iqStanza);\n  }\n\n  markInactive() {\n    const iqParams = {\n      id: this.helpers.getUniqueId('markActive'),\n      type: 'set',\n    };\n\n    const iqStanza = ChatUtils.createIqStanza(iqParams);\n    iqStanza.c('mobile', {\n      xmlns: 'http://tigase.org/protocol/mobile#v2',\n      enable: 'true',\n    });\n\n    this.xmppClient.send(iqStanza);\n  }\n\n  disconnect() {\n    Utils.DLog('[Chat]', 'disconnect');\n\n    if (this._isLogout) {\n      Utils.DLog('[Chat]', 'Warning! Chat is already disconnected!');\n      return;\n    }\n\n    this.muc.joinedRooms = {};\n    this.isConnected = false;\n    this._isConnecting = false;\n    this._isLogout = true;\n    this._isReconnect = false;\n    this.helpers.setUserCurrentJid('');\n\n    if (Config.chat.streamManagement.enable) {\n      this.streamManagement._removeElementHandler();\n    }\n\n    return this.xmppClient.stop();\n  }\n\n  search(params) {\n    const query = Object.assign({}, params);\n\n    if (query.start_date) {\n      query.start_date = new Date(query.start_date).toISOString();\n    }\n\n    if (query.end_date) {\n      query.end_date = new Date(query.end_date).toISOString();\n    }\n\n    if (Utils.isArray(query.chat_dialog_ids)) {\n      query.chat_dialog_ids = query.chat_dialog_ids.join(',');\n    }\n\n    const ajaxParams = {\n      type: 'GET',\n      url: Utils.getUrl(`${Config.urls.chat}/search`),\n      data: query,\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  /// PRIVATE ///\n\n  _onMessage(rawStanza) {\n    const forwardedStanza = ChatUtils.getElementTreePath(rawStanza, ['sent', 'forwarded', 'message']),\n      stanza = forwardedStanza || rawStanza,\n      from = ChatUtils.getAttr(stanza, 'from'),\n      type = ChatUtils.getAttr(stanza, 'type'),\n      messageId = ChatUtils.getAttr(stanza, 'id'),\n      markable = ChatUtils.getElement(stanza, 'markable'),\n      delivered = ChatUtils.getElement(stanza, 'received'),\n      read = ChatUtils.getElement(stanza, 'displayed'),\n      replaceSubElement = ChatUtils.getElement(stanza, 'replace'),\n      reactionsSubElement = ChatUtils.getElement(stanza, 'reactions'),\n      removeSubElement = ChatUtils.getElement(stanza, 'remove'),\n      composing = ChatUtils.getElement(stanza, 'composing'),\n      paused = ChatUtils.getElement(stanza, 'paused'),\n      invite = ChatUtils.getElement(stanza, 'invite'),\n      delay = ChatUtils.getElement(stanza, 'delay'),\n      extraParams = ChatUtils.getElement(stanza, 'extraParams'),\n      bodyContent = ChatUtils.getElementText(stanza, 'body'),\n      isForwarded = !!forwardedStanza,\n      resource = (this.xmppClient.jid && this.xmppClient.jid._resource) || '';\n\n    // ignore private message from the same resource\n    if (type === 'chat' && from.indexOf(resource) !== -1) {\n      return true;\n    }\n\n    let extraParamsParsed, recipientId, recipient;\n\n    recipient = type === 'chat' ? ChatUtils.getAttr(stanza, 'to') : null;\n    recipientId = recipient ? this.helpers.getUserIdFromJID(recipient) : null;\n\n    let dialogId = type === 'groupchat' ? this.helpers.getDialogIdFromJID(from) : null,\n      userId = type === 'groupchat' ? this.helpers.getIdFromResource(from) : this.helpers.getUserIdFromJID(from),\n      marker = delivered || read || null;\n\n    // ignore invite messages from MUC\n    if (invite) return true;\n\n    if (extraParams) {\n      extraParamsParsed = ChatUtils.parseExtraParams(extraParams);\n\n      if (extraParamsParsed.dialogId) {\n        dialogId = extraParamsParsed.dialogId;\n      }\n    }\n\n    // typing statuses\n    if (composing || paused) {\n      if (typeof this.onMessageTypingListener === 'function' && (type === 'chat' || type === 'groupchat' || !delay)) {\n        Utils.safeCallbackCall(this.onMessageTypingListener, !!composing, userId, dialogId);\n      }\n\n      return true;\n    }\n\n    // edit message\n    if (replaceSubElement) {\n      if (typeof this.onMessageUpdateListener === 'function') {\n        Utils.safeCallbackCall(\n          this.onMessageUpdateListener,\n          ChatUtils.getAttr(replaceSubElement, 'id'),\n          ChatUtils.getAttr(replaceSubElement, 'last') === 'true',\n          bodyContent,\n          dialogId,\n          userId,\n          extraParamsParsed ? extraParamsParsed.extension : null\n        );\n      }\n      return true;\n    }\n\n    // reactions\n    if (reactionsSubElement) {\n      if (isForwarded && type === 'groupchat') {\n        return true;\n      }\n\n      if (typeof this.onMessageReactionsListener === 'function') {\n        const messageId = ChatUtils.getAttr(reactionsSubElement, 'message_id');\n        const userId = +ChatUtils.getAttr(reactionsSubElement, 'user_id');\n        const { add, remove } = ChatUtils.parseReactions(reactionsSubElement);\n        const { dialogId } = extraParamsParsed;\n\n        Utils.safeCallbackCall(this.onMessageReactionsListener, messageId, userId, dialogId, add, remove);\n      }\n      return true;\n    }\n\n    // delete message\n    if (removeSubElement) {\n      if (typeof this.onMessageDeleteListener === 'function') {\n        Utils.safeCallbackCall(\n          this.onMessageDeleteListener,\n          ChatUtils.getAttr(removeSubElement, 'id'),\n          dialogId,\n          userId\n        );\n      }\n      return true;\n    }\n\n    // delivered / read statuses\n    if (marker) {\n      if (delivered) {\n        if (typeof this.onDeliveredStatusListener === 'function' && type === 'chat') {\n          Utils.safeCallbackCall(this.onDeliveredStatusListener, ChatUtils.getAttr(delivered, 'id'), dialogId, userId);\n        }\n      } else {\n        if (typeof this.onReadStatusListener === 'function' && type === 'chat') {\n          Utils.safeCallbackCall(this.onReadStatusListener, ChatUtils.getAttr(read, 'id'), dialogId, userId);\n        }\n      }\n\n      return;\n    }\n\n    // autosend 'received' status (ignore messages from yourself)\n    if (markable && userId != this.helpers.getUserIdFromJID(this.helpers.userCurrentJid(this.xmppClient))) {\n      const autoSendReceiveStatusParams = {\n        messageId: messageId,\n        userId: userId,\n        dialogId: dialogId,\n      };\n\n      this.sendDeliveredStatus(autoSendReceiveStatusParams);\n    }\n\n    const message = {\n      id: messageId,\n      dialog_id: dialogId,\n      recipient_id: recipientId,\n      is_forwarded: isForwarded,\n      type: type,\n      body: bodyContent,\n      extension: extraParamsParsed ? extraParamsParsed.extension : null,\n      delay: delay,\n    };\n\n    if (markable) {\n      message.markable = 1;\n    }\n\n    if (typeof this.onMessageListener === 'function' && (type === 'chat' || type === 'groupchat')) {\n      Utils.safeCallbackCall(this.onMessageListener, userId, message);\n    }\n  }\n\n  _onPresence(stanza) {\n    const from = ChatUtils.getAttr(stanza, 'from'),\n      id = ChatUtils.getAttr(stanza, 'id'),\n      type = ChatUtils.getAttr(stanza, 'type'),\n      currentUserId = this.helpers.getUserIdFromJID(this.helpers.userCurrentJid(this.xmppClient)),\n      x = ChatUtils.getElement(stanza, 'x');\n\n    let xXMLNS, status, statusCode;\n\n    if (x) {\n      xXMLNS = ChatUtils.getAttr(x, 'xmlns');\n      status = ChatUtils.getElement(x, 'status');\n      if (status) {\n        statusCode = ChatUtils.getAttr(status, 'code');\n      }\n    }\n\n    // MUC presences\n    if (xXMLNS && xXMLNS.startsWith('http://jabber.org/protocol/muc')) {\n      // Error\n      if (type === 'error') {\n        // JOIN to dialog error\n        if (id.endsWith(':join')) {\n          if (typeof this.stanzasCallbacks[id] === 'function') {\n            this.stanzasCallbacks[id](stanza);\n          }\n        }\n        return;\n      }\n\n      const dialogId = this.helpers.getDialogIdFromJID(from);\n      const userId = this.helpers.getUserIdFromRoomJid(from);\n\n      // self presence\n      if (status) {\n        // KICK from dialog event\n        if (statusCode == '301') {\n          if (typeof this.onKickOccupant === 'function') {\n            const actorElement = ChatUtils.getElement(ChatUtils.getElement(x, 'item'), 'actor');\n            const initiatorUserJid = ChatUtils.getAttr(actorElement, 'jid');\n            const initiatorId = this.helpers.getUserIdFromJID(initiatorUserJid);\n            Utils.safeCallbackCall(this.onKickOccupant, dialogId, initiatorId);\n          }\n\n          delete this.muc.joinedRooms[this.helpers.getRoomJidFromRoomFullJid(from)];\n          return;\n        } else {\n          if (type === 'unavailable') {\n            // LEAVE response\n            if (status && statusCode == '110') {\n              if (typeof this.stanzasCallbacks['muc:leave'] === 'function') {\n                Utils.safeCallbackCall(this.stanzasCallbacks['muc:leave'], null);\n              }\n            }\n            return;\n          }\n\n          // JOIN response\n          if (id.endsWith(':join') && status && statusCode == '110') {\n            if (typeof this.stanzasCallbacks[id] === 'function') {\n              this.stanzasCallbacks[id](stanza);\n            }\n            return;\n          }\n        }\n\n        // Occupants JOIN/LEAVE events\n      } else {\n        if (userId != currentUserId) {\n          // Leave\n          if (type === 'unavailable') {\n            if (typeof this.onLeaveOccupant === 'function') {\n              Utils.safeCallbackCall(this.onLeaveOccupant, dialogId, parseInt(userId));\n            }\n            return;\n            // Join\n          } else {\n            if (typeof this.onJoinOccupant === 'function') {\n              Utils.safeCallbackCall(this.onJoinOccupant, dialogId, parseInt(userId));\n            }\n            return;\n          }\n        }\n      }\n    }\n\n    // ROSTER presences\n    const userId = this.helpers.getUserIdFromJID(from);\n    let contact = this.contactList.contacts[userId];\n\n    if (!type) {\n      if (typeof this.onContactListListener === 'function' && contact && contact.subscription !== 'none') {\n        Utils.safeCallbackCall(this.onContactListListener, userId);\n      }\n    } else {\n      switch (type) {\n        case 'subscribe':\n          if (contact && contact.subscription === 'to') {\n            contact ? (contact.ask = null) : (contact = { ask: null });\n            contact.subscription = 'both';\n\n            this.contactList._sendSubscriptionPresence({\n              jid: from,\n              type: 'subscribed',\n            });\n          } else {\n            if (typeof this.onSubscribeListener === 'function') {\n              Utils.safeCallbackCall(this.onSubscribeListener, userId);\n            }\n          }\n          break;\n        case 'subscribed':\n          if (contact && contact.subscription === 'from') {\n            contact ? (contact.ask = null) : (contact = { ask: null });\n            contact.subscription = 'both';\n          } else {\n            contact ? (contact.ask = null) : (contact = { ask: null });\n            contact.subscription = 'to';\n\n            if (typeof this.onConfirmSubscribeListener === 'function') {\n              Utils.safeCallbackCall(this.onConfirmSubscribeListener, userId);\n            }\n          }\n          break;\n        case 'unsubscribed':\n          contact ? (contact.ask = null) : (contact = { ask: null });\n          contact.subscription = 'none';\n\n          if (typeof this.onRejectSubscribeListener === 'function') {\n            Utils.safeCallbackCall(this.onRejectSubscribeListener, userId);\n          }\n\n          break;\n        case 'unsubscribe':\n          contact ? (contact.ask = null) : (contact = { ask: null });\n          contact.subscription = 'to';\n\n          break;\n        case 'unavailable':\n          if (typeof this.onContactListListener === 'function' && contact && contact.subscription !== 'none') {\n            Utils.safeCallbackCall(this.onContactListListener, userId, type);\n          }\n\n          // send initial presence if one of client (instance) goes offline\n          if (userId === currentUserId) {\n            this.xmppClient.send(ChatUtils.createPresenceStanza());\n          }\n\n          break;\n      }\n    }\n  }\n\n  _onIQ(stanza) {\n    const stanzaId = ChatUtils.getAttr(stanza, 'id');\n    if (this.stanzasCallbacks[stanzaId]) {\n      Utils.safeCallbackCall(this.stanzasCallbacks[stanzaId], stanza);\n      delete this.stanzasCallbacks[stanzaId];\n    } else {\n      const from = ChatUtils.getAttr(stanza, 'from');\n      const query = ChatUtils.getElement(stanza, 'query');\n      if (!from || !query) {\n        return;\n      }\n      this._onLastActivityStanza(stanza);\n    }\n  }\n\n  _onSystemMessageListener(rawStanza) {\n    const forwardedStanza = ChatUtils.getElementTreePath(rawStanza, ['sent', 'forwarded', 'message']),\n      stanza = forwardedStanza || rawStanza,\n      from = ChatUtils.getAttr(stanza, 'from'),\n      messageId = ChatUtils.getAttr(stanza, 'id'),\n      extraParams = ChatUtils.getElement(stanza, 'extraParams'),\n      userId = this.helpers.getUserIdFromJID(from),\n      delay = ChatUtils.getElement(stanza, 'delay'),\n      moduleIdentifier = ChatUtils.getElementText(extraParams, 'moduleIdentifier'),\n      bodyContent = ChatUtils.getElementText(stanza, 'body'),\n      extraParamsParsed = ChatUtils.parseExtraParams(extraParams);\n\n    if (moduleIdentifier === 'SystemNotifications' && typeof this.onSystemMessageListener === 'function') {\n      const message = {\n        id: messageId,\n        userId: userId,\n        body: bodyContent,\n        extension: extraParamsParsed.extension,\n      };\n\n      Utils.safeCallbackCall(this.onSystemMessageListener, message);\n    } else if (this.webrtcSignalingProcessor && !delay && moduleIdentifier === 'WebRTCVideoChat') {\n      this.webrtcSignalingProcessor._onMessage(userId, extraParams);\n    }\n  }\n\n  _onMessageErrorListener(stanza) {\n    // <error code=\"503\" type=\"cancel\">\n    //   <service-unavailable xmlns=\"urn:ietf:params:xml:ns:xmpp-stanzas\"/>\n    //   <text xmlns=\"urn:ietf:params:xml:ns:xmpp-stanzas\" xml:lang=\"en\">Service not available.</text>\n    // </error>\n\n    const messageId = ChatUtils.getAttr(stanza, 'id');\n    //\n    const error = ChatUtils.buildErrorFromXMPPErrorStanza(stanza);\n\n    if (typeof this.onMessageErrorListener === 'function') {\n      Utils.safeCallbackCall(this.onMessageErrorListener, messageId, error);\n    }\n  }\n\n  _postConnectActions() {\n    Utils.DLog('[Chat]', this._isReconnect ? 'RECONNECTED' : 'CONNECTED');\n\n    const presence = ChatUtils.createPresenceStanza();\n\n    if (Config.chat.streamManagement.enable && Config.chatProtocol.active === 2) {\n      this.streamManagement.enable(this.xmppClient);\n      this.streamManagement.sentMessageCallback = this._sentMessageCallback;\n    }\n\n    this.helpers.setUserCurrentJid(this.helpers.userCurrentJid(this.xmppClient));\n\n    this.isConnected = true;\n    this._isConnecting = false;\n\n    this._enableCarbons();\n\n    this.xmppClient.send(presence); // initial presence\n\n    if (this._isReconnect) {\n      // reconnect\n      if (typeof this.onReconnectListener === 'function') {\n        Utils.safeCallbackCall(this.onReconnectListener);\n      }\n    } else {\n      this._isReconnect = true;\n    }\n\n    if (this.earlyIncomingMessagesQueue.length > 0) {\n      Utils.DLog('[Chat]', `Flush 'earlyIncomingMessagesQueue' (length=${this.earlyIncomingMessagesQueue.length})`);\n\n      const stanzasCallback = this.xmppClientListeners.filter((listener) => listener.name === 'stanza')[0].callback;\n      this.earlyIncomingMessagesQueue.forEach((stanza) => {\n        stanzasCallback(stanza);\n      });\n      this.earlyIncomingMessagesQueue = [];\n    }\n  }\n\n  _enableCarbons() {\n    const carbonParams = {\n      type: 'set',\n      from: this.helpers.getUserCurrentJid(),\n      id: ChatUtils.getUniqueId('enableCarbons'),\n    };\n\n    const iqStanza = ChatUtils.createIqStanza(carbonParams);\n    iqStanza.c('enable', {\n      xmlns: 'urn:xmpp:carbons:2',\n    });\n\n    this.xmppClient.send(iqStanza);\n  }\n\n  _setSubscriptionToUserLastActivity(jidOrUserId, _isEnable) {\n    const iqParams = {\n      id: this.helpers.getUniqueId('statusStreaming'),\n      type: 'set',\n    };\n\n    const iqStanza = ChatUtils.createIqStanza(iqParams);\n\n    iqStanza.c('subscribe', {\n      xmlns: 'https://connectycube.com/protocol/status_streaming',\n      user_jid: this.helpers.jidOrUserId(jidOrUserId),\n      enable: _isEnable,\n    });\n\n    this.xmppClient.send(iqStanza);\n  }\n\n  subscribeToUserLastActivityStatus(jidOrUserId) {\n    this._setSubscriptionToUserLastActivity(jidOrUserId, true);\n  }\n\n  unsubscribeFromUserLastActivityStatus(jidOrUserId) {\n    this._setSubscriptionToUserLastActivity(jidOrUserId, false);\n  }\n}\n\nmodule.exports = ChatService;\n","const Utils = require('../cubeInternalUtils'),\n  Config = require('../cubeConfig'),\n  ChatUtils = require('./cubeChatInternalUtils');\n\nclass ChatHelpers {\n  constructor() {\n    this._userCurrentJid = null;\n  }\n\n  getUniqueId(suffix) {\n    return ChatUtils.getUniqueId(suffix);\n  }\n\n  isNumeric(value) {\n    return /^-?\\d+$/.test(value) || /^\\d+\\.\\d+$/.test(value);\n  }\n\n  jidOrUserId(jidOrUserId) {\n    let jid;\n    if (typeof jidOrUserId === 'string') {\n      // jid\n      jid = this.isNumeric(jidOrUserId)\n        ? this.getUserJid(jidOrUserId)\n        : jidOrUserId.includes('@')\n          ? jidOrUserId\n          : this.getRoomJidFromDialogId(jidOrUserId);\n    } else {\n      // user id\n      jid = this.getUserJid(jidOrUserId);\n    }\n    return jid;\n  }\n\n  typeChat(jidOrUserId) {\n    let chatType;\n    if (typeof jidOrUserId === 'string') {\n      chatType = this.isNumeric(jidOrUserId)\n        ? 'chat'\n        : jidOrUserId.includes('@')\n          ? jidOrUserId.includes('muc')\n            ? 'groupchat'\n            : 'chat'\n          : 'groupchat';\n    } else if (typeof jidOrUserId === 'number') {\n      chatType = 'chat';\n    } else {\n      throw new Error('Unsupported chat type');\n    }\n    return chatType;\n  }\n\n  getUserJid(userId, appId) {\n    if (!appId) {\n      return userId + '-' + Config.creds.appId + '@' + Config.endpoints.chat;\n    }\n    return userId + '-' + appId + '@' + Config.endpoints.chat;\n  }\n\n  getUserNickWithMucDomain(userId) {\n    return Config.endpoints.muc + '/' + userId;\n  }\n\n  getUserIdFromJID(jid) {\n    return jid?.includes('@') ? parseInt(jid.split('@')[0].split('-')[0]) : null;\n  }\n\n  getDialogIdFromJID(jid) {\n    return jid?.includes('@') ? jid.split('@')[0].split('_')[1] : null;\n  }\n\n  getRoomJidFromDialogId(dialogId) {\n    return Config.creds.appId + '_' + dialogId + '@' + Config.endpoints.muc;\n  }\n\n  getRoomJid(jid) {\n    return jid + '/' + this.getUserIdFromJID(this._userCurrentJid);\n  }\n\n  getIdFromResource(jid) {\n    let s = jid.split('/');\n    if (s.length < 2) return null;\n    s.splice(0, 1);\n    return parseInt(s.join('/'));\n  }\n\n  getRoomJidFromRoomFullJid(jid) {\n    let s = jid.split('/');\n    if (s.length < 2) return null;\n    return s[0];\n  }\n\n  getBsonObjectId() {\n    return Utils.getBsonObjectId();\n  }\n\n  getUserIdFromRoomJid(jid) {\n    let arrayElements = jid.toString().split('/');\n    if (arrayElements.length === 0) {\n      return null;\n    }\n    return arrayElements[arrayElements.length - 1];\n  }\n\n  userCurrentJid(client) {\n    return client.jid._local + '@' + client.jid._domain + '/' + client.jid._resource;\n  }\n\n  getUserCurrentJid() {\n    return this._userCurrentJid;\n  }\n\n  setUserCurrentJid(jid) {\n    this._userCurrentJid = jid;\n  }\n\n  getDialogJid(identifier) {\n    return identifier.indexOf('@') > 0 ? identifier : this.getRoomJidFromDialogId(identifier);\n  }\n}\n\nmodule.exports = ChatHelpers;\n","const Config = require('../cubeConfig'),\n  XMPP = require('./xmpp');\n\nclass ChatInternalUtils {\n  static buildUserJid(params) {\n    let jid;\n\n    if ('userId' in params) {\n      jid = params.userId + '-' + Config.creds.appId + '@' + Config.endpoints.chat;\n\n      if ('resource' in params) {\n        jid = jid + '/' + params.resource;\n      }\n    } else if ('jid' in params) {\n      jid = params.jid;\n    }\n\n    return jid;\n  }\n\n  static buildUserJidLocalPart(userId) {\n    return userId + '-' + Config.creds.appId;\n  }\n\n  static createMessageStanza(params) {\n    return XMPP.xml('message', params);\n  }\n\n  static createIqStanza(params) {\n    return XMPP.xml('iq', params);\n  }\n\n  static createPresenceStanza(params) {\n    return XMPP.xml('presence', params);\n  }\n\n  static createNonza(elementName, params) {\n    return XMPP.xml(elementName, params);\n  }\n\n  static getAttr(el, attrName) {\n    if (!el) {\n      return null;\n    }\n\n    let attr;\n    if (typeof el.getAttribute === 'function') {\n      attr = el.getAttribute(attrName);\n    } else if (el.attrs) {\n      attr = el.attrs[attrName];\n    }\n\n    return attr;\n  }\n\n  static getElement(stanza, elName) {\n    let el;\n\n    if (typeof stanza.querySelector === 'function') {\n      el = stanza.querySelector(elName);\n    } else if (typeof stanza.getChild === 'function') {\n      el = stanza.getChild(elName);\n    }\n\n    return el;\n  }\n\n  static isErrorStanza(stanza) {\n    return !!stanza.getChild('error');\n  }\n\n  static getAllElements(stanza, elName) {\n    let el;\n    if (typeof stanza.querySelectorAll === 'function') {\n      el = stanza.querySelectorAll(elName);\n    } else if (typeof stanza.getChild === 'function') {\n      el = stanza.getChild(elName);\n    }\n\n    return el;\n  }\n\n  static getElementText(stanza, elName) {\n    let el, txt;\n\n    if (typeof stanza.querySelector === 'function') {\n      el = stanza.querySelector(elName);\n      txt = el ? el.textContent : null;\n    } else if (typeof stanza.getChildText === 'function') {\n      txt = stanza.getChildText(elName);\n    }\n\n    return txt;\n  }\n\n  static getElementTreePath(stanza, elementsPath) {\n    return elementsPath.reduce(\n      (prevStanza, elem) => (prevStanza ? this.getElement(prevStanza, elem) : prevStanza),\n      stanza\n    );\n  }\n\n  static _JStoXML(title, obj, msg) {\n    msg = msg.c(title);\n\n    Object.keys(obj).forEach((field) => {\n      if (typeof obj[field] === 'object') {\n        this._JStoXML(field, obj[field], msg);\n      } else {\n        msg = msg.c(field).t(obj[field]).up();\n      }\n    });\n\n    msg = msg.up();\n  }\n\n  static _XMLtoJS(extension, title, obj) {\n    extension[title] = {};\n\n    let objChildNodes = obj.childNodes || obj.children;\n\n    for (let i = 0; i < objChildNodes.length; i++) {\n      let subNode = objChildNodes[i];\n      if (typeof subNode === 'string') {\n        extension[title] = subNode;\n        continue;\n      }\n      let subNodeChildNodes = subNode.childNodes || subNode.children;\n      let subNodeTagName = subNode.tagName || subNode.name;\n      let subNodeTextContent = subNode.textContent || subNode.children[0];\n\n      if (subNodeChildNodes.length >= 1) {\n        extension[title] = this._XMLtoJS(extension[title], subNodeTagName, subNode);\n      } else {\n        extension[title][subNodeTagName] = subNodeTextContent;\n      }\n    }\n    return extension;\n  }\n\n  static filledExtraParams(stanza, extension) {\n    Object.keys(extension).forEach((field) => {\n      if (field === 'attachments') {\n        extension[field].forEach((attach) => {\n          stanza.getChild('extraParams').c('attachment', attach).up();\n        });\n      } else if (typeof extension[field] === 'object') {\n        this._JStoXML(field, extension[field], stanza.getChild('extraParams'));\n      } else {\n        stanza.getChild('extraParams').c(field).t(extension[field]).up();\n      }\n    });\n\n    stanza.up();\n\n    return stanza;\n  }\n\n  static parseExtraParams(extraParams) {\n    if (!extraParams) {\n      return null;\n    }\n\n    let extension = {};\n\n    let dialogId, attach, attributes;\n\n    let attachments = [];\n\n    for (let c = 0, length = extraParams.children.length; c < length; c++) {\n      if (extraParams.children[c].name === 'attachment') {\n        attach = {};\n        attributes = extraParams.children[c].attrs;\n\n        let attrKeys = Object.keys(attributes);\n\n        for (let l = 0; l < attrKeys.length; l++) {\n          if (attrKeys[l] === 'size') {\n            attach.size = parseInt(attributes.size);\n          } else {\n            attach[attrKeys[l]] = attributes[attrKeys[l]];\n          }\n        }\n\n        attachments.push(attach);\n      } else if (extraParams.children[c].name === 'dialog_id') {\n        dialogId = extraParams.getChildText('dialog_id');\n        extension.dialog_id = dialogId;\n      }\n\n      if (extraParams.children[c].children.length) {\n        let child = extraParams.children[c];\n        extension = this._XMLtoJS(extension, child.name, child);\n      }\n    }\n\n    if (attachments.length > 0) {\n      extension.attachments = attachments;\n    }\n\n    if (extension.moduleIdentifier) {\n      delete extension.moduleIdentifier;\n    }\n\n    return {\n      extension: extension,\n      dialogId: dialogId,\n    };\n  }\n\n  static buildErrorFromXMPPErrorStanza(errorStanza) {\n    const errorElement = this.getElement(errorStanza, 'error');\n    const code = parseInt(this.getAttr(errorElement, 'code'));\n    const info = this.getElementText(errorElement, 'text');\n    return { code: code, info: info };\n  }\n\n  static getUniqueId(suffix) {\n    const uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n      const r = (Math.random() * 16) | 0,\n        v = c == 'x' ? r : (r & 0x3) | 0x8;\n      return v.toString(16);\n    });\n    if (typeof suffix == 'string' || typeof suffix == 'number') {\n      return uuid + ':' + suffix;\n    } else {\n      return uuid + '';\n    }\n  }\n\n  static parseReactions(reactionsEl) {\n    let reactions = reactionsEl.children;\n    reactions = reactions.map((reactionEl) => ({\n      add: this.getAttr(reactionEl, 'add') === 'true',\n      remove: this.getAttr(reactionEl, 'remove') === 'true',\n      reaction: this.getAttr(reactionEl, 'type'),\n    }));\n    return reactions.reduce((acc, parsedReaction) => {\n      if (parsedReaction.add) {\n        acc['add'] = parsedReaction.reaction;\n      }\n      if (parsedReaction.remove) {\n        acc['remove'] = parsedReaction.reaction;\n      }\n      return acc;\n    }, {});\n  }\n}\n\nmodule.exports = ChatInternalUtils;\n","const ChatUtils = require('./cubeChatInternalUtils'),\n  Utils = require('../cubeInternalUtils'),\n  Config = require('../cubeConfig');\n\nclass ContactListService {\n  constructor(options) {\n    this.helpers = options.helpers;\n    this.xmppClient = options.xmppClient;\n    this.stanzasCallbacks = options.stanzasCallbacks;\n    //\n    this.contacts = {};\n\n    this.xmlns = 'jabber:iq:roster';\n  }\n\n  get() {\n    return new Promise((resolve, reject) => {\n      const stanzaId = ChatUtils.getUniqueId('getRoster');\n\n      let contacts = {},\n        iqStanza = ChatUtils.createIqStanza({\n          type: 'get',\n          from: this.helpers.getUserCurrentJid(),\n          id: stanzaId,\n        });\n\n      iqStanza.c('query', {\n        xmlns: this.xmlns,\n      });\n\n      this.stanzasCallbacks[stanzaId] = (stanza) => {\n        const items = stanza.getChild('query').children;\n\n        for (let i = 0, len = items.length; i < len; i++) {\n          const userId = this.helpers.getUserIdFromJID(ChatUtils.getAttr(items[i], 'jid')),\n            ask = ChatUtils.getAttr(items[i], 'ask'),\n            subscription = ChatUtils.getAttr(items[i], 'subscription'),\n            name = ChatUtils.getAttr(items[i], 'name'),\n            isUniqName = userId + '-' + Config.creds.appId !== name;\n\n          contacts[userId] = {\n            subscription: subscription,\n            ask: ask || null,\n            name: isUniqName ? name : null,\n          };\n        }\n\n        resolve(contacts);\n      };\n\n      this.xmppClient.send(iqStanza);\n    });\n  }\n\n  add(params) {\n    return new Promise((resolve, reject) => {\n      const userId = params.userId || params,\n        userJid = this.helpers.jidOrUserId(userId),\n        stanzaId = ChatUtils.getUniqueId('addContactInRoster');\n\n      let iqStanza = ChatUtils.createIqStanza({\n        type: 'set',\n        from: this.helpers.getUserCurrentJid(),\n        id: stanzaId,\n      });\n\n      this.contacts[userId] = {\n        subscription: 'none',\n        ask: 'subscribe',\n        name: params.name || null,\n      };\n\n      iqStanza\n        .c('query', {\n          xmlns: this.xmlns,\n        })\n        .c('item', {\n          jid: userJid,\n          name: params.name || null,\n        });\n\n      this.stanzasCallbacks[stanzaId] = () => {\n        this._sendSubscriptionPresence({\n          jid: userJid,\n          type: 'subscribe',\n        });\n\n        resolve();\n      };\n\n      this.xmppClient.send(iqStanza);\n    });\n  }\n\n  confirm(params) {\n    return new Promise((resolve, reject) => {\n      const userId = params.userId || params,\n        userJid = this.helpers.jidOrUserId(userId);\n\n      this._sendSubscriptionPresence({\n        jid: userJid,\n        type: 'subscribed',\n      });\n\n      if (Config.chat.contactList.subscriptionMode.mutual) {\n        this.add(params, function () {\n          resolve();\n        });\n      } else {\n        resolve();\n      }\n    });\n  }\n\n  reject(userId) {\n    return new Promise((resolve, reject) => {\n      const userJid = this.helpers.jidOrUserId(userId);\n\n      this.contacts[userId] = {\n        subscription: 'none',\n        ask: null,\n      };\n\n      this._sendSubscriptionPresence({\n        jid: userJid,\n        type: 'unsubscribed',\n      });\n\n      resolve();\n    });\n  }\n\n  updateName(params) {\n    return new Promise((resolve, reject) => {\n      const userJid = this.helpers.jidOrUserId(params.userId),\n        stanzaId = ChatUtils.getUniqueId('updateContactInRoster');\n\n      let contact = this.contacts[params.userId];\n\n      if (Utils.isObject(contact)) {\n        contact.name = params.name || null;\n      } else {\n        reject('No contact exists with provided user id');\n        return;\n      }\n\n      let iqStanza = ChatUtils.createIqStanza({\n        type: 'set',\n        from: this.helpers.getUserCurrentJid(),\n        id: stanzaId,\n      });\n\n      iqStanza\n        .c('query', {\n          xmlns: this.xmlns,\n        })\n        .c('item', {\n          jid: userJid,\n          name: params.name || null,\n        });\n\n      this.stanzasCallbacks[stanzaId] = (res) => {\n        res.attrs.type === 'result' ? resolve() : reject(res);\n      };\n\n      this.xmppClient.send(iqStanza);\n    });\n  }\n\n  remove(userId) {\n    return new Promise((resolve, reject) => {\n      const userJid = this.helpers.jidOrUserId(userId),\n        stanzaId = ChatUtils.getUniqueId('removeConactInRoster');\n\n      let iqStanza = ChatUtils.createIqStanza({\n        type: 'set',\n        from: this.helpers.getUserCurrentJid(),\n        id: stanzaId,\n      });\n\n      iqStanza\n        .c('query', {\n          xmlns: this.xmlns,\n        })\n        .c('item', {\n          jid: userJid,\n          subscription: 'remove',\n        });\n\n      this.stanzasCallbacks[stanzaId] = () => {\n        delete this.contacts[userId];\n        resolve();\n      };\n\n      this.xmppClient.send(iqStanza);\n    });\n  }\n\n  _sendSubscriptionPresence(params) {\n    const presenceParams = {\n      to: params.jid,\n      type: params.type,\n    };\n\n    const presenceStanza = ChatUtils.createPresenceStanza(presenceParams);\n\n    this.xmppClient.send(presenceStanza);\n  }\n}\n\nmodule.exports = ContactListService;\n","const Config = require('../cubeConfig');\nconst Utils = require('../cubeInternalUtils');\n\nconst DIALOGS_API_URL = Config.urls.chat + '/Dialog';\n\nclass ChatDialogsService {\n  constructor(proxy) {\n    this.proxy = proxy;\n  }\n\n  list(params) {\n    const ajaxParams = {\n      type: 'GET',\n      url: Utils.getUrl(DIALOGS_API_URL),\n      data: params,\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  create(params) {\n    const data = Utils.cloneObject(params);\n\n    if (data && data.occupants_ids && Utils.isArray(data.occupants_ids)) {\n      data.occupants_ids = data.occupants_ids.join(', ');\n    }\n\n    const ajaxParams = {\n      type: 'POST',\n      url: Utils.getUrl(DIALOGS_API_URL),\n      data: data,\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  update(id, params) {\n    const ajaxParams = {\n      type: 'PUT',\n      url: Utils.getUrl(DIALOGS_API_URL, id),\n      data: params,\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  delete(idOrIds, params) {\n    const ajaxParams = {\n      type: 'DELETE',\n      url: Utils.getUrl(DIALOGS_API_URL, idOrIds),\n    };\n\n    if (typeof idOrIds === 'string' || (Utils.isArray(idOrIds) && idOrIds.length === 1)) {\n      ajaxParams.dataType = 'text';\n    }\n\n    if (params) {\n      ajaxParams.data = params;\n    }\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  addAdmins(id, admins_ids) {\n    const params = {\n      push_all: {\n        admins_ids: admins_ids,\n      },\n    };\n\n    const ajaxParams = {\n      type: 'PUT',\n      url: Utils.getUrl(DIALOGS_API_URL, id, 'admins'),\n      data: params,\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  removeAdmins(id, admins_ids) {\n    const params = {\n      pull_all: {\n        admins_ids: admins_ids,\n      },\n    };\n\n    const ajaxParams = {\n      type: 'PUT',\n      url: Utils.getUrl(DIALOGS_API_URL, id, 'admins'),\n      data: params,\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  subscribe(id) {\n    const ajaxParams = {\n      type: 'POST',\n      url: Utils.getUrl(DIALOGS_API_URL, id, 'subscribe'),\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  unsubscribe(id) {\n    const ajaxParams = {\n      type: 'DELETE',\n      url: Utils.getUrl(DIALOGS_API_URL, id, 'subscribe'),\n      dataType: 'text',\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  subscribeToPublic(id) {\n    return this.subscribe(id);\n  }\n\n  unsubscribeFromPublic(id) {\n    return this.unsubscribe(id);\n  }\n\n  updateNotificationsSettings(id, enabled) {\n    const settings = {\n      enabled: enabled ? 1 : 0,\n    };\n\n    const ajaxParams = {\n      type: 'PUT',\n      url: Utils.getUrl(DIALOGS_API_URL, id, 'notifications'),\n      data: settings,\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  getNotificationsSettings(id) {\n    const ajaxParams = {\n      type: 'GET',\n      url: Utils.getUrl(DIALOGS_API_URL, id, 'notifications'),\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  getPublicOccupants(id, params) {\n    const ajaxParams = {\n      type: 'GET',\n      url: Utils.getUrl(DIALOGS_API_URL, id, 'occupants'),\n      data: params,\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  clearHistory(id) {\n    const ajaxParams = {\n      type: 'DELETE',\n      url: Utils.getUrl(DIALOGS_API_URL, 'clearHistory', id),\n      dataType: 'text',\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n}\n\nmodule.exports = ChatDialogsService;\n","const Config = require('../cubeConfig');\nconst Utils = require('../cubeInternalUtils');\n\nconst MESSAGES_API_URL = Config.urls.chat + '/Message';\n\nclass ChatMessagesService {\n  constructor(proxy) {\n    this.proxy = proxy;\n  }\n\n  list(params) {\n    const ajaxParams = {\n      url: Utils.getUrl(MESSAGES_API_URL),\n      data: params,\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  create(params) {\n    const ajaxParams = {\n      url: Utils.getUrl(MESSAGES_API_URL),\n      type: 'POST',\n      data: params,\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  update(id, params) {\n    const ajaxParams = {\n      type: 'PUT',\n      dataType: 'text',\n      url: Utils.getUrl(MESSAGES_API_URL, id),\n      data: params,\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  delete(id, params = {}) {\n    const ajaxParams = {\n      url: Utils.getUrl(MESSAGES_API_URL, id),\n      type: 'DELETE',\n      dataType: 'text',\n    };\n\n    if (params) {\n      ajaxParams.data = params;\n    }\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  createSystem(params) {\n    const ajaxParams = {\n      url: Utils.getUrl(MESSAGES_API_URL + '/system'),\n      type: 'POST',\n      data: params,\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  unreadCount(params) {\n    const data = Utils.cloneObject(params);\n\n    if (data && data.chat_dialog_ids && Utils.isArray(data.chat_dialog_ids)) {\n      data.chat_dialog_ids = data.chat_dialog_ids.join(', ');\n    }\n\n    const ajaxParams = {\n      url: Utils.getUrl(MESSAGES_API_URL + '/unread'),\n      data: data,\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  listReactions(messageId) {\n    const ajaxParams = {\n      type: 'GET',\n      dataType: 'json',\n      url: Utils.getUrl(MESSAGES_API_URL, messageId, 'reactions'),\n      data: {},\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  addReaction(messageId, reaction) {\n    return this.updateReaction(messageId, reaction);\n  }\n\n  removeReaction(messageId, reaction) {\n    return this.updateReaction(messageId, null, reaction);\n  }\n\n  updateReaction(messageId, addReaction, removeReaction) {\n    const params = {};\n    if (addReaction) {\n      params['add'] = addReaction;\n    }\n    if (removeReaction) {\n      params['remove'] = removeReaction;\n    }\n    const ajaxParams = {\n      type: 'PUT',\n      dataType: 'text',\n      url: Utils.getUrl(MESSAGES_API_URL, messageId, 'reactions'),\n      data: params,\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n}\n\nmodule.exports = ChatMessagesService;\n","const ChatUtils = require('./cubeChatInternalUtils');\n\nclass GroupChatService {\n  constructor(options) {\n    this.helpers = options.helpers;\n    this.xmppClient = options.xmppClient;\n    this.stanzasCallbacks = options.stanzasCallbacks;\n    //\n    this.joinedRooms = {};\n\n    this.xmlns = 'http://jabber.org/protocol/muc';\n  }\n\n  join(dialogIdOrJid) {\n    return new Promise((resolve, reject) => {\n      const id = ChatUtils.getUniqueId('join'),\n        dialogJid = this.helpers.getDialogJid(dialogIdOrJid),\n        presenceParams = {\n          id: id,\n          from: this.helpers.getUserCurrentJid(),\n          to: this.helpers.getRoomJid(dialogJid),\n        };\n\n      let presenceStanza = ChatUtils.createPresenceStanza(presenceParams);\n      presenceStanza\n        .c('x', {\n          xmlns: this.xmlns,\n        })\n        .c('history', { maxstanzas: 0 });\n\n      this.stanzasCallbacks[id] = (stanza) => {\n        const from = ChatUtils.getAttr(stanza, 'from'),\n          dialogId = this.helpers.getDialogIdFromJID(from),\n          x = ChatUtils.getElement(stanza, 'x'),\n          xXMLNS = ChatUtils.getAttr(x, 'xmlns'),\n          status = ChatUtils.getElement(x, 'status'),\n          statusCode = ChatUtils.getAttr(status, 'code');\n\n        if (status && statusCode == '110') {\n          this.joinedRooms[dialogJid] = true;\n          resolve();\n        } else {\n          const type = ChatUtils.getAttr(stanza, 'type');\n\n          if (type && type === 'error' && xXMLNS === this.xmlns && id.endsWith(':join')) {\n            const errorEl = ChatUtils.getElement(stanza, 'error'),\n              code = ChatUtils.getAttr(errorEl, 'code'),\n              errorMessage = ChatUtils.getElementText(errorEl, 'text');\n\n            const errorResponse = {\n              code: code || 500,\n              message: errorMessage || 'Unknown issue',\n            };\n\n            reject(errorResponse);\n          }\n        }\n      };\n\n      this.xmppClient.send(presenceStanza);\n    });\n  }\n\n  leave(dialogIdOrJid) {\n    return new Promise((resolve, reject) => {\n      const dialogJid = this.helpers.getDialogJid(dialogIdOrJid);\n      const presenceParams = {\n        type: 'unavailable',\n        from: this.helpers.getUserCurrentJid(),\n        to: this.helpers.getRoomJid(dialogJid),\n      };\n\n      const presenceStanza = ChatUtils.createPresenceStanza(presenceParams);\n\n      delete this.joinedRooms[dialogJid];\n\n      this.stanzasCallbacks['muc:leave'] = (stanza) => {\n        resolve();\n      };\n\n      this.xmppClient.send(presenceStanza);\n    });\n  }\n\n  listOnlineUsers(dialogIdOrJid) {\n    return new Promise((resolve, reject) => {\n      const dialogJid = this.helpers.getDialogJid(dialogIdOrJid);\n      const iqParams = {\n        type: 'get',\n        to: dialogJid,\n        from: this.helpers.getUserCurrentJid(),\n        id: ChatUtils.getUniqueId('muc_disco_items'),\n      };\n\n      let iqStanza = ChatUtils.createIqStanza(iqParams);\n      iqStanza.c('query', {\n        xmlns: 'http://jabber.org/protocol/disco#items',\n      });\n\n      this.stanzasCallbacks[iqParams.id] = (stanza) => {\n        const stanzaId = stanza.attrs.id;\n\n        if (this.stanzasCallbacks[stanzaId]) {\n          const items = stanza.getChild('query').getChildElements('item');\n\n          let users = [];\n          for (let i = 0, len = items.length; i < len; i++) {\n            let userId = this.helpers.getUserIdFromRoomJid(items[i].attrs.jid);\n            users.push(parseInt(userId));\n          }\n\n          resolve(users);\n        }\n      };\n\n      this.xmppClient.send(iqStanza);\n    });\n  }\n}\n\nmodule.exports = GroupChatService;\n","const ChatUtils = require('./cubeChatInternalUtils'),\n  Utils = require('../cubeInternalUtils');\n\nclass PrivacyListService {\n  constructor(options) {\n    this.helpers = options.helpers;\n    this.xmppClient = options.xmppClient;\n    this.stanzasCallbacks = options.stanzasCallbacks;\n\n    this.xmlns = 'jabber:iq:privacy';\n  }\n\n  create(list) {\n    return new Promise((resolve, reject) => {\n      let userId,\n        userJid,\n        userMuc,\n        userAction,\n        mutualBlock,\n        listPrivacy = {},\n        listUserId = [];\n\n      for (let i = list.items.length - 1; i >= 0; i--) {\n        const user = list.items[i];\n\n        listPrivacy[user.user_id] = {\n          action: user.action,\n          mutualBlock: user.mutualBlock === true ? true : false,\n        };\n      }\n\n      listUserId = Object.keys(listPrivacy);\n\n      const iqParams = {\n        type: 'set',\n        from: this.helpers.getUserCurrentJid(),\n        id: ChatUtils.getUniqueId('edit'),\n      };\n\n      let iq = ChatUtils.createIqStanza(iqParams);\n\n      iq.c('query', {\n        xmlns: this.xmlns,\n      }).c('list', {\n        name: list.name,\n      });\n\n      function createPrivacyItem(iq, params) {\n        let list = iq.getChild('query').getChild('list');\n\n        list\n          .c('item', {\n            type: 'jid',\n            value: params.jidOrMuc,\n            action: params.userAction,\n            order: params.order,\n          })\n          .c('message', {})\n          .up()\n          .c('presence-in', {})\n          .up()\n          .c('presence-out', {})\n          .up()\n          .c('iq', {})\n          .up()\n          .up();\n\n        return iq;\n      }\n\n      function createPrivacyItemMutal(iq, params) {\n        let list = iq.getChild('query').getChild('list');\n\n        list\n          .c('item', {\n            type: 'jid',\n            value: params.jidOrMuc,\n            action: params.userAction,\n            order: params.order,\n          })\n          .up();\n\n        return iq;\n      }\n\n      for (let index = 0, j = 0, len = listUserId.length; index < len; index++, j = j + 2) {\n        userId = listUserId[index];\n        mutualBlock = listPrivacy[userId].mutualBlock;\n\n        userAction = listPrivacy[userId].action;\n        userJid = this.helpers.jidOrUserId(parseInt(userId, 10));\n        userMuc = this.helpers.getUserNickWithMucDomain(userId);\n\n        if (mutualBlock && userAction === 'deny') {\n          iq = createPrivacyItemMutal(iq, {\n            order: j + 1,\n            jidOrMuc: userJid,\n            userAction: userAction,\n          });\n          iq = createPrivacyItemMutal(iq, {\n            order: j + 2,\n            jidOrMuc: userMuc,\n            userAction: userAction,\n          })\n            .up()\n            .up();\n        } else {\n          iq = createPrivacyItem(iq, {\n            order: j + 1,\n            jidOrMuc: userJid,\n            userAction: userAction,\n          });\n          iq = createPrivacyItem(iq, {\n            order: j + 2,\n            jidOrMuc: userMuc,\n            userAction: userAction,\n          });\n        }\n      }\n\n      this.stanzasCallbacks[iqParams.id] = (stanza) => {\n        ChatUtils.isErrorStanza(stanza) ? reject(ChatUtils.buildErrorFromXMPPErrorStanza(stanza)) : resolve();\n      };\n\n      this.xmppClient.send(iq);\n    });\n  }\n\n  getList(name) {\n    return new Promise((resolve, reject) => {\n      let items,\n        userJid,\n        userId,\n        usersList = [],\n        list = {};\n\n      const iqParams = {\n        type: 'get',\n        from: this.helpers.getUserCurrentJid(),\n        id: ChatUtils.getUniqueId('getlist'),\n      };\n\n      let iq = ChatUtils.createIqStanza(iqParams);\n\n      iq.c('query', {\n        xmlns: this.xmlns,\n      }).c('list', {\n        name: name,\n      });\n\n      this.stanzasCallbacks[iqParams.id] = (stanza) => {\n        const stanzaQuery = stanza.getChild('query');\n\n        list = stanzaQuery ? stanzaQuery.getChild('list') : null;\n        items = list ? list.getChildElements('item') : null;\n\n        for (let i = 0, len = items.length; i < len; i = i + 2) {\n          userJid = items[i].attrs.value;\n          userId = this.helpers.getUserIdFromJID(userJid);\n          usersList.push({\n            user_id: userId,\n            action: items[i].attrs.action,\n          });\n        }\n\n        list = {\n          name: list.attrs.name,\n          items: usersList,\n        };\n\n        resolve(list);\n\n        delete this.stanzasCallbacks[iqParams.id];\n      };\n\n      this.xmppClient.send(iq);\n    });\n  }\n\n  update(listWithUpdates) {\n    return new Promise((resolve, reject) => {\n      this.getList(listWithUpdates.name)\n        .then((existentList) => {\n          const updatedList = {\n            items: Utils.mergeArrays(existentList.items, listWithUpdates.items),\n            name: listWithUpdates.name,\n          };\n          this.create(updatedList)\n            .then(() => {\n              resolve();\n            })\n            .catch((error) => {\n              reject(error);\n            });\n        })\n        .catch((error) => {\n          reject(error);\n        });\n    });\n  }\n\n  getNames() {\n    return new Promise((resolve, reject) => {\n      const iqParams = {\n        type: 'get',\n        from: this.helpers.getUserCurrentJid(),\n        id: ChatUtils.getUniqueId('getNames'),\n      };\n\n      let iq = ChatUtils.createIqStanza(iqParams);\n\n      iq.c('query', {\n        xmlns: this.xmlns,\n      });\n\n      this.stanzasCallbacks[iq.attrs.id] = (stanza) => {\n        if (!ChatUtils.isErrorStanza(stanza)) {\n          const query = stanza.getChild('query'),\n            defaultList = query.getChild('default'),\n            activeList = query.getChild('active'),\n            allLists = query.getChildElements('list');\n\n          let defaultName = defaultList ? defaultList.attrs.name : null,\n            activeName = activeList ? activeList.attrs.name : null;\n\n          let allNames = [];\n\n          for (let i = 0, len = allLists.length; i < len; i++) {\n            allNames.push(allLists[i].attrs.name);\n          }\n\n          const namesList = {\n            default: defaultName,\n            active: activeName,\n            names: allNames,\n          };\n\n          resolve(namesList);\n        } else {\n          reject(ChatUtils.buildErrorFromXMPPErrorStanza(stanza));\n        }\n      };\n\n      this.xmppClient.send(iq);\n    });\n  }\n\n  delete(name) {\n    return new Promise((resolve, reject) => {\n      const iqParams = {\n        from: this.xmppClient.jid || this.xmppClient.jid.user,\n        type: 'set',\n        id: ChatUtils.getUniqueId('remove'),\n      };\n\n      let iq = ChatUtils.createIqStanza(iqParams);\n\n      iq.c('query', {\n        xmlns: this.xmlns,\n      }).c('list', {\n        name: name ? name : '',\n      });\n\n      this.stanzasCallbacks[iq.attrs.id] = (stanza) => {\n        ChatUtils.isErrorStanza(stanza) ? reject(ChatUtils.buildErrorFromXMPPErrorStanza(stanza)) : resolve();\n      };\n\n      this.xmppClient.send(iq);\n    });\n  }\n\n  setAsDefault(name) {\n    return new Promise((resolve, reject) => {\n      const iqParams = {\n        from: this.xmppClient.jid || this.xmppClient.jid.user,\n        type: 'set',\n        id: ChatUtils.getUniqueId('default'),\n      };\n\n      let iq = ChatUtils.createIqStanza(iqParams);\n\n      iq.c('query', {\n        xmlns: this.xmlns,\n      }).c('default', name && name.length > 0 ? { name: name } : {});\n\n      this.stanzasCallbacks[iq.attrs.id] = (stanza) => {\n        ChatUtils.isErrorStanza(stanza) ? reject(ChatUtils.buildErrorFromXMPPErrorStanza(stanza)) : resolve();\n      };\n\n      this.xmppClient.send(iq);\n    });\n  }\n}\n\nmodule.exports = PrivacyListService;\n","const Utils = require('../cubeInternalUtils'),\n  ChatUtils = require('./cubeChatInternalUtils');\n\nclass StreamManagementService {\n  constructor() {\n    this._NS = 'urn:xmpp:sm:3';\n\n    this._isStreamManagementEnabled = false;\n\n    // Counter of the incoming stanzas\n    this._clientProcessedStanzasCounter = 0;\n    // The client send stanza counter.\n    this._clientSentStanzasCounter = 0;\n\n    this.sentMessageCallback = null;\n\n    this._lastAck = 0;\n\n    // connection\n    this._xmppClient = null;\n\n    // Original connection.send method\n    this._originalSend = null;\n\n    // In progress stanzas queue\n    this._unackedQueue = [];\n\n    this._incomingStanzaHandler = (stanza) => {\n      let tagName = stanza.name || stanza.tagName || stanza.nodeTree.tagName;\n\n      if (tagName === 'enabled') {\n        this._isStreamManagementEnabled = true;\n        return;\n      }\n\n      if (ChatUtils.getAttr(stanza, 'xmlns') !== this._NS) {\n        this._increaseReceivedStanzasCounter();\n      }\n\n      if (tagName === 'r') {\n        let params = {\n            xmlns: this._NS,\n            h: this._clientProcessedStanzasCounter,\n          },\n          answerStanza = ChatUtils.createNonza('a', params);\n\n        this._originalSend.call(this._xmppClient, answerStanza);\n        return;\n      }\n\n      if (tagName === 'a') {\n        const h = parseInt(ChatUtils.getAttr(stanza, 'h'));\n        this._checkCounterOnIncomeStanza(h);\n      }\n    };\n  }\n\n  enable(connection) {\n    let enableParams = {\n      xmlns: this._NS,\n    };\n\n    if (!this._isStreamManagementEnabled) {\n      this._xmppClient = connection;\n      this._originalSend = this._xmppClient.send;\n      this._xmppClient.send = this.send.bind(this);\n    }\n\n    this._clientProcessedStanzasCounter = 0;\n    this._clientSentStanzasCounter = 0;\n    this._lastAck = 0;\n\n    this._removeElementHandler();\n    this._addElementHandler();\n\n    const stanza = ChatUtils.createNonza('enable', enableParams);\n\n    this._xmppClient.send(stanza);\n  }\n\n  _removeElementHandler() {\n    this._xmppClient.removeListener('element', this._incomingStanzaHandler);\n  }\n\n  _addElementHandler() {\n    this._xmppClient.on('element', this._incomingStanzaHandler);\n  }\n\n  send(stanza, message) {\n    let tagName = stanza.name || stanza.tagName || stanza.nodeTree.tagName,\n      type = ChatUtils.getAttr(stanza, 'type'),\n      bodyContent = ChatUtils.getElementText(stanza, 'body') || '',\n      attachments = ChatUtils.getAllElements(stanza, 'attachment') || '';\n\n    this._originalSend.call(this._xmppClient, stanza);\n\n    if (tagName === 'message' && (type === 'chat' || type === 'groupchat') && (bodyContent || attachments.length)) {\n      this._sendStanzasRequest({\n        message: message,\n        expect: this._clientSentStanzasCounter,\n      });\n    }\n\n    ++this._clientSentStanzasCounter;\n  }\n\n  _sendStanzasRequest(data) {\n    if (this._isStreamManagementEnabled) {\n      this._unackedQueue.push(data);\n\n      const stanza = ChatUtils.createNonza('r', { xmlns: this._NS });\n\n      this._originalSend.call(this._xmppClient, stanza);\n    }\n  }\n\n  getClientSentStanzasCounter() {\n    return this._clientSentStanzasCounter;\n  }\n\n  _checkCounterOnIncomeStanza(h) {\n    const numAcked = h - this._lastAck;\n\n    Utils.DLog('[Chat][SM][_checkCounterOnIncomeStanza]', numAcked, h, this._lastAck);\n\n    for (let i = 0; i < numAcked && this._unackedQueue.length > 0; i++) {\n      this.sentMessageCallback(null, this._unackedQueue.shift().message);\n    }\n\n    this._lastAck = h;\n  }\n\n  _increaseReceivedStanzasCounter() {\n    ++this._clientProcessedStanzasCounter;\n  }\n}\n\nmodule.exports = StreamManagementService;\n","'use strict';\n\nconst { xml, jid, Client } = require('@xmpp/client-core');\n\nconst _reconnect = require('@xmpp/reconnect');\nconst _websocket = require('@xmpp/websocket');\nconst _middleware = require('@xmpp/middleware');\nconst _streamFeatures = require('@xmpp/stream-features');\nconst _iqCaller = require('@xmpp/iq/caller');\nconst _iqCallee = require('@xmpp/iq/callee');\nconst _resolve = require('@xmpp/resolve');\n\n// Stream features - order matters and define priority\nconst _sasl = require('@xmpp/sasl');\nconst _resourceBinding = require('@xmpp/resource-binding');\nconst _sessionEstablishment = require('@xmpp/session-establishment');\n\n// SASL mechanisms - order matters and define priority\nconst anonymous = require('@xmpp/sasl-anonymous');\nconst plain = require('@xmpp/sasl-plain');\n\nfunction getDomain(service) {\n  const domain = service.split('://')[1] || service;\n  return domain.split(':')[0].split('/')[0];\n}\n\nfunction client(options = {}) {\n  const { resource, credentials, username, password, ...params } = options;\n\n  const { domain, service } = params;\n  if (!domain && service) {\n    params.domain = getDomain(service);\n  }\n\n  const entity = new Client(params);\n\n  const reconnect = _reconnect({ entity });\n  const websocket = _websocket({ entity });\n\n  const middleware = _middleware({ entity });\n  const streamFeatures = _streamFeatures({ middleware });\n  const iqCaller = _iqCaller({ middleware, entity });\n  const iqCallee = _iqCallee({ middleware, entity });\n  const resolve = _resolve({ entity });\n  // Stream features - order matters and define priority\n  const sasl = _sasl({ streamFeatures }, credentials || { username, password });\n  const resourceBinding = _resourceBinding({ iqCaller, streamFeatures }, resource);\n  const sessionEstablishment = _sessionEstablishment({\n    iqCaller,\n    streamFeatures,\n  });\n  // SASL mechanisms - order matters and define priority\n  const mechanisms = Object.entries({ plain, anonymous }).map(([k, v]) => ({\n    [k]: v(sasl),\n  }));\n\n  return Object.assign(entity, {\n    entity,\n    reconnect,\n    websocket,\n    middleware,\n    streamFeatures,\n    iqCaller,\n    iqCallee,\n    resolve,\n    sasl,\n    resourceBinding,\n    sessionEstablishment,\n    mechanisms,\n  });\n}\n\nmodule.exports.xml = xml;\nmodule.exports.jid = jid;\nmodule.exports.client = client;\n","const config = require('../cubeConfig');\nconst Helpers = require('./cubeWebRTCHelpers');\nconst SessionConnectionState = require('./cubeWebRTCConstants').SessionConnectionState;\nconst RTCPeerConnection = require('../cubeDependencies').RTCPeerConnection;\nconst RTCSessionDescription = require('../cubeDependencies').RTCSessionDescription;\nconst RTCIceCandidate = require('../cubeDependencies').RTCIceCandidate;\nconst MediaStream = require('../cubeDependencies').MediaStream;\nconst PeerConnectionState = require('./cubeWebRTCConstants').PeerConnectionState;\n\nRTCPeerConnection.prototype._init = function (delegate, userID, sessionID, type) {\n  Helpers.trace('RTCPeerConnection init. userID: ' + userID + ', sessionID: ' + sessionID + ', type: ' + type);\n\n  this.delegate = delegate;\n\n  this.sessionID = sessionID;\n  this.userID = userID;\n  this.type = type;\n  this.remoteSDP = null;\n\n  this.state = PeerConnectionState.NEW;\n\n  this.remoteStream = new MediaStream();\n  this.ontrack = this.onAddRemoteMediaCallback.bind(this);\n  this.onicecandidate = this.onIceCandidateCallback.bind(this);\n  this.onsignalingstatechange = this.onSignalingStateCallback.bind(this);\n  this.oniceconnectionstatechange = this.onIceConnectionStateCallback.bind(this);\n\n  this.onStatusClosedChecker = undefined;\n\n  /** We use this timer interval to dial a user - produce the call requests each N seconds. */\n  this.dialingTimer = null;\n  this.answerTimeInterval = 0;\n  this.statsReportTimer = null;\n\n  this.iceCandidates = [];\n\n  this.released = false;\n};\n\nRTCPeerConnection.prototype.release = function () {\n  this._clearDialingTimer();\n  this._clearStatsReportTimer();\n\n  this.close();\n\n  // TODO: 'closed' state doesn't fires on Safari 11 (do it manually)\n  if (Helpers.getVersionSafari() >= 11) {\n    this.onIceConnectionStateCallback();\n  }\n\n  this.released = true;\n};\n\nRTCPeerConnection.prototype.updateRemoteSDP = function (newSDP) {\n  if (!newSDP) {\n    throw new Error(\"sdp string can't be empty.\");\n  } else {\n    this.remoteSDP = newSDP;\n  }\n};\n\nRTCPeerConnection.prototype.getRemoteSDP = function () {\n  return this.remoteSDP;\n};\n\nRTCPeerConnection.prototype.setRemoteSessionDescription = function (type, remoteSDP) {\n  const desc = new RTCSessionDescription({\n    sdp: remoteSDP,\n    type: type,\n  });\n\n  return this.setRemoteDescription(desc);\n};\n\nRTCPeerConnection.prototype.getAndSetLocalSessionDescription = function (maxBandwidth, offerAnswerOptions = {}) {\n  return new Promise((resolve, reject) => {\n    this.state = PeerConnectionState.CONNECTING;\n\n    if (this.type === 'offer') {\n      this.createOffer(offerAnswerOptions)\n        .then((offer) => {\n          this.setLocalDescription(offer)\n            .then((result) => {\n              /*  caller sets maxBandwidth to RTCRtpSender parameters' encodings */\n              this.setRTCRtpSenderMaxBandwidth(maxBandwidth);\n              resolve(offer);\n            })\n            .catch(reject);\n        })\n        .catch(reject);\n    } else if (!offerAnswerOptions.iceRestart) {\n      this.createAnswer(offerAnswerOptions)\n        .then((answer) => {\n          this.setLocalDescription(answer)\n            .then((result) => {\n              /* callee sets maxBandwidth (bitrate) to RTCRtpSender parameters' encodings */\n              this.setRTCRtpSenderMaxBandwidth(maxBandwidth);\n              resolve(answer);\n            })\n            .catch(reject);\n        })\n        .catch(reject);\n    } else {\n      throw new Error('iceRestart is possible only from offer side');\n    }\n  });\n};\n\nRTCPeerConnection.prototype.setRTCRtpSenderMaxBandwidth = function (maxBandwidth) {\n  const senders = this.getSenders() || [];\n\n  senders.forEach((sender) => {\n    if (sender.track.kind === 'video') {\n      const params = sender.getParameters();\n\n      if (!params.encodings) {\n        params.encodings = [];\n      }\n\n      if (!maxBandwidth) {\n        delete params.encodings[0]?.maxBitrate;\n      } else {\n        params.encodings[0].maxBitrate = maxBandwidth * 1000;\n      }\n\n      sender\n        .setParameters(params)\n        .then(() => {\n          Helpers.trace('Set maxBandwidth success [' + this.userID + ']: ' + maxBandwidth + ' kbps');\n        })\n        .catch((err) => {\n          Helpers.trace('Set maxBandwidth error [' + this.userID + ']: ' + err);\n        });\n    }\n  });\n};\n\nRTCPeerConnection.prototype.addCandidates = function (iceCandidates) {\n  for (let i = 0, len = iceCandidates.length; i < len; i++) {\n    const candidate = {\n      sdpMLineIndex: iceCandidates[i].sdpMLineIndex,\n      sdpMid: iceCandidates[i].sdpMid,\n      candidate: iceCandidates[i].candidate,\n    };\n\n    if (!candidate.candidate) {\n      continue;\n    }\n\n    this.addIceCandidate(\n      new RTCIceCandidate(candidate),\n      () => {},\n      (error) => {\n        Helpers.traceError(\"Error on 'addIceCandidate': \" + error);\n      }\n    );\n  }\n};\n\nRTCPeerConnection.prototype.toString = function () {\n  return (\n    'sessionID: ' + this.sessionID + ', userID:  ' + this.userID + ', type: ' + this.type + ', state: ' + this.state\n  );\n};\n\n/// CALLBACKS\n\nRTCPeerConnection.prototype.onSignalingStateCallback = function () {\n  Helpers.trace('onSignalingStateCallback: ' + this.signalingState);\n\n  if (this.signalingState === 'stable' && this.iceCandidates.length > 0) {\n    this.delegate._processIceCandidates(this, this.iceCandidates);\n    this.iceCandidates.length = 0;\n  }\n};\n\nRTCPeerConnection.prototype.onIceCandidateCallback = function (event) {\n  const candidate = event.candidate;\n\n  if (candidate) {\n    const iceCandidateData = {\n      sdpMLineIndex: candidate.sdpMLineIndex,\n      sdpMid: candidate.sdpMid,\n      candidate: candidate.candidate,\n    };\n\n    if (this.signalingState === 'stable') {\n      this.delegate._processIceCandidates(this, [iceCandidateData]);\n    } else {\n      this.iceCandidates.push(iceCandidateData);\n    }\n  }\n};\n\n/** handler of remote media stream */\nRTCPeerConnection.prototype.onAddRemoteMediaCallback = function (event) {\n  if (typeof this.delegate._onRemoteStreamListener === 'function') {\n    this.remoteStream.addTrack(event.track);\n\n    if (\n      (this.delegate.callType == 1 && this.remoteStream.getVideoTracks().length) ||\n      (this.delegate.callType == 2 && this.remoteStream.getAudioTracks().length)\n    ) {\n      this.delegate._onRemoteStreamListener(this.userID, this.remoteStream);\n    }\n\n    this._getStatsWrap();\n  }\n};\n\nRTCPeerConnection.prototype.onIceConnectionStateCallback = function () {\n  Helpers.trace('onIceConnectionStateCallback: ' + this.iceConnectionState);\n\n  if (typeof this.delegate._onSessionConnectionStateChangedListener === 'function') {\n    let conState = null;\n\n    if (Helpers.getVersionSafari() >= 11) {\n      clearTimeout(this.onStatusClosedChecker);\n    }\n\n    switch (this.iceConnectionState) {\n      case 'checking':\n        this.state = PeerConnectionState.CHECKING;\n        conState = SessionConnectionState.CONNECTING;\n        break;\n\n      case 'connected':\n        this._clearWaitingReconnectTimer();\n        this.state = PeerConnectionState.CONNECTED;\n        conState = SessionConnectionState.CONNECTED;\n        break;\n\n      case 'completed':\n        this._clearWaitingReconnectTimer();\n        this.state = PeerConnectionState.COMPLETED;\n        conState = SessionConnectionState.COMPLETED;\n        break;\n\n      case 'failed':\n        this.state = PeerConnectionState.FAILED;\n        conState = SessionConnectionState.FAILED;\n        break;\n\n      case 'disconnected':\n        this._startWaitingReconnectTimer();\n        this.state = PeerConnectionState.DISCONNECTED;\n        conState = SessionConnectionState.DISCONNECTED;\n\n        // repeat to call onIceConnectionStateCallback to get status \"closed\"\n        if (Helpers.getVersionSafari() >= 11) {\n          this.onStatusClosedChecker = setTimeout(() => {\n            this.onIceConnectionStateCallback();\n          }, 500);\n        }\n        break;\n\n      // TODO: this state doesn't fires on Safari 11\n      case 'closed':\n        this._clearWaitingReconnectTimer();\n        this.state = PeerConnectionState.CLOSED;\n        conState = SessionConnectionState.CLOSED;\n        break;\n\n      default:\n        break;\n    }\n\n    if (conState) {\n      this.delegate._onSessionConnectionStateChangedListener(this.userID, conState);\n    }\n  }\n};\n\n/// PRIVATE\n\nRTCPeerConnection.prototype._clearStatsReportTimer = function () {\n  if (this.statsReportTimer) {\n    clearInterval(this.statsReportTimer);\n    this.statsReportTimer = null;\n  }\n};\n\nRTCPeerConnection.prototype._getStatsWrap = function () {\n  let statsReportInterval;\n  let lastResult;\n\n  if (config.videochat && config.videochat.statsReportTimeInterval) {\n    if (isNaN(+config.videochat.statsReportTimeInterval)) {\n      Helpers.traceError('statsReportTimeInterval (' + config.videochat.statsReportTimeInterval + ') must be integer.');\n      return;\n    }\n    statsReportInterval = config.videochat.statsReportTimeInterval * 1000;\n\n    const _statsReportCallback = () => {\n      _getStats(\n        this,\n        lastResult,\n        (results, lastResults) => {\n          lastResult = lastResults;\n          this.delegate._onCallStatsReport(this.userID, results, null);\n        },\n        (err) => {\n          Helpers.traceError('_getStats error. ' + err.name + ': ' + err.message);\n          this.delegate._onCallStatsReport(this.userID, null, err);\n        }\n      );\n    };\n\n    Helpers.trace('Stats tracker has been started.');\n    this.statsReportTimer = setInterval(_statsReportCallback, statsReportInterval);\n  }\n};\n\nRTCPeerConnection.prototype._clearWaitingReconnectTimer = function () {\n  if (this.waitingReconnectTimeoutCallback) {\n    Helpers.trace('_clearWaitingReconnectTimer');\n    clearTimeout(this.waitingReconnectTimeoutCallback);\n    this.waitingReconnectTimeoutCallback = null;\n  }\n};\n\nRTCPeerConnection.prototype._startWaitingReconnectTimer = function () {\n  const timeout = config.videochat.disconnectTimeInterval * 1000;\n  const waitingReconnectTimeoutCallback = () => {\n    Helpers.trace('waitingReconnectTimeoutCallback');\n\n    clearTimeout(this.waitingReconnectTimeoutCallback);\n\n    this.release();\n\n    this.delegate._closeSessionIfAllConnectionsClosed();\n  };\n\n  Helpers.trace('_startWaitingReconnectTimer, timeout: ' + timeout);\n\n  this.waitingReconnectTimeoutCallback = setTimeout(waitingReconnectTimeoutCallback, timeout);\n};\n\nRTCPeerConnection.prototype._clearDialingTimer = function () {\n  if (this.dialingTimer) {\n    Helpers.trace('_clearDialingTimer');\n\n    clearInterval(this.dialingTimer);\n    this.dialingTimer = null;\n    this.answerTimeInterval = 0;\n  }\n};\n\nRTCPeerConnection.prototype._startDialingTimer = function (extension, withOnNotAnswerCallback) {\n  const dialingTimeInterval = config.videochat.dialingTimeInterval * 1000;\n\n  Helpers.trace('_startDialingTimer, dialingTimeInterval: ' + dialingTimeInterval);\n\n  const _dialingCallback = (extension, withOnNotAnswerCallback, skipIncrement) => {\n    if (!skipIncrement) {\n      this.answerTimeInterval += config.videochat.dialingTimeInterval * 1000;\n    }\n\n    Helpers.trace('_dialingCallback, answerTimeInterval: ' + this.answerTimeInterval);\n\n    if (this.answerTimeInterval >= config.videochat.answerTimeInterval * 1000) {\n      this._clearDialingTimer();\n\n      if (withOnNotAnswerCallback) {\n        this.delegate._processOnNotAnswer(this);\n      }\n    } else {\n      this.delegate._processCall(this, extension);\n    }\n  };\n\n  this.dialingTimer = setInterval(_dialingCallback, dialingTimeInterval, extension, withOnNotAnswerCallback, false);\n\n  // call for the 1st time\n  _dialingCallback(extension, withOnNotAnswerCallback, true);\n};\n\n/**\n * PRIVATE\n */\nfunction _getStats(peer, lastResults, successCallback, errorCallback) {\n  let statistic = {\n    local: {\n      audio: {},\n      video: {},\n      candidate: {},\n    },\n    remote: {\n      audio: {},\n      video: {},\n      candidate: {},\n    },\n  };\n\n  if (Helpers.getVersionFirefox()) {\n    let localStream = peer.getLocalStreams().length ? peer.getLocalStreams()[0] : peer.delegate.localStream,\n      localVideoSettings = localStream.getVideoTracks().length ? localStream.getVideoTracks()[0].getSettings() : null;\n\n    statistic.local.video.frameHeight = localVideoSettings && localVideoSettings.height;\n    statistic.local.video.frameWidth = localVideoSettings && localVideoSettings.width;\n  }\n\n  peer.getStats(null).then((results) => {\n    results.forEach((result) => {\n      let item;\n\n      if (result.bytesReceived && result.type === 'inbound-rtp') {\n        item = statistic.remote[result.mediaType];\n        item.bitrate = _getBitratePerSecond(result, lastResults, false);\n        item.bytesReceived = result.bytesReceived;\n        item.packetsReceived = result.packetsReceived;\n        item.timestamp = result.timestamp;\n        if (result.mediaType === 'video' && result.framerateMean) {\n          item.framesPerSecond = Math.round(result.framerateMean * 10) / 10;\n        }\n      } else if (result.bytesSent && result.type === 'outbound-rtp') {\n        item = statistic.local[result.mediaType];\n        item.bitrate = _getBitratePerSecond(result, lastResults, true);\n        item.bytesSent = result.bytesSent;\n        item.packetsSent = result.packetsSent;\n        item.timestamp = result.timestamp;\n        if (result.mediaType === 'video' && result.framerateMean) {\n          item.framesPerSecond = Math.round(result.framerateMean * 10) / 10;\n        }\n      } else if (result.type === 'local-candidate') {\n        item = statistic.local.candidate;\n        if (result.candidateType === 'host' && result.mozLocalTransport === 'udp' && result.transport === 'udp') {\n          item.protocol = result.transport;\n          item.ip = result.ipAddress;\n          item.port = result.portNumber;\n        } else if (!Helpers.getVersionFirefox()) {\n          item.protocol = result.protocol;\n          item.ip = result.ip;\n          item.port = result.port;\n        }\n      } else if (result.type === 'remote-candidate') {\n        item = statistic.remote.candidate;\n        item.protocol = result.protocol || result.transport;\n        item.ip = result.ip || result.ipAddress;\n        item.port = result.port || result.portNumber;\n      } else if (result.type === 'track' && result.kind === 'video' && !Helpers.getVersionFirefox()) {\n        if (result.remoteSource) {\n          item = statistic.remote.video;\n          item.frameHeight = result.frameHeight;\n          item.frameWidth = result.frameWidth;\n          item.framesPerSecond = _getFramesPerSecond(result, lastResults, false);\n        } else {\n          item = statistic.local.video;\n          item.frameHeight = result.frameHeight;\n          item.frameWidth = result.frameWidth;\n          item.framesPerSecond = _getFramesPerSecond(result, lastResults, true);\n        }\n      }\n    });\n    successCallback(statistic, results);\n  }, errorCallback);\n\n  const _getBitratePerSecond = (result, lastResults, isLocal) => {\n    let lastResult = lastResults && lastResults.get(result.id),\n      seconds = lastResult ? (result.timestamp - lastResult.timestamp) / 1000 : 5,\n      kilo = 1024,\n      bit = 8,\n      bitrate;\n\n    if (!lastResult) {\n      bitrate = 0;\n    } else if (isLocal) {\n      bitrate = (bit * (result.bytesSent - lastResult.bytesSent)) / (kilo * seconds);\n    } else {\n      bitrate = (bit * (result.bytesReceived - lastResult.bytesReceived)) / (kilo * seconds);\n    }\n\n    return Math.round(bitrate);\n  };\n\n  const _getFramesPerSecond = (result, lastResults, isLocal) => {\n    let lastResult = lastResults && lastResults.get(result.id),\n      seconds = lastResult ? (result.timestamp - lastResult.timestamp) / 1000 : 5,\n      framesPerSecond;\n\n    if (!lastResult) {\n      framesPerSecond = 0;\n    } else if (isLocal) {\n      framesPerSecond = (result.framesSent - lastResult.framesSent) / seconds;\n    } else {\n      framesPerSecond = (result.framesReceived - lastResult.framesReceived) / seconds;\n    }\n\n    return Math.round(framesPerSecond * 10) / 10;\n  };\n}\n\nfunction updateVideoBandwidthRestriction(sdp, maxBandwidth) {\n  if (!maxBandwidth || (typeof maxBandwidth === 'number' && maxBandwidth <= 0)) {\n    return sdp.replace(/b=AS:.*\\r\\n/, '').replace(/b=TIAS:.*\\r\\n/, '');\n  }\n\n  const isFirefox = !!Helpers.getVersionFirefox();\n  const modifier = isFirefox ? 'TIAS' : 'AS';\n  const bandwidth = isFirefox ? maxBandwidth * 1000 : maxBandwidth;\n  const lines = sdp.split('\\n');\n\n  let line = -1;\n\n  for (let i = 0; i < lines.length; i++) {\n    if (lines[i].indexOf('m=video') === 0) {\n      line = i;\n      break;\n    }\n  }\n\n  if (line === -1) {\n    return sdp;\n  }\n\n  line++;\n\n  while (lines[line].indexOf('i=') === 0 || lines[line].indexOf('c=') === 0) {\n    line++;\n  }\n\n  if (lines[line].indexOf('b') === 0) {\n    lines[line] = `b=${modifier}:${bandwidth}`;\n    return lines.join('\\n');\n  }\n\n  let newLines = lines.slice(0, line);\n\n  newLines.push(`b=${modifier}:${bandwidth}`);\n  newLines = newLines.concat(lines.slice(line, lines.length));\n\n  return newLines.join('\\n');\n}\n\nmodule.exports = RTCPeerConnection;\n","const WebRTCSession = require('./cubeWebRTCSession');\nconst WebRTCSignalingProcessor = require('./cubeWebRTCSignalingProcessor');\nconst WebRTCSignalingProvider = require('./cubeWebRTCSignalingProvider');\nconst Helpers = require('./cubeWebRTCHelpers');\nconst cubeWebRTCConstants = require('./cubeWebRTCConstants');\nconst SessionState = require('./cubeWebRTCConstants').SessionState;\nconst Utils = require('../cubeInternalUtils');\nconst mediaDevices = require('../cubeDependencies').mediaDevices;\nconst Config = require('../cubeConfig');\n\nclass WebRTCClient {\n  constructor(connection, proxy) {\n    this.connection = connection;\n    this.proxy = proxy;\n\n    this.signalingProcessor = new WebRTCSignalingProcessor(this);\n    this.signalingProvider = new WebRTCSignalingProvider(connection);\n\n    this.SessionConnectionState = cubeWebRTCConstants.SessionConnectionState;\n    this.PeerConnectionState = cubeWebRTCConstants.PeerConnectionState;\n    this.CallType = cubeWebRTCConstants.CallType;\n\n    this.sessions = {};\n\n    if (mediaDevices) {\n      mediaDevices.ondevicechange = this._onDevicesChangeListener.bind(this);\n    }\n\n    this.onCallListener = null;\n    this.onAcceptCallListener = null;\n    this.onRejectCallListener = null;\n    this.onStopCallListener = null;\n    this.onUserNotAnswerListener = null;\n    this.onInvalidEventsListener = null;\n    this.onRemoteStreamListener = null;\n    this.onSessionConnectionStateChangedListener = null;\n    this.onSessionCloseListener = null;\n    this.onCallStatsReport = null;\n    this.onDevicesChangeListener = null;\n  }\n\n  getMediaDevices(spec) {\n    const specDevices = [];\n\n    return new Promise((resolve, reject) => {\n      if (!mediaDevices || !mediaDevices.enumerateDevices) {\n        reject(\"No 'enumerateDevices' API supported\");\n      } else {\n        mediaDevices.enumerateDevices().then((devices) => {\n          if (spec) {\n            devices.forEach((device, i) => {\n              if (device.kind === spec) {\n                specDevices.push(device);\n              }\n            });\n            resolve(specDevices);\n          } else {\n            resolve(devices);\n          }\n        });\n      }\n    });\n  }\n\n  createNewSession(opponentsIDs, callType) {\n    const callerID = Helpers.getUserIdFromJID(Helpers.userCurrentJid(this.connection));\n\n    if (!opponentsIDs) {\n      throw new Error(\"Can't create a session without opponentsIDs.\");\n    }\n\n    return this._createAndStoreSession(null, callerID, opponentsIDs, callType);\n  }\n\n  _createAndStoreSession(sessionID, initiatorID, opIDs, callType, maxBandwidth) {\n    const newSession = new WebRTCSession({\n      sessionID,\n      initiatorID,\n      opIDs,\n      callType,\n      signalingProvider: this.signalingProvider,\n      currentUserID: Helpers.getUserIdFromJID(Helpers.userCurrentJid(this.connection)),\n      maxBandwidth,\n    });\n\n    newSession.onUserNotAnswerListener = this.onUserNotAnswerListener;\n    newSession.onRemoteStreamListener = this.onRemoteStreamListener;\n    newSession.onSessionConnectionStateChangedListener = this.onSessionConnectionStateChangedListener;\n    newSession.onSessionCloseListener = this.onSessionCloseListener;\n    newSession.onCallStatsReport = this.onCallStatsReport;\n\n    this.sessions[newSession.ID] = newSession;\n    return newSession;\n  }\n\n  clearSession(sessionId) {\n    delete this.sessions[sessionId];\n  }\n\n  /// Reject call by http request\n\n  callRejectRequest(extension) {\n    const ajaxParams = {\n      type: 'POST',\n      url: Utils.getUrl(Config.urls.calls, 'reject'),\n      data: { ...extension },\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n  /// DELEGATE (signaling)\n\n  _onCallListener(userID, sessionID, extension) {\n    const userInfo = extension.userInfo || {};\n    const maxBandwidth = +userInfo.maxBandwidth || 0;\n\n    let session = this.sessions[sessionID];\n\n    Helpers.trace('onCall. UserID:' + userID + '. SessionID: ' + sessionID + '. extension: ', userInfo);\n\n    if (!session) {\n      session = this._createAndStoreSession(\n        sessionID,\n        extension.callerID,\n        extension.opponentsIDs,\n        extension.callType,\n        maxBandwidth\n      );\n      session._processOnCall(userID, extension);\n      Utils.safeCallbackCall(this.onCallListener, session, userInfo);\n    } else {\n      session._processOnCall(userID, extension);\n    }\n  }\n\n  _onAcceptListener(userID, sessionID, extension) {\n    const session = this.sessions[sessionID];\n    const userInfo = extension.userInfo || {};\n\n    Helpers.trace('onAccept. UserID:' + userID + '. SessionID: ' + sessionID);\n\n    if (session && (session.state === SessionState.ACTIVE || session.state === SessionState.NEW)) {\n      Utils.safeCallbackCall(this.onAcceptCallListener, session, userID, userInfo);\n      session._processOnAccept(userID, extension);\n    } else {\n      Helpers.traceWarning(\"Ignore 'onAccept', there is no information about session \" + sessionID);\n    }\n  }\n\n  _onRejectListener(userID, sessionID, extension) {\n    const session = this.sessions[sessionID];\n\n    Helpers.trace('onReject. UserID:' + userID + '. SessionID: ' + sessionID);\n\n    if (session) {\n      const userInfo = extension.userInfo || {};\n      Utils.safeCallbackCall(this.onRejectCallListener, session, userID, userInfo);\n      session._processOnReject(userID, extension);\n    } else {\n      Helpers.traceWarning(\"Ignore 'onReject', there is no information about session \" + sessionID);\n    }\n  }\n\n  _onStopListener(userID, sessionID, extension) {\n    Helpers.trace('onStop. UserID:' + userID + '. SessionID: ' + sessionID);\n\n    const session = this.sessions[sessionID];\n    const userInfo = extension.userInfo || {};\n\n    if (session && (session.state === SessionState.ACTIVE || session.state === SessionState.NEW)) {\n      session._processOnStop(userID, extension);\n      Utils.safeCallbackCall(this.onStopCallListener, session, userID, userInfo);\n    } else {\n      Utils.safeCallbackCall(this.onInvalidEventsListener, 'onStop', session, userID, userInfo);\n      Helpers.traceWarning(\"Ignore 'onStop', there is no information about session \" + sessionID + ' by some reason.');\n    }\n  }\n\n  _onIceCandidatesListener(userID, sessionID, extension) {\n    const session = this.sessions[sessionID];\n\n    Helpers.trace(\n      'onIceCandidates. UserID:' +\n      userID +\n      '. SessionID: ' +\n      sessionID +\n      '. ICE candidates count: ' +\n      extension.iceCandidates.length\n    );\n\n    if (session) {\n      if (session.state === SessionState.ACTIVE) {\n        session._processOnIceCandidates(userID, extension);\n      } else {\n        Helpers.traceWarning(\"Ignore 'OnIceCandidates', the session ( \" + sessionID + ' ) has invalid state.');\n      }\n    } else {\n      Helpers.traceWarning(\"Ignore 'OnIceCandidates', there is no information about session \" + sessionID);\n    }\n  }\n\n  _onIceRestartListener(userID, sessionID, extension) {\n    const session = this.sessions[sessionID];\n\n    Helpers.trace('onIceRestart. UserID:' + userID + '. SessionID: ' + sessionID);\n\n    if (session) {\n      if (session.state === SessionState.ACTIVE) {\n        session._processOnIceRestart(userID, extension);\n      } else {\n        Helpers.traceWarning(\"Ignore 'OnIceRestart', the session ( \" + sessionID + ' ) has invalid state.');\n      }\n    } else {\n      Helpers.traceWarning(\"Ignore 'OnIceRestart', there is no information about session \" + sessionID);\n    }\n  }\n\n  _onIceRestartAcceptListener(userID, sessionID, extension) {\n    const session = this.sessions[sessionID];\n\n    Helpers.trace('onIceRestartAccept. UserID:' + userID + '. SessionID: ' + sessionID);\n\n    if (session) {\n      if (session.state === SessionState.ACTIVE) {\n        session._processOnIceRestartAccept(userID, extension);\n      } else {\n        Helpers.traceWarning(\"Ignore 'onIceRestartAccept', the session ( \" + sessionID + ' ) has invalid state.');\n      }\n    } else {\n      Helpers.traceWarning(\"Ignore 'onIceRestartAccept', there is no information about session \" + sessionID);\n    }\n  }\n\n  _onDevicesChangeListener() {\n    Utils.safeCallbackCall(this.onDevicesChangeListener);\n  }\n}\n\nmodule.exports = WebRTCClient;\n","module.exports = {\n  SignalingConstants: {\n    MODULE_ID: 'WebRTCVideoChat',\n    SignalingType: {\n      CALL: 'call',\n      ACCEPT: 'accept',\n      REJECT: 'reject',\n      STOP: 'hangUp',\n      RESTART: 'iceRestart',\n      RESTART_ACCEPT: 'iceRestartAccept',\n      CANDIDATE: 'iceCandidates',\n    },\n  },\n  SessionConnectionState: {\n    UNDEFINED: 0,\n    CONNECTING: 1,\n    CONNECTED: 2,\n    FAILED: 3,\n    DISCONNECTED: 4,\n    CLOSED: 5,\n    COMPLETED: 6,\n  },\n  SessionState: {\n    NEW: 1,\n    ACTIVE: 2,\n    HUNGUP: 3,\n    REJECTED: 4,\n    CLOSED: 5,\n  },\n  PeerConnectionState: {\n    NEW: 1,\n    CONNECTING: 2,\n    CHECKING: 3,\n    CONNECTED: 4,\n    DISCONNECTED: 5,\n    FAILED: 6,\n    CLOSED: 7,\n    COMPLETED: 8,\n  },\n  CallType: {\n    VIDEO: 1,\n    AUDIO: 2,\n  },\n};\n","const config = require('../cubeConfig');\n\nclass WebRTCHelpers {\n  static getUserJid(id, appId) {\n    return id + '-' + appId + '@' + config.endpoints.chat;\n  }\n\n  static getUserIdFromJID(jid) {\n    if (jid.indexOf('@') < 0) return null;\n    return parseInt(jid.split('@')[0].split('-')[0]);\n  }\n\n  static userCurrentJid(client) {\n    return client.jid._local + '@' + client.jid._domain + '/' + client.jid._resource;\n  }\n\n  static trace(text) {\n    if (config.debug) {\n      console.log('[VideoChat]:', text);\n    }\n  }\n\n  static traceWarning(text) {\n    if (config.debug) {\n      console.warn('[VideoChat]:', text);\n    }\n  }\n\n  static traceError(text) {\n    if (config.debug) {\n      console.error('[VideoChat]:', text);\n    }\n  }\n\n  static getVersionFirefox() {\n    const ua = navigator ? navigator.userAgent : false;\n    let version;\n    if (ua) {\n      const ffInfo = ua.match(/(?:firefox)[ \\/](\\d+)/i) || [];\n      version = ffInfo[1] ? +ffInfo[1] : null;\n    }\n    return version;\n  }\n\n  static getVersionSafari() {\n    const ua = navigator ? navigator.userAgent : false;\n    let version;\n    if (ua) {\n      const sInfo = ua.match(/(?:safari)[ \\/](\\d+)/i) || [];\n      if (sInfo.length) {\n        const sVer = ua.match(/(?:version)[ \\/](\\d+)/i) || [];\n        if (sVer) {\n          version = sVer[1] ? +sVer[1] : null;\n        } else {\n          version = null;\n        }\n      } else {\n        version = null;\n      }\n    }\n\n    return version;\n  }\n}\n\nmodule.exports = WebRTCHelpers;\n","const config = require('../cubeConfig');\nconst RTCPeerConnection = require('./cubeRTCPeerConnection');\nconst Utils = require('../cubeInternalUtils');\nconst Helpers = require('./cubeWebRTCHelpers');\nconst SignalingConstants = require('./cubeWebRTCConstants').SignalingConstants;\nconst SessionState = require('./cubeWebRTCConstants').SessionState;\nconst PeerConnectionState = require('./cubeWebRTCConstants').PeerConnectionState;\nconst MediaDevicesImpl = require('../cubeDependencies').mediaDevices;\n\nclass WebRTCSession {\n  constructor(params) {\n    this.ID = params.sessionID ? params.sessionID : generateUUID();\n    this.state = SessionState.NEW;\n\n    this.initiatorID = parseInt(params.initiatorID);\n    this.opponentsIDs = params.opIDs;\n    this.callType = parseInt(params.callType);\n\n    this.peerConnections = {};\n\n    this.localStream = null;\n\n    this.mediaParams = null;\n\n    this.signalingProvider = params.signalingProvider;\n\n    this.currentUserID = params.currentUserID;\n\n    this.maxBandwidth = params.maxBandwidth;\n\n    this.answerTimer = null;\n\n    this.startCallTime = 0;\n    this.acceptCallTime = 0;\n\n    this.onUserNotAnswerListener = null;\n    this.onRemoteStreamListener = null;\n    this.onSessionCloseListener = null;\n    this.onCallStatsReport = null;\n    this.onSessionConnectionStateChangedListener = null;\n  }\n\n  getDisplayMedia(params) {\n    if (!MediaDevicesImpl.getDisplayMedia) {\n      throw new Error(\"Your environment does not support 'getDisplayMedia' API\");\n    }\n\n    const elementId = params && params.elementId;\n    const options = params && params.options;\n    const mediaParams = { ...params };\n\n    this.mediaParams = mediaParams;\n\n    delete mediaParams.elementId;\n    delete mediaParams.options;\n\n    return MediaDevicesImpl.getDisplayMedia(mediaParams)\n      .then((stream) => {\n        return this._upsertStream(stream, elementId, options);\n      })\n      .catch((error) => {\n        throw new Error(error);\n      });\n  }\n\n  getUserMedia(params) {\n    const elementId = params && params.elementId;\n    const options = params && params.options;\n    const mediaParams = { ...params };\n\n    this.mediaParams = mediaParams;\n\n    delete mediaParams.elementId;\n    delete mediaParams.options;\n\n    return MediaDevicesImpl.getUserMedia(mediaParams)\n      .then((stream) => {\n        return this._upsertStream(stream, elementId, options);\n      })\n      .catch((error) => {\n        throw new Error(error);\n      });\n  }\n\n  _upsertStream(stream, elementId, options) {\n    const shouldUpdateCurrentStream = !!this.localStream;\n\n    if (shouldUpdateCurrentStream) {\n      this.localStream.getTracks().forEach((track) => {\n        if (track.kind === 'audio' && stream.getAudioTracks().length === 0) {\n          return;\n        } else {\n          track.stop();\n          this.localStream.removeTrack(track);\n        }\n      });\n\n      this._replaceTracks(stream);\n    } else {\n      this.localStream = stream;\n    }\n\n    if (elementId) {\n      if (shouldUpdateCurrentStream) {\n        this.detachMediaStream(elementId, options);\n      }\n\n      this.attachMediaStream(elementId, this.localStream, options);\n    }\n\n    return this.localStream;\n  }\n\n  _replaceTracks(stream) {\n    const peers = this.peerConnections;\n\n    stream.getTracks().forEach((track) => {\n      if (track.kind === 'audio') {\n        track.enabled = this.localStream.getAudioTracks().every((track) => track.enabled);\n      } else {\n        track.enabled = this.localStream.getVideoTracks().every((track) => track.enabled);\n      }\n    });\n\n    for (let userId in peers) {\n      const peer = peers[userId];\n\n      peer.getSenders().map((sender) => {\n        const track = stream.getTracks().find((track) => {\n          return track.kind === sender.track.kind;\n        });\n\n        if (track) {\n          sender.replaceTrack(track);\n          this.localStream.addTrack(track);\n        }\n      });\n    }\n  }\n\n  setMaxBandwidth(maxBandwidth) {\n    const peers = this.peerConnections || [];\n\n    if (peers.length < 1) {\n      Helpers.trace(\"No 'RTCPeerConnection' to set 'maxBandwidth'\");\n\n      return;\n    }\n\n    for (let userId in peers) {\n      const peer = peers[userId];\n\n      peer.setRTCRtpSenderMaxBandwidth(maxBandwidth);\n    }\n  }\n\n  connectionStateForUser(userID) {\n    const peerConnection = this.peerConnections[userID];\n\n    if (peerConnection) {\n      return peerConnection.state;\n    }\n\n    return null;\n  }\n\n  attachMediaStream(id, stream, options) {\n    const elem = document.getElementById(id);\n\n    if (elem) {\n      if (typeof elem.srcObject === 'object') {\n        elem.srcObject = stream;\n      } else {\n        elem.src = window.URL.createObjectURL(stream);\n      }\n\n      if (options && options.muted) {\n        elem.muted = true;\n      }\n\n      if (options && options.mirror) {\n        elem.style.webkitTransform = 'scaleX(-1)';\n        elem.style.transform = 'scaleX(-1)';\n      }\n\n      elem.onloadedmetadata = function (e) {\n        elem.play();\n      };\n    } else {\n      throw new Error('Unable to attach media stream, element ' + id + ' is undefined');\n    }\n  }\n\n  detachMediaStream(id, options) {\n    const elem = document.getElementById(id);\n\n    if (elem) {\n      elem.pause();\n\n      if (typeof elem.srcObject === 'object') {\n        elem.srcObject = null;\n      } else {\n        elem.src = '';\n      }\n\n      if (options && !options.mirror) {\n        elem.style.webkitTransform = '';\n        elem.style.transform = '';\n      }\n    } else {\n      throw new Error('Unable to attach media stream, element ' + id + ' is undefined');\n    }\n  }\n\n  switchMediaTracks(deviceIds) {\n    Utils.DLog('switchMediaTracks(deviceIds)', { deviceIds });\n\n    if (deviceIds && deviceIds.audio) {\n      if (typeof this.mediaParams.audio === 'boolean') {\n        this.mediaParams.audio = {};\n      }\n      this.mediaParams.audio.deviceId = deviceIds.audio;\n    }\n\n    if (deviceIds && deviceIds.video) {\n      if (typeof this.mediaParams.video === 'boolean') {\n        this.mediaParams.video = {};\n      }\n      this.mediaParams.video.deviceId = deviceIds.video;\n    }\n\n    this.localStream.getTracks().forEach((track) => {\n      track.stop();\n    });\n\n    return MediaDevicesImpl.getUserMedia({\n      audio: this.mediaParams.audio || false,\n      video: this.mediaParams.video || false,\n    })\n      .then((stream) => {\n        return this._replaceTracks(stream);\n      })\n      .catch((error) => {\n        throw new Error(error);\n      });\n  }\n\n  call(extension) {\n    const ext = _prepareExtension(extension);\n\n    Helpers.trace('Call, extension: ' + JSON.stringify(ext));\n\n    this.state = SessionState.ACTIVE;\n    this.maxBandwidth = +ext.userInfo.maxBandwidth || 0;\n\n    this.opponentsIDs.forEach((userID, i, arr) => {\n      this._callInternal(userID, ext, true);\n    });\n  }\n\n  _callInternal(userID, extension, withOnNotAnswerCallback) {\n    const peer = this._createPeer(userID, 'offer');\n\n    this.localStream.getTracks().forEach((track) => {\n      peer.addTrack(track, this.localStream);\n    });\n\n    this.peerConnections[userID] = peer;\n\n    peer\n      .getAndSetLocalSessionDescription(this.maxBandwidth)\n      .then(() => {\n        Helpers.trace('getAndSetLocalSessionDescription success');\n        /* let's send call requests to user */\n        peer._startDialingTimer(extension, withOnNotAnswerCallback);\n      })\n      .catch((err) => {\n        Helpers.trace('getAndSetLocalSessionDescription error: ' + err);\n      });\n  }\n\n  accept(extension) {\n    const ext = _prepareExtension(extension);\n\n    Helpers.trace('Accept, extension: ' + JSON.stringify(ext.userInfo));\n\n    if (this.state === SessionState.ACTIVE) {\n      Helpers.traceError(\"Can't accept, the session is already active, return.\");\n      return;\n    }\n\n    if (this.state === SessionState.CLOSED) {\n      Helpers.traceError(\"Can't accept, the session is already closed, return.\");\n      this.stop({});\n      return;\n    }\n\n    this.state = SessionState.ACTIVE;\n\n    this.acceptCallTime = new Date();\n\n    this._clearAnswerTimer();\n\n    this._acceptInternal(this.initiatorID, ext);\n\n    // group call\n    const oppIDs = this._uniqueOpponentsIDsWithoutInitiator();\n    if (oppIDs.length > 0) {\n      const offerTime = (this.acceptCallTime - this.startCallTime) / 1000;\n      this._startWaitingOfferOrAnswerTimer(offerTime);\n\n      oppIDs.forEach((opID) => {\n        if (this.currentUserID > opID) {\n          this._callInternal(opID, {}, true);\n        }\n      });\n    }\n  }\n\n  _acceptInternal(userID, extension) {\n    const peerConnection = this.peerConnections[userID];\n\n    if (peerConnection) {\n      this.localStream.getTracks().forEach((track) => {\n        peerConnection.addTrack(track, this.localStream);\n      });\n\n      peerConnection\n        .setRemoteSessionDescription('offer', peerConnection.getRemoteSDP())\n        .then(() => {\n          Helpers.trace(\"'setRemoteSessionDescription' success\");\n          peerConnection\n            .getAndSetLocalSessionDescription(this.maxBandwidth)\n            .then(() => {\n              Helpers.trace(\"'getAndSetLocalSessionDescription' success\");\n              extension.sessionID = this.ID;\n              extension.callType = this.callType;\n              extension.callerID = this.initiatorID;\n              extension.opponentsIDs = this.opponentsIDs;\n              extension.sdp = peerConnection.localDescription.sdp;\n\n              this.signalingProvider.sendMessage(userID, extension, SignalingConstants.SignalingType.ACCEPT);\n            })\n            .catch((err) => {\n              Helpers.trace(\"'getAndSetLocalSessionDescription' error: \" + err);\n            });\n        })\n        .catch((error) => {\n          Helpers.traceError(\"'setRemoteSessionDescription' error: \" + error);\n        });\n    } else {\n      Helpers.traceError(\"Can't accept the call, there is no information about peer connection by some reason.\");\n    }\n  }\n\n  reject(extension) {\n    const ext = _prepareExtension(extension);\n\n    Helpers.trace('Reject, extension: ' + JSON.stringify(ext.userInfo));\n\n    this.state = SessionState.REJECTED;\n\n    this._clearAnswerTimer();\n\n    ext.sessionID = this.ID;\n    ext.callType = this.callType;\n    ext.callerID = this.initiatorID;\n    ext.opponentsIDs = this.opponentsIDs;\n\n    Object.keys(this.peerConnections).forEach((key) => {\n      const peerConnection = this.peerConnections[key];\n      this.signalingProvider.sendMessage(peerConnection.userID, ext, SignalingConstants.SignalingType.REJECT);\n    });\n\n    this._close();\n  }\n\n  stop(extension) {\n    const ext = _prepareExtension(extension);\n\n    Helpers.trace('Stop, extension: ' + JSON.stringify(ext.userInfo));\n\n    this.state = SessionState.HUNGUP;\n\n    if (this.answerTimer) {\n      this._clearAnswerTimer();\n    }\n\n    ext.sessionID = this.ID;\n    ext.callType = this.callType;\n    ext.callerID = this.initiatorID;\n    ext.opponentsIDs = this.opponentsIDs;\n\n    Object.keys(this.peerConnections).forEach((key) => {\n      const peerConnection = this.peerConnections[key];\n      this.signalingProvider.sendMessage(peerConnection.userID, ext, SignalingConstants.SignalingType.STOP);\n    });\n\n    this._close();\n  }\n\n  canInitiateIceRestart(userID) {\n    const peerConnection = this.peerConnections[userID];\n    return peerConnection.type === 'offer';\n  }\n\n  iceRestart(userID) {\n    const peerConnection = this.peerConnections[userID];\n    peerConnection\n      .getAndSetLocalSessionDescription(this.maxBandwidth, { iceRestart: true })\n      .then((offer) => {\n        Helpers.trace('[iceRestart][getAndSetLocalSessionDescription] Ok');\n\n        const ext = {\n          sessionID: this.ID,\n          sdp: offer.sdp,\n        };\n        this.signalingProvider.sendMessage(userID, ext, SignalingConstants.SignalingType.RESTART);\n      })\n      .catch((err) => {\n        Helpers.trace('[iceRestart][getAndSetLocalSessionDescription] Error: ' + err);\n      });\n  }\n\n  mute(type) {\n    this._muteStream(0, type);\n  }\n\n  unmute(type) {\n    this._muteStream(1, type);\n  }\n\n  _processOnCall(callerID, extension) {\n    const oppIDs = this._uniqueOpponentsIDs();\n\n    oppIDs.forEach((opID) => {\n      const pConn = this.peerConnections[opID];\n\n      if (pConn) {\n        if (opID == callerID) {\n          pConn.updateRemoteSDP(extension.sdp);\n\n          /** The group call logic starts here */\n          if (callerID != this.initiatorID && this.state === SessionState.ACTIVE) {\n            this._acceptInternal(callerID, {});\n          }\n        }\n      } else {\n        /** create peer connections for each opponent */\n        let peerConnection;\n        if (opID != callerID && this.currentUserID > opID) {\n          peerConnection = this._createPeer(opID, 'offer');\n        } else {\n          peerConnection = this._createPeer(opID, 'answer');\n        }\n\n        this.peerConnections[opID] = peerConnection;\n\n        if (opID == callerID) {\n          peerConnection.updateRemoteSDP(extension.sdp);\n          this._startAnswerTimer();\n        }\n      }\n    });\n  }\n\n  _processOnAccept(userID, extension) {\n    const peerConnection = this.peerConnections[userID];\n\n    if (peerConnection) {\n      peerConnection._clearDialingTimer();\n\n      peerConnection\n        .setRemoteSessionDescription('answer', extension.sdp)\n        .then(() => {\n          Helpers.trace(\"'setRemoteSessionDescription' success\");\n        })\n        .catch((error) => {\n          Helpers.traceError(\"'setRemoteSessionDescription' error: \" + error);\n        });\n    } else {\n      Helpers.traceWarning(\"Ignore 'OnAccept', there is no information about peer connection by some reason.\");\n    }\n  }\n\n  _processOnReject(userID, extension) {\n    const peerConnection = this.peerConnections[userID];\n\n    this._clearWaitingOfferOrAnswerTimer();\n\n    if (peerConnection) {\n      peerConnection.release();\n    } else {\n      Helpers.traceWarning(\"Ignore 'OnReject', there is no information about peer connection by some reason.\");\n    }\n\n    this._closeSessionIfAllConnectionsClosed();\n  }\n\n  _processOnStop(userID, extension) {\n    this._clearAnswerTimer();\n\n    /** drop the call if the initiator did it */\n    if (userID === this.initiatorID) {\n      const pcKeys = Object.keys(this.peerConnections);\n      if (pcKeys.length > 0) {\n        pcKeys.forEach((key) => {\n          this.peerConnections[key].release();\n        });\n      } else {\n        Helpers.traceWarning(\"Ignore 'OnStop', there is no information about peer connections by some reason.\");\n      }\n    } else {\n      const pc = this.peerConnections[userID];\n      if (pc) {\n        pc.release();\n      } else {\n        Helpers.traceWarning(\"Ignore 'OnStop', there is no information about peer connection by some reason.\");\n      }\n    }\n\n    this._closeSessionIfAllConnectionsClosed();\n  }\n\n  _processOnIceCandidates(userID, extension) {\n    const peerConnection = this.peerConnections[userID];\n    if (peerConnection) {\n      peerConnection.addCandidates(extension.iceCandidates);\n    } else {\n      Helpers.traceWarning(\"Ignore 'OnIceCandidates', there is no information about peer connection by some reason.\");\n    }\n  }\n\n  _processOnIceRestart(userID, extension) {\n    const peerConnection = this.peerConnections[userID];\n    if (peerConnection) {\n      peerConnection\n        .setRemoteSessionDescription('offer', extension.sdp)\n        .then(() => {\n          Helpers.trace(\"[_processOnIceRestart]'setRemoteSessionDescription' success\");\n          peerConnection\n            .getAndSetLocalSessionDescription(this.maxBandwidth)\n            .then((answer) => {\n              Helpers.trace(\"[_processOnIceRestart]'getAndSetLocalSessionDescription' success\");\n              const ext = {\n                sessionID: this.ID,\n                sdp: answer.sdp,\n              };\n\n              this.signalingProvider.sendMessage(userID, ext, SignalingConstants.SignalingType.RESTART_ACCEPT);\n            })\n            .catch((err) => {\n              Helpers.trace(\"[_processOnIceRestart] 'getAndSetLocalSessionDescription' error: \" + err);\n            });\n        })\n        .catch((error) => {\n          Helpers.traceError(\"[_processOnIceRestart] 'setRemoteSessionDescription' error: \" + error);\n        });\n    } else {\n      Helpers.traceWarning(\n        \"[_processOnIceRestart] Ignore 'OnIceRestart', there is no information about peer connection by some reason.\"\n      );\n    }\n  }\n\n  _processOnIceRestartAccept(userID, extension) {\n    const peerConnection = this.peerConnections[userID];\n\n    if (peerConnection) {\n      peerConnection\n        .setRemoteSessionDescription('answer', extension.sdp)\n        .then(() => {\n          Helpers.trace(\"[_processOnIceRestartAccept] 'setRemoteSessionDescription' success\");\n        })\n        .catch((error) => {\n          Helpers.traceError(\"[_processOnIceRestartAccept] 'setRemoteSessionDescription' error: \" + error);\n        });\n    } else {\n      Helpers.traceWarning(\n        \"[_processOnIceRestartAccept] Ignore 'OnIceRestartAccept', there is no information about peer connection by some reason.\"\n      );\n    }\n  }\n\n  _processCall(peerConnection, ext) {\n    const extension = ext || {};\n\n    extension.sessionID = this.ID;\n    extension.callType = this.callType;\n    extension.callerID = this.initiatorID;\n    extension.opponentsIDs = this.opponentsIDs;\n    extension.sdp = peerConnection.localDescription.sdp;\n    extension.userInfo = ext.userInfo || {};\n\n    this.signalingProvider.sendMessage(peerConnection.userID, extension, SignalingConstants.SignalingType.CALL);\n  }\n\n  _processIceCandidates(peerConnection, iceCandidates) {\n    const extension = {};\n\n    extension.sessionID = this.ID;\n    extension.callType = this.callType;\n    extension.callerID = this.initiatorID;\n    extension.opponentsIDs = this.opponentsIDs;\n\n    this.signalingProvider.sendCandidate(peerConnection.userID, iceCandidates, extension);\n  }\n\n  _processOnNotAnswer(peerConnection) {\n    Helpers.trace('Answer timeout callback for session ' + this.ID + ' for user ' + peerConnection.userID);\n\n    this._clearWaitingOfferOrAnswerTimer();\n\n    peerConnection.release();\n\n    Utils.safeCallbackCall(this.onUserNotAnswerListener, this, peerConnection.userID);\n\n    this._closeSessionIfAllConnectionsClosed();\n  }\n\n  _onRemoteStreamListener(userID, stream) {\n    Utils.safeCallbackCall(this.onRemoteStreamListener, this, userID, stream);\n  }\n\n  _onCallStatsReport(userId, stats, error) {\n    Utils.safeCallbackCall(this.onCallStatsReport, this, userId, stats, error);\n  }\n\n  _onSessionConnectionStateChangedListener(userID, connectionState) {\n    Utils.safeCallbackCall(this.onSessionConnectionStateChangedListener, this, userID, connectionState);\n  }\n\n  _createPeer(userID, peerConnectionType) {\n    this.startCallTime = new Date();\n\n    const pcConfig = {\n      iceServers: _prepareIceServers(config.videochat.iceServers),\n    };\n\n    if (config.videochat.alwaysRelayCalls) {\n      pcConfig.iceTransportPolicy = 'relay';\n    }\n\n    Helpers.trace('_createPeer, iceServers: ' + JSON.stringify(pcConfig));\n\n    const peer = new RTCPeerConnection(pcConfig);\n    peer._init(this, userID, this.ID, peerConnectionType);\n\n    return peer;\n  }\n\n  _close() {\n    Object.keys(this.peerConnections).forEach((key) => {\n      const peer = this.peerConnections[key];\n      try {\n        peer.release();\n      } catch (e) {\n        Utils.DLog('Peer close error:', e);\n      }\n    });\n\n    this._closeLocalMediaStream();\n\n    this.state = SessionState.CLOSED;\n\n    Utils.safeCallbackCall(this.onSessionCloseListener, this);\n  }\n\n  _closeSessionIfAllConnectionsClosed() {\n    let isAllConnectionsClosed = true;\n\n    Object.keys(this.peerConnections).forEach((key) => {\n      const peerCon = this.peerConnections[key];\n      let peerState;\n\n      try {\n        /*\n         * TODO:\n         * Uses RTCPeerConnection.signalingState instead RTCPeerConnection.iceConnectionState,\n         * because state 'closed' comes after few time from Safari, but signaling state comes instantly\n         */\n        peerState =\n          peerCon.iceConnectionState === 'closed'\n            ? 'closed'\n            : peerCon.signalingState === 'closed'\n              ? 'closed'\n              : peerCon.released\n                ? 'closed'\n                : null;\n      } catch (err) {\n        Helpers.traceError(err);\n        // need to set peerState to 'closed' on error. FF will crashed without this part.\n        peerState = 'closed';\n      }\n\n      if (peerState !== 'closed') {\n        isAllConnectionsClosed = false;\n      }\n    });\n\n    Helpers.trace('All peer connections closed: ' + isAllConnectionsClosed);\n\n    if (isAllConnectionsClosed) {\n      this._closeLocalMediaStream();\n\n      Utils.safeCallbackCall(this.onSessionCloseListener, this);\n\n      this.state = SessionState.CLOSED;\n    }\n  }\n\n  _closeLocalMediaStream() {\n    if (this.localStream) {\n      this.localStream.getAudioTracks().forEach((audioTrack) => {\n        audioTrack.stop();\n      });\n\n      this.localStream.getVideoTracks().forEach((videoTrack) => {\n        videoTrack.stop();\n      });\n\n      this.localStream = null;\n    }\n  }\n\n  _muteStream(enabled, type) {\n    if (type === 'audio' && this.localStream.getAudioTracks().length > 0) {\n      this.localStream.getAudioTracks().forEach((track) => {\n        track.enabled = !!enabled;\n      });\n      return;\n    }\n\n    if (type === 'video' && this.localStream.getVideoTracks().length > 0) {\n      this.localStream.getVideoTracks().forEach((track) => {\n        track.enabled = !!enabled;\n      });\n      return;\n    }\n  }\n\n  _clearAnswerTimer() {\n    if (this.answerTimer) {\n      Helpers.trace('_clearAnswerTimer');\n      clearTimeout(this.answerTimer);\n      this.answerTimer = null;\n    }\n  }\n\n  _startAnswerTimer() {\n    Helpers.trace('_startAnswerTimer');\n\n    const answerTimeoutCallback = () => {\n      Helpers.trace('_answerTimeoutCallback');\n\n      if (typeof this.onSessionCloseListener === 'function') {\n        this._close();\n      }\n\n      this.answerTimer = null;\n    };\n\n    const answerTimeInterval = config.videochat.answerTimeInterval * 1000;\n    this.answerTimer = setTimeout(answerTimeoutCallback, answerTimeInterval);\n  }\n\n  _clearWaitingOfferOrAnswerTimer() {\n    if (this.waitingOfferOrAnswerTimer) {\n      Helpers.trace('_clearWaitingOfferOrAnswerTimer');\n      clearTimeout(this.waitingOfferOrAnswerTimer);\n      this.waitingOfferOrAnswerTimer = null;\n    }\n  }\n\n  _startWaitingOfferOrAnswerTimer(time) {\n    const timeout = config.videochat.answerTimeInterval - time < 0 ? 1 : config.videochat.answerTimeInterval - time;\n\n    const waitingOfferOrAnswerTimeoutCallback = () => {\n      Helpers.trace('waitingOfferOrAnswerTimeoutCallback');\n\n      Object.keys(this.peerConnections).forEach((key) => {\n        const peerConnection = this.peerConnections[key];\n        if (\n          peerConnection.state === PeerConnectionState.CONNECTING ||\n          peerConnection.state === PeerConnectionState.NEW\n        ) {\n          this._processOnNotAnswer(peerConnection);\n        }\n      });\n\n      this.waitingOfferOrAnswerTimer = null;\n    };\n\n    Helpers.trace('_startWaitingOfferOrAnswerTimer, timeout: ' + timeout);\n\n    this.waitingOfferOrAnswerTimer = setTimeout(waitingOfferOrAnswerTimeoutCallback, timeout * 1000);\n  }\n\n  _uniqueOpponentsIDs() {\n    const opponents = [];\n\n    if (this.initiatorID !== this.currentUserID) {\n      opponents.push(this.initiatorID);\n    }\n\n    this.opponentsIDs.forEach((userID) => {\n      if (userID != this.currentUserID) {\n        opponents.push(parseInt(userID));\n      }\n    });\n\n    return opponents;\n  }\n\n  _uniqueOpponentsIDsWithoutInitiator() {\n    const opponents = [];\n\n    this.opponentsIDs.forEach((userID) => {\n      if (userID != this.currentUserID) {\n        opponents.push(parseInt(userID));\n      }\n    });\n\n    return opponents;\n  }\n\n  toString() {\n    return (\n      'ID: ' +\n      this.ID +\n      ', initiatorID:  ' +\n      this.initiatorID +\n      ', opponentsIDs: ' +\n      this.opponentsIDs +\n      ', state: ' +\n      this.state +\n      ', callType: ' +\n      this.callType\n    );\n  }\n}\n\nfunction generateUUID() {\n  let d = new Date().getTime();\n  const uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n    const r = (d + Math.random() * 16) % 16 | 0;\n    d = Math.floor(d / 16);\n    return (c == 'x' ? r : (r & 0x3) | 0x8).toString(16);\n  });\n  return uuid;\n}\n\nfunction _prepareExtension(extension = {}) {\n  const ext = { userInfo: extension };\n\n  try {\n    if (Utils.isObject(extension)) {\n      ext.userInfo = Utils.cloneObject(extension, true);\n    } else {\n      Helpers.traceWarning(\"Ignore 'extension', must be an object.\");\n    }\n  } catch (err) {\n    Helpers.traceWarning(err.message);\n  }\n\n  return ext;\n}\n\nfunction _prepareIceServers(iceServers) {\n  const iceServersCopy = Utils.cloneObject(iceServers);\n\n  Object.keys(iceServersCopy).forEach((c, i, a) => {\n    if (iceServersCopy[i].hasOwnProperty('url')) {\n      iceServersCopy[i].urls = iceServersCopy[i].url;\n    } else {\n      iceServersCopy[i].url = iceServersCopy[i].urls;\n    }\n  });\n\n  return iceServersCopy;\n}\n\nmodule.exports = WebRTCSession;\n","const SignalingConstants = require('./cubeWebRTCConstants').SignalingConstants;\nconst ChatHelpers = require('../messaging/cubeChatInternalUtils');\n\nclass WebRTCSignalingProcessor {\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  _onMessage(userId, extraParams) {\n    const extension = this._getExtension(extraParams);\n    const sessionId = extension.sessionID;\n    const signalType = extension.signalType;\n\n    /** cleanup */\n    delete extension.moduleIdentifier;\n    delete extension.sessionID;\n    delete extension.signalType;\n\n    switch (signalType) {\n      case SignalingConstants.SignalingType.CALL:\n        this.delegate._onCallListener(userId, sessionId, extension);\n        break;\n\n      case SignalingConstants.SignalingType.ACCEPT:\n        this.delegate._onAcceptListener(userId, sessionId, extension);\n        break;\n\n      case SignalingConstants.SignalingType.REJECT:\n        this.delegate._onRejectListener(userId, sessionId, extension);\n        break;\n\n      case SignalingConstants.SignalingType.STOP:\n        this.delegate._onStopListener(userId, sessionId, extension);\n        break;\n\n      case SignalingConstants.SignalingType.CANDIDATE:\n        this.delegate._onIceCandidatesListener(userId, sessionId, extension);\n        break;\n\n      case SignalingConstants.SignalingType.RESTART:\n        this.delegate._onIceRestartListener(userId, sessionId, extension);\n        break;\n\n      case SignalingConstants.SignalingType.RESTART_ACCEPT:\n        this.delegate._onIceRestartAcceptListener(userId, sessionId, extension);\n        break;\n    }\n  }\n\n  _getExtension(extraParams) {\n    if (!extraParams) {\n      return null;\n    }\n\n    let extension = {},\n      iceCandidates = [],\n      opponents = [],\n      candidate,\n      opponent,\n      childrenNodes;\n\n    let extraParamsChildNodes = extraParams.childNodes || extraParams.children;\n\n    for (let i = 0, len = extraParamsChildNodes.length; i < len; i++) {\n      const items = extraParamsChildNodes[i].childNodes || extraParamsChildNodes[i].children;\n      const itemTagName = extraParamsChildNodes[i].tagName || extraParamsChildNodes[i].name;\n\n      if (itemTagName === 'iceCandidates') {\n        for (let j = 0, len2 = items.length; j < len2; j++) {\n          candidate = {};\n          childrenNodes = items[j].childNodes || items[j].children;\n\n          for (let k = 0, len3 = childrenNodes.length; k < len3; k++) {\n            const childName = childrenNodes[k].tagName || childrenNodes[k].name;\n            const childValue = childrenNodes[k].textContent || childrenNodes[k].children[0];\n            candidate[childName] = childName === 'sdpMLineIndex' ? parseInt(childValue) : childValue;\n          }\n\n          iceCandidates.push(candidate);\n        }\n      } else if (itemTagName === 'opponentsIDs') {\n        for (let v = 0, len2v = items.length; v < len2v; v++) {\n          opponent = items[v].textContent || items[v].children[0];\n          opponents.push(parseInt(opponent));\n        }\n      } else {\n        if (items.length > 1) {\n          let nodeTextContentSize = (extraParamsChildNodes[i].textContent || extraParamsChildNodes[i].children[0])\n            .length;\n\n          if (nodeTextContentSize > 4096) {\n            let wholeNodeContent = '';\n\n            for (let t = 0; t < items.length; ++t) {\n              wholeNodeContent += items.textContent || items.children[0];\n            }\n            extension[itemTagName] = wholeNodeContent;\n          } else {\n            extension = ChatHelpers._XMLtoJS(extension, itemTagName, extraParamsChildNodes[i]);\n          }\n        } else {\n          if (itemTagName === 'userInfo') {\n            extension = ChatHelpers._XMLtoJS(extension, itemTagName, extraParamsChildNodes[i]);\n          } else {\n            extension[itemTagName] = extraParamsChildNodes[i].textContent || extraParamsChildNodes[i].children[0];\n          }\n        }\n      }\n    }\n    if (iceCandidates.length > 0) {\n      extension.iceCandidates = iceCandidates;\n    }\n    if (opponents.length > 0) {\n      extension.opponentsIDs = opponents;\n    }\n\n    return extension;\n  }\n}\n\nmodule.exports = WebRTCSignalingProcessor;\n","const Helpers = require('./cubeWebRTCHelpers');\nconst SignalingConstants = require('./cubeWebRTCConstants').SignalingConstants;\nconst Utils = require('../cubeInternalUtils');\nconst config = require('../cubeConfig');\nconst ChatHelpers = require('../messaging/cubeChatInternalUtils');\n\nclass WebRTCSignalingProvider {\n  constructor(signalingConnection) {\n    this.signalingConnection = signalingConnection;\n  }\n\n  sendCandidate(userId, iceCandidates, ext) {\n    const extension = ext || {};\n    extension.iceCandidates = iceCandidates;\n\n    this.sendMessage(userId, extension, SignalingConstants.SignalingType.CANDIDATE);\n  }\n\n  sendMessage(userId, ext, signalingType) {\n    const extension = ext || {};\n    /** basic parameters */\n    extension.moduleIdentifier = SignalingConstants.MODULE_ID;\n    extension.signalType = signalingType;\n    /** extension.sessionID */\n    /** extension.callType */\n    extension.platform = 'web';\n    /** extension.callerID */\n    /** extension.opponentsIDs */\n    /** extension.sdp */\n\n    if (extension.userInfo) {\n      if (!Object.keys(extension.userInfo).length) {\n        delete extension.userInfo;\n      } else if (extension.userInfo.maxBandwidth === 0) {\n        delete extension.userInfo.maxBandwidth;\n      }\n    }\n\n    const params = {\n      to: Helpers.getUserJid(userId, config.creds.appId),\n      type: 'headline',\n      id: Utils.getBsonObjectId(),\n    };\n\n    let msg = ChatHelpers.createMessageStanza(params).c('extraParams', {\n      xmlns: 'jabber:client',\n    });\n\n    Object.keys(extension).forEach((field) => {\n      if (field === 'iceCandidates') {\n        msg = msg.c('iceCandidates');\n        extension[field].forEach((candidate) => {\n          msg = msg.c('iceCandidate');\n          Object.keys(candidate).forEach((key) => {\n            msg = msg.c(key).t(candidate[key]).up();\n          });\n          msg = msg.up();\n        });\n        msg = msg.up();\n      } else if (field === 'opponentsIDs') {\n        msg = msg.c('opponentsIDs');\n        extension[field].forEach((opponentId) => {\n          msg = msg.c('opponentID').t(opponentId).up();\n        });\n        msg = msg.up();\n      } else if (typeof extension[field] === 'object') {\n        ChatHelpers._JStoXML(field, extension[field], msg);\n      } else {\n        msg = msg.c(field).t(extension[field]).up();\n      }\n    });\n    msg = msg.up();\n\n    this.signalingConnection.send(msg);\n  }\n}\n\nmodule.exports = WebRTCSignalingProvider;\n","const { EventEmitter } = require('fbemitter');\nconst { MediaStream } = require('../cubeDependencies');\nconst Janus = require('./janus');\nconst Utils = require('../cubeInternalUtils');\nconst coreConfig = require('../cubeConfig');\nconst { JANUS_EVENTS, JANUS_MEDIA_TRACKS_REASONS } = require('./cubeConferenceConstants');\n\nclass JanusVideoConferencingWrapper {\n  constructor(configParams) {\n    if (!Utils.getEnv().reactnative && !adapter) {\n      throw 'Error: in order to use this library please connect adapter.js. More info https://github.com/webrtc/adapter';\n    }\n\n    this.token = configParams.token;\n    delete configParams.token;\n\n    this.configs = configParams;\n    if (!this.configs.server) {\n      throw `'server' parameter is mandatory.`;\n    } else if (this.configs.server.includes('http')) {\n      this.configs.server = this.configs.server + '/janus';\n    }\n    if (!this.configs.debug) {\n      this.configs.debug = 'all';\n    }\n\n    this.engine = null;\n    this.videoRoomPlugin = null;\n    this.isOnlyAudio = false;\n    //\n    this.currentRoomId = null;\n    this.remoteFeeds = {};\n    this.remoteJseps = {};\n    this.remoteFeedsAttachingInProgress = {};\n    /*\n     * Deprecated\n    this.currentMediaDeviceId = null\n     */\n    this.bitrateTimers = {};\n    //\n    this.emitter = new EventEmitter();\n  }\n\n  createSession(callbacks) {\n    Janus.init({\n      debug: this.configs.debug,\n      callback: () => {\n        if (!Janus.isWebrtcSupported()) {\n          Utils.safeCallbackCall(\n            callbacks.error,\n            `Your browser does not support WebRTC, so you can't use this functionality.`\n          );\n          return;\n        }\n\n        this.engine = new Janus({\n          server: this.configs.server,\n          iceServers: coreConfig.videochat.iceServers,\n          token: this.token,\n\n          success: () => {\n            Utils.safeCallbackCall(callbacks.success);\n          },\n          error: (error) => {\n            Utils.safeCallbackCall(callbacks.error, error);\n          },\n          destroyed: () => {\n            Utils.safeCallbackCall(callbacks.destroyed);\n          },\n          timeoutSessionCallback: () => {\n            Utils.safeCallbackCall(callbacks.timeoutSessionCallback);\n          },\n        });\n      },\n    });\n  }\n\n  getSessionId() {\n    if (this.engine) {\n      return this.engine.getSessionId();\n    }\n    return null;\n  }\n\n  destroySession(callbacks) {\n    this.engine.destroy({});\n\n    Utils.safeCallbackCall(callbacks.success);\n  }\n\n  attachVideoConferencingPlugin(isRemote, userId, skipMedia, callbacks) {\n    let remoteFeed = null;\n\n    const localStream = callbacks.localStream;\n    delete callbacks.localStream;\n\n    const displayName = callbacks.displayName;\n    delete callbacks.displayName;\n\n    this.engine.attach({\n      plugin: 'janus.plugin.videoroom',\n      success: (pluginHandle) => {\n        if (isRemote) {\n          remoteFeed = pluginHandle;\n          remoteFeed.userId = userId;\n          this.remoteFeedsAttachingInProgress[userId] = remoteFeed;\n\n          const listen = {\n            request: 'join',\n            room: this.currentRoomId,\n            ptype: 'listener',\n            feed: userId,\n            display: displayName,\n          };\n\n          remoteFeed.send({ message: listen });\n        } else {\n          this.videoRoomPlugin = pluginHandle;\n        }\n\n        Utils.safeCallbackCall(callbacks.success);\n      },\n      error: (error) => {\n        Utils.safeCallbackCall(callbacks.error, error);\n      },\n      consentDialog: (on) => {\n        Utils.safeCallbackCall(callbacks.consentDialog, on);\n      },\n      mediaState: (medium, on) => {\n        Utils.safeCallbackCall(callbacks.mediaState, medium, on);\n      },\n      webrtcState: (on) => {\n        Utils.safeCallbackCall(callbacks.webrtcState, on);\n      },\n      slowLink: (uplink, nacks) => {\n        Utils.safeCallbackCall(callbacks.slowLink, uplink, nacks);\n      },\n      iceState: (iceConnectionState) => {\n        Utils.safeCallbackCall(callbacks.iceState, iceConnectionState);\n      },\n      onmessage: (msg, jsep) => {\n        const event = msg['videoroom'];\n\n        if (isRemote) {\n          if (event) {\n            // Remote feed attached\n            if (event === 'attached') {\n              const feedId = msg['id'];\n              this.remoteFeeds[feedId] = this.remoteFeedsAttachingInProgress[feedId];\n              this.remoteFeedsAttachingInProgress[feedId] = null;\n            } else if (msg['error']) {\n              Utils.safeCallbackCall(callbacks.error, msg['error']);\n            }\n          }\n\n          if (jsep) {\n            const feedId = msg['id'];\n\n            // ICE restart case\n            if (!feedId) {\n            }\n\n            this.remoteJseps[feedId] = jsep;\n\n            this.createAnswer(\n              {\n                remoteFeed: this.remoteFeeds[feedId],\n                jsep,\n              },\n              localStream,\n              {\n                success: () => {},\n                error: (error) => {\n                  Utils.safeCallbackCall(callbacks.error, error);\n                },\n              }\n            );\n          }\n\n          // local feed\n        } else {\n          if (event) {\n            // We JOINED\n            if (event === 'joined') {\n              const media = skipMedia ? { audio: false, video: false } : { audio: true, video: true };\n              const existedStream = skipMedia ? null : localStream;\n              const offerParams = { media, stream: existedStream };\n              this.createOffer(offerParams, {\n                success: () => {\n                  if (msg['publishers']) {\n                    const publishers = msg['publishers'];\n                    for (const f in publishers) {\n                      const userId = publishers[f]['id'];\n                      const userDisplayName = publishers[f]['display'];\n                      this.emitter.emit(JANUS_EVENTS.PARTICIPANT_JOINED, userId, userDisplayName, true);\n                    }\n                  }\n                },\n                error: (error) => {\n                  Utils.safeCallbackCall(callbacks.error, error);\n                },\n              });\n\n              // We JOINED and now receiving who is online\n            } else if (event === 'event') {\n              // Any new feed to attach to?\n              if (msg['publishers']) {\n                const publishers = msg['publishers'];\n\n                for (const f in publishers) {\n                  const userId = publishers[f]['id'];\n                  const userDisplayName = publishers[f]['display'];\n\n                  this.emitter.emit(JANUS_EVENTS.PARTICIPANT_JOINED, userId, userDisplayName, false);\n                }\n\n                // Someone is LEAVING\n              } else if (msg['leaving']) {\n                // One of the publishers has gone away?\n                const feedId = msg['leaving'];\n                const success = this.detachRemoteFeed(feedId);\n                if (success) {\n                  this.emitter.emit(JANUS_EVENTS.PARTICIPANT_LEFT, feedId, null);\n                }\n              } else if (msg['unpublished']) {\n                // One of the publishers has gone away?\n                const feedId = msg['unpublished'];\n                if (feedId != 'ok') {\n                  const success = this.detachRemoteFeed(feedId);\n                  if (success) {\n                    this.emitter.emit(JANUS_EVENTS.PARTICIPANT_LEFT, feedId, null);\n                  }\n                }\n              } else if (msg['error']) {\n                Utils.DLog('[janus error message]', msg['error']);\n                // #define VIDEOROOM_ERROR_ID_EXISTS\t\t\t436\n                // #define VIDEOROOM_ERROR_UNAUTHORIZED\t\t433\n                //\n                this.emitter.emit(JANUS_EVENTS.ERROR, msg);\n                Utils.safeCallbackCall(callbacks.error, msg['error']);\n              }\n            }\n          }\n\n          if (jsep) {\n            this.videoRoomPlugin.handleRemoteJsep({ jsep: jsep });\n\n            // TODO:\n            // handle wrong or unsupported codecs here...\n            // const video = msg['video_codec']\n            // if(mystream && mystream.getVideoTracks() && mystream.getVideoTracks().length > 0 && !video) {\n            // \t\t'Our video stream has been rejected, viewers won't see us'\n            // }\n          }\n        }\n      },\n      onlocaltrack: (track, on) => {\n        Utils.DLog('[onlocaltrack]', track, on);\n        this.onLocalTrack(track, on);\n      },\n      onremotetrack: (track, mid, on, metadata) => {\n        Utils.DLog('[onremotetrack]', track, mid, on, metadata);\n        this.onRemoteTrack(remoteFeed, track, mid, on, metadata);\n      },\n      ondataopen: (channelLabel) => {\n        Utils.DLog('[ondataopen]', channelLabel);\n        this.emitter.emit(JANUS_EVENTS.DATA_CHANNEL_OPEN, channelLabel);\n      },\n      ondata: (data, channelLabel) => {\n        Utils.DLog('[ondata]', channelLabel, data);\n        this.emitter.emit(JANUS_EVENTS.DATA_CHANNEL_MESSAGE, channelLabel, data);\n      },\n      oncleanup: () => {\n        Utils.safeCallbackCall(callbacks.oncleanup);\n      },\n      detached: () => {},\n    });\n  }\n\n  onLocalTrack(track, on) {\n    // this.emitter.emit(JANUS_EVENTS.LOCAL_STREAM, stream)\n  }\n\n  onRemoteTrack(remoteFeed, track, mid, on, metadata) {\n    const eventType = metadata && metadata.reason;\n\n    if (eventType === JANUS_MEDIA_TRACKS_REASONS.CREATED) {\n      const isStreamNoExistedBefore = !remoteFeed.stream || !remoteFeed.tracks;\n      if (isStreamNoExistedBefore) {\n        remoteFeed.tracks = { [mid]: track };\n        remoteFeed.stream = new MediaStream([track]);\n      } else {\n        remoteFeed.tracks[mid] = track;\n        remoteFeed.stream.addTrack(track);\n      }\n      if (isStreamNoExistedBefore) {\n        this.emitter.emit(JANUS_EVENTS.REMOTE_STREAM, remoteFeed.userId, remoteFeed.stream);\n      }\n    } else if (eventType === JANUS_MEDIA_TRACKS_REASONS.ENDED) {\n      delete remoteFeed.tracks[mid];\n\n      const trackToRemove = remoteFeed.stream.getTracks().find((streamTrack) => streamTrack.kind === track.kind);\n      remoteFeed.stream.removeTrack(trackToRemove);\n    }\n\n    this.emitter.emit(JANUS_EVENTS.REMOTE_TRACKS_UPDATED, remoteFeed.userId, track, eventType);\n  }\n\n  getPluginId() {\n    if (this.videoRoomPlugin) {\n      return this.videoRoomPlugin.getId();\n    }\n    return null;\n  }\n\n  detachVideoConferencingPlugin(callbacks) {\n    const clean = () => {\n      this.videoRoomPlugin = null;\n\n      // detach all remote feeds\n      Object.keys(this.remoteFeeds).forEach((userId) => {\n        this.detachRemoteFeed(userId);\n      });\n\n      this.remoteFeeds = {};\n      this.remoteJseps = {};\n      /*\n       * Deprecated\n      this.currentMediaDeviceId = null\n       */\n    };\n\n    this.videoRoomPlugin.detach({\n      success: () => {\n        clean();\n\n        Utils.safeCallbackCall(callbacks.success);\n      },\n      error: (error) => {\n        clean();\n\n        Utils.safeCallbackCall(callbacks.error, error);\n      },\n    });\n  }\n\n  join(roomId, userId, isOnlyAudio, callbacks) {\n    const displayName = callbacks.displayName;\n    delete callbacks.displayName;\n\n    this.isOnlyAudio = !!isOnlyAudio;\n\n    Utils.DLog('isOnlyAudio: ' + this.isOnlyAudio);\n\n    const joinEvent = {\n      request: 'join',\n      room: roomId,\n      ptype: 'publisher',\n      id: userId,\n      display: displayName,\n    };\n\n    this.videoRoomPlugin.send({\n      message: joinEvent,\n      success: (resp) => {\n        this.currentRoomId = roomId;\n        this.currentUserId = userId;\n\n        Utils.safeCallbackCall(callbacks.success);\n      },\n      error: (error) => {\n        Utils.safeCallbackCall(callbacks.error, error);\n      },\n    });\n  }\n\n  leave(callbacks) {\n    Utils.DLog('leave');\n\n    if (!this.engine.isConnected()) {\n      Utils.safeCallbackCall(callbacks.success);\n      return;\n    }\n\n    const leaveEvent = {\n      request: 'leave',\n      room: this.currentRoomId,\n      id: this.currentUserId,\n    };\n\n    if (this.videoRoomPlugin) {\n      this.videoRoomPlugin.send({ message: leaveEvent });\n    }\n    this.currentRoomId = null;\n    this.currentUserId = null;\n\n    Utils.safeCallbackCall(callbacks.success);\n  }\n\n  listOnlineParticipants(roomId, callbacks) {\n    const listRequest = { request: 'listparticipants', room: roomId };\n\n    this.videoRoomPlugin.send({\n      message: listRequest,\n      success: (data) => {\n        const participants = data ? data.participants : [];\n        Utils.safeCallbackCall(callbacks.success, participants);\n      },\n      error: (error) => {\n        Utils.safeCallbackCall(callbacks.error, error);\n      },\n    });\n  }\n\n  toggleAudioMute() {\n    const muted = this.videoRoomPlugin.isAudioMuted();\n    if (muted) {\n      this.videoRoomPlugin.unmuteAudio();\n    } else {\n      this.videoRoomPlugin.muteAudio();\n    }\n    return this.videoRoomPlugin.isAudioMuted();\n  }\n\n  isAudioMuted() {\n    return this.videoRoomPlugin.isAudioMuted();\n  }\n\n  toggleRemoteAudioMute(userId) {\n    const remoteFeed = this.remoteFeeds[userId];\n    if (!remoteFeed) {\n      return false;\n    }\n\n    const audioTracks = remoteFeed.stream.getAudioTracks();\n    if (audioTracks && audioTracks.length > 0) {\n      for (let i = 0; i < audioTracks.length; ++i) {\n        audioTracks[i].enabled = !audioTracks[i].enabled;\n      }\n      return !audioTracks[0].enabled;\n    }\n\n    return false;\n  }\n\n  isRemoteAudioMuted(userId) {\n    const remoteFeed = this.remoteFeeds[userId];\n    if (!remoteFeed) {\n      return false;\n    }\n\n    const audioTracks = remoteFeed.stream.getAudioTracks();\n    if (audioTracks && audioTracks.length > 0) {\n      return !audioTracks[0].enabled;\n    }\n\n    return false;\n  }\n\n  toggleVideoMute() {\n    const muted = this.videoRoomPlugin.isVideoMuted();\n    if (muted) {\n      this.videoRoomPlugin.unmuteVideo();\n    } else {\n      this.videoRoomPlugin.muteVideo();\n    }\n    return this.videoRoomPlugin.isVideoMuted();\n  }\n\n  isVideoMuted() {\n    return this.videoRoomPlugin.isVideoMuted();\n  }\n\n  toggleRemoteVideoMute(userId) {\n    const remoteFeed = this.remoteFeeds[userId];\n    if (!remoteFeed) {\n      return false;\n    }\n\n    const videoTracks = remoteFeed.stream.getVideoTracks();\n    if (videoTracks && videoTracks.length > 0) {\n      for (let i = 0; i < videoTracks.length; ++i) {\n        videoTracks[i].enabled = !videoTracks[i].enabled;\n      }\n      return !videoTracks[0].enabled;\n    }\n\n    return false;\n  }\n\n  isRemoteVideoMuted(userId) {\n    const remoteFeed = this.remoteFeeds[userId];\n    if (!remoteFeed) {\n      return false;\n    }\n\n    const videoTracks = remoteFeed.stream.getVideoTracks();\n    if (videoTracks && videoTracks.length > 0) {\n      return !videoTracks[0].enabled;\n    }\n\n    return false;\n  }\n\n  //TODO: The \"switchVideoinput\" have to be removed in v3.26.*\n  switchVideoinput(mediaDeviceId, callbacks) {\n    console.warn(\n      `[ConnectyCube.videochatconference] The method \"switchVideoinput(mediaDeviceId, callbacks)\" was deprecated. Use \"videoConferenceSession.switchMediaTracks(mediaDeviceId): Promise<any>\" instead.`\n    );\n  }\n\n  //TODO: The \"switchAudioinput\" have to be removed in v3.26.*\n  switchAudioinput(mediaDeviceId, callbacks) {\n    console.warn(\n      `[ConnectyCube.videochatconference] The method \"switchAudioinput(mediaDeviceId, callbacks)\" was deprecated. Use \"videoConferenceSession.switchMediaTracks(mediaDeviceId): Promise<any>\" instead.`\n    );\n  }\n\n  sendKeyframeRequest(roomId, callbacks) {\n    const configureRequest = {\n      request: 'configure',\n      room: roomId,\n      keyframe: true,\n    };\n\n    this.videoRoomPlugin.send({\n      message: configureRequest,\n      success: (response) => {\n        Utils.safeCallbackCall(callbacks.success);\n      },\n      error: (error) => {\n        Utils.safeCallbackCall(callbacks.error, error);\n      },\n    });\n  }\n\n  getTracksFromStream(stream) {\n    const tracks = [];\n\n    const audioTracks = stream.getAudioTracks();\n    if (audioTracks.length) {\n      const audioTrack = audioTracks[0];\n      tracks.push({ type: 'audio', capture: audioTrack, recv: false });\n    }\n\n    const videoTracks = stream.getVideoTracks();\n    if (videoTracks.length) {\n      const videoTrack = videoTracks[0];\n      tracks.push({ type: 'video', capture: videoTrack, recv: false });\n    }\n\n    return tracks;\n  }\n\n  createOffer(mediaParams, callbacks) {\n    Utils.DLog('[JanusWrapper][createOffer]', mediaParams);\n\n    const { stream: existedStream, media, replace } = mediaParams;\n\n    const createOfferParams = { tracks: [{ type: 'data' }] };\n\n    if (existedStream) {\n      const tracksFromStream = this.getTracksFromStream(existedStream);\n      createOfferParams.tracks = createOfferParams.tracks.concat(tracksFromStream);\n    } else if (media) {\n      const tracksFromParams = [];\n      if (media.audio) {\n        tracksFromParams.push({\n          type: 'audio',\n          capture: media.audio,\n          recv: false,\n          replace: !!replace,\n        });\n      }\n      if (media.video) {\n        tracksFromParams.push({\n          type: 'video',\n          capture: media.video,\n          recv: false,\n          replace: !!replace,\n        });\n      }\n      createOfferParams.tracks = createOfferParams.tracks.concat(tracksFromParams);\n    } else {\n      createOfferParams.tracks = createOfferParams.tracks.concat([\n        { type: 'audio', capture: true, recv: false, replace: !!replace },\n        { type: 'video', capture: true, recv: false, replace: !!replace },\n      ]);\n    }\n\n    Utils.DLog('[JanusWrapper][createOffer][params]', createOfferParams);\n\n    createOfferParams.customizeSdp = (jsep) => {};\n\n    createOfferParams.success = (jsep) => {\n      const publish = {\n        request: 'configure',\n        audio: !!media.audio,\n        video: !!media.video,\n      };\n      Utils.DLog('[JanusWrapper][createOffer][success]', publish);\n\n      this.videoRoomPlugin.send({ message: publish, jsep: jsep });\n\n      Utils.safeCallbackCall(callbacks.success);\n    };\n\n    createOfferParams.error = (error) => {\n      Utils.DLog('[JanusWrapper][createOffer][error]', error);\n      if (media.audio) {\n        this.createOffer({ media: { video: false, audio: false } }, callbacks);\n      } else {\n        Utils.safeCallbackCall(callbacks.error, error);\n      }\n    };\n\n    this.videoRoomPlugin.createOffer(createOfferParams);\n  }\n\n  getTracksMidsFromStream(stream) {\n    const tracks = [];\n\n    const audioTracks = stream.getAudioTracks();\n    if (audioTracks.length) {\n      const audioTrack = audioTracks[0];\n      tracks.push({ type: 'audio', mid: audioTrack.id, recv: true });\n    }\n\n    const videoTracks = stream.getVideoTracks();\n    if (videoTracks.length) {\n      const videoTrack = videoTracks[0];\n      tracks.push({ type: 'video', mid: videoTrack.id, recv: true });\n    }\n\n    return tracks;\n  }\n\n  createAnswer({ remoteFeed, jsep }, existedStream, callbacks) {\n    Utils.DLog('[JanusWrapper][createAnswer]', jsep, existedStream);\n    let tracks = [{ type: 'data' }];\n\n    if (existedStream) {\n      const tracksFromStream = this.getTracksMidsFromStream(existedStream);\n      tracks = tracks.concat(tracksFromStream);\n    }\n\n    Utils.DLog('[JanusWrapper][createAnswer][tracks]', tracks);\n\n    remoteFeed.createAnswer({\n      jsep: jsep,\n      tracks: tracks,\n      success: (jsep) => {\n        const body = { request: 'start', room: this.currentRoomId };\n        Utils.DLog('[JanusWrapper][createAnswer][success]', body);\n\n        remoteFeed.send({ message: body, jsep: jsep });\n\n        Utils.safeCallbackCall(callbacks.success);\n      },\n      error: (error) => {\n        Utils.DLog('[JanusWrapper][createAnswer][error]', error);\n        Utils.safeCallbackCall(callbacks.error, error);\n      },\n    });\n  }\n\n  detachRemoteFeed(userId) {\n    const remoteFeed = this.remoteFeeds[userId];\n    if (remoteFeed) {\n      remoteFeed.detach();\n      this.remoteFeeds[userId] = null;\n      this.remoteJseps[userId] = null;\n      return true;\n    }\n    return false;\n  }\n\n  getUserBitrate(userId) {\n    const remoteFeed = this.remoteFeeds[userId];\n    return remoteFeed.getBitrate();\n  }\n\n  getVolume(resultCallback) {\n    return this.videoRoomPlugin.getLocalVolume(null, resultCallback);\n  }\n\n  getUserVolume(userId, resultCallback) {\n    const remoteFeed = this.remoteFeeds[userId];\n    return remoteFeed.getRemoteVolume(null, resultCallback);\n  }\n\n  showBitrate(userId, element) {\n    const remoteFeed = this.remoteFeeds[userId];\n\n    if (\n      !Utils.getEnv().reactnative &&\n      (adapter.browserDetails.browser === 'chrome' || adapter.browserDetails.browser === 'firefox')\n    ) {\n      this.bitrateTimers[userId] = setInterval(() => {\n        const bitrate = remoteFeed.getBitrate();\n        element.text(bitrate);\n      }, 1000);\n    }\n  }\n\n  hideBitrate(userId, element) {\n    if (this.bitrateTimers[userId]) {\n      clearInterval(this.bitrateTimers[userId]);\n    }\n    this.bitrateTimers[userId] = null;\n    element.text = null;\n  }\n\n  on(eventType, listener) {\n    const token = this.emitter.addListener(eventType, listener);\n    return token;\n  }\n\n  removeAllListeners(eventType) {\n    if (eventType) {\n      this.emitter.removeAllListeners(eventType);\n    } else {\n      this.emitter.removeAllListeners();\n    }\n  }\n}\n\nmodule.exports = { Client: JanusVideoConferencingWrapper };\n","const coreConfig = require('../cubeConfig');\nconst ConferenceSession = require('./cubeConferenceSession');\nconst { DEVICE_INPUT_TYPES, CALL_TYPES } = require('./cubeConferenceConstants');\nconst { mediaDevices } = require('../cubeDependencies');\n\nclass ConferenceClient {\n  constructor(proxy) {\n    this.proxy = proxy;\n\n    this.DEVICE_INPUT_TYPES = DEVICE_INPUT_TYPES;\n    this.CALL_TYPES = CALL_TYPES;\n\n    this.sessionsStore = {};\n\n    this.onParticipantJoinedListener = null;\n    this.onParticipantLeftListener = null;\n    this.onSlowLinkListener = null;\n    this.onRemoteStreamListener = null;\n    this.onRemoteTracksUpdatedListener = null;\n    this.onRemoteConnectionStateChangedListener = null;\n    this.onDataChannelOpenedListener = null;\n    this.onDataChannelMessageListener = null;\n    this.onSessionConnectionStateChangedListener = null;\n    this.onErrorListener = null;\n  }\n\n  createNewSession() {\n    const session = new ConferenceSession(\n      Object.assign(coreConfig.conference, {\n        token: this.getCurrentSessionToken(),\n      })\n    );\n\n    session.onParticipantJoinedListener = this.onParticipantJoinedListener;\n    session.onParticipantLeftListener = this.onParticipantLeftListener;\n\n    session.onSlowLinkListener = this.onSlowLinkListener;\n    session.onRemoteStreamListener = this.onRemoteStreamListener;\n    session.onRemoteTracksUpdatedListener = this.onRemoteTracksUpdatedListener;\n    session.onRemoteConnectionStateChangedListener = this.onRemoteConnectionStateChangedListener;\n    session.onDataChannelOpenedListener = this.onDataChannelOpenedListener;\n    session.onDataChannelMessageListener = this.onDataChannelMessageListener;\n    session.onSessionConnectionStateChangedListener = this.onSessionConnectionStateChangedListener;\n    session.onErrorListener = this.onErrorListener;\n\n    this.sessionsStore[session.id] = session;\n\n    return session;\n  }\n\n  async getMediaDevices(deviceInputType) {\n    const mediaDevices = await this._listDevices();\n    if (deviceInputType === DEVICE_INPUT_TYPES.VIDEO) {\n      return mediaDevices.filter(({ kind }) => kind === DEVICE_INPUT_TYPES.VIDEO);\n    } else if (deviceInputType === DEVICE_INPUT_TYPES.AUDIO) {\n      return mediaDevices.filter(({ kind }) => kind === DEVICE_INPUT_TYPES.AUDIO);\n    }\n    return mediaDevices;\n  }\n\n  _listDevices() {\n    return mediaDevices.enumerateDevices();\n  }\n\n  clearSession(session_id) {\n    delete this.sessionsStore[session_id];\n  }\n\n  getCurrentSessionToken() {\n    const currentSession = this.proxy.getSession();\n    if (!currentSession) {\n      throw new Error('Session does not exist');\n    }\n    return this.proxy.getSession().token;\n  }\n}\n\nmodule.exports = ConferenceClient;\n","const CALL_TYPES = {\n  VIDEO: 'video',\n  AUDIO: 'audio',\n};\n\nconst DEVICE_INPUT_TYPES = {\n  VIDEO: 'videoinput',\n  AUDIO: 'audioinput',\n};\n\nconst JANUS_EVENTS = {\n  PARTICIPANT_JOINED: 'participant_joined',\n  PARTICIPANT_LEFT: 'participant_left',\n\n  LOCAL_STREAM: 'local_stream',\n\n  REMOTE_STREAM: 'remote_stream',\n  REMOTE_TRACKS_UPDATED: 'remote_tracks_updated',\n\n  DATA_CHANNEL_OPEN: 'data_channel_open',\n  DATA_CHANNEL_MESSAGE: 'data_channel_message',\n\n  ERROR: 'error',\n};\n\nconst JANUS_MEDIA_TRACKS_REASONS = {\n  CREATED: 'created',\n  ENDED: 'ended',\n  MUTE: 'mute',\n  UNMUTE: 'unmute',\n};\n\nmodule.exports = {\n  CALL_TYPES,\n  DEVICE_INPUT_TYPES,\n  JANUS_EVENTS,\n  JANUS_MEDIA_TRACKS_REASONS,\n};\n","const Utils = require('../cubeInternalUtils');\nconst { mediaDevices } = require('../cubeDependencies');\nconst { Client: JanusVideoConferencingClient } = require('./JanusVideoConferencingWrapper');\nconst { CALL_TYPES, JANUS_EVENTS } = require('./cubeConferenceConstants');\n\nclass ConferenceSession {\n  constructor(janusConfig) {\n    this.id = `${Math.random()}`;\n    this._clientConf = new JanusVideoConferencingClient(janusConfig);\n    this._setOnParticipantJoinListener();\n    this._setOnParticipantLeftListener();\n    this._setOnRemoteStreamListener();\n    this._setOnRemoteTracksUpdatedListener();\n    this._setOnDataChannelOpenListener();\n    this._setOnDataChannelMessageListener();\n    this._setOnErrorListener();\n\n    this.currentUserDisplayName;\n\n    this.localStream;\n\n    this.onParticipantJoinedListener = null;\n    this.onParticipantLeftListener = null;\n    this.onSlowLinkListener = null;\n    this.onRemoteStreamListener = null;\n    this.onRemoteTracksUpdatedListener = null;\n    this.onRemoteConnectionStateChangedListener = null;\n    this.onDataChannelOpenedListener = null;\n    this.onDataChannelMessageListener = null;\n    this.onSessionConnectionStateChangedListener = null;\n    this.onErrorListener = null;\n  }\n\n  get currentRoomId() {\n    return this._clientConf.currentRoomId;\n  }\n\n  set currentRoomId(roomId) {\n    return (this._clientConf.currentRoomId = roomId);\n  }\n\n  get currentPublisherPC() {\n    return this._clientConf.videoRoomPlugin.webrtcStuff.pc;\n  }\n\n  _createSession() {\n    let isResolved = false;\n\n    return new Promise((resolve, reject) => {\n      this._clientConf.createSession({\n        success: () => {\n          isResolved = true;\n          resolve();\n        },\n        error: (err) => {\n          if (isResolved) {\n            this._onError(err);\n          } else {\n            reject(err);\n          }\n        },\n      });\n    });\n  }\n\n  // joinAsPublisher+Listener\n  async join(roomId, user_id, userDisplayName) {\n    this.currentUserDisplayName = userDisplayName;\n    await this._createSession();\n    this.currentRoomId = roomId;\n\n    await this._createHandler(false, user_id);\n    await this._join(this.currentRoomId, user_id);\n  }\n\n  async joinAsListener(roomId, user_id, userDisplayName) {\n    this.currentUserDisplayName = userDisplayName;\n    await this._createSession();\n    this.currentRoomId = roomId;\n\n    await this._createHandler(false, user_id, true);\n    await this._join(this.currentRoomId, user_id);\n  }\n\n  sendKeyframeRequest(roomId) {\n    return new Promise((resolve, reject) => {\n      this._clientConf.sendKeyframeRequest(roomId, {\n        success: resolve,\n        error: reject,\n      });\n    });\n  }\n\n  async _createListener(user_id) {\n    await this._createHandler(true, user_id);\n  }\n\n  _createHandler(isRemote, user_id, skipMedia = false) {\n    return new Promise((resolve, reject) => {\n      this._clientConf.attachVideoConferencingPlugin(isRemote, user_id, skipMedia, {\n        success: resolve,\n        error: reject,\n        iceState: isRemote\n          ? this._onRemoteIceStateChanged.bind(this, user_id)\n          : this._onLocalIceStateChanged.bind(this),\n        slowLink: isRemote ? this._onSlowLink.bind(this, user_id) : this._onSlowLink.bind(this, void 0),\n        localStream: this.localStream,\n        displayName: this.currentUserDisplayName,\n      });\n    });\n  }\n\n  _join(roomId, user_id) {\n    return new Promise((resolve, reject) => {\n      this._clientConf.join(roomId, user_id, false, {\n        success: resolve,\n        error: reject,\n        displayName: this.currentUserDisplayName,\n      });\n    });\n  }\n\n  _setOnParticipantJoinListener() {\n    this._clientConf.on(JANUS_EVENTS.PARTICIPANT_JOINED, this._onParticipantJoined.bind(this));\n  }\n\n  _setOnParticipantLeftListener() {\n    this._clientConf.on(JANUS_EVENTS.PARTICIPANT_LEFT, this._onParticipantLeft.bind(this));\n  }\n\n  _setOnRemoteStreamListener() {\n    this._clientConf.on(JANUS_EVENTS.REMOTE_STREAM, this._onRemoteStream.bind(this));\n  }\n\n  _setOnRemoteTracksUpdatedListener() {\n    this._clientConf.on(JANUS_EVENTS.REMOTE_TRACKS_UPDATED, this._onRemoteTracksUpdated.bind(this));\n  }\n\n  _setOnDataChannelOpenListener() {\n    this._clientConf.on(JANUS_EVENTS.DATA_CHANNEL_OPEN, this._onDataChannelOpen.bind(this));\n  }\n\n  _setOnDataChannelMessageListener() {\n    this._clientConf.on(JANUS_EVENTS.DATA_CHANNEL_MESSAGE, this._onDataChannelMessage.bind(this));\n  }\n\n  _setOnErrorListener() {\n    this._clientConf.on(JANUS_EVENTS.ERROR, this._onError.bind(this));\n  }\n\n  _onParticipantJoined(user_id, userDisplayName, isExistingParticipant) {\n    Utils.DLog('[_onParticipantJoined]', user_id, userDisplayName, isExistingParticipant);\n    this._createListener(user_id);\n    Utils.safeCallbackCall(this.onParticipantJoinedListener, this, user_id, userDisplayName, isExistingParticipant);\n  }\n\n  _onParticipantLeft(user_id, userDisplayName) {\n    Utils.DLog('[_onParticipantLeft]', user_id, userDisplayName);\n    Utils.safeCallbackCall(this.onParticipantLeftListener, this, user_id, userDisplayName);\n  }\n\n  _onError(error) {\n    Utils.DLog('[_onError]', error);\n    Utils.safeCallbackCall(this.onErrorListener, this, error);\n  }\n\n  _onDataChannelOpen(label) {\n    Utils.DLog('[_onDataChannelOpen]', label);\n    Utils.safeCallbackCall(this.onDataChannelOpenedListener, this, label);\n  }\n\n  _onDataChannelMessage(user_id, data) {\n    Utils.DLog('[_onDataChannelMessage]', user_id, data);\n    Utils.safeCallbackCall(this.onDataChannelMessageListener, this, user_id, data);\n  }\n\n  _onLocalIceStateChanged(iceState) {\n    Utils.DLog('[_onLocalIceStateChanged]', iceState);\n    Utils.safeCallbackCall(this.onSessionConnectionStateChangedListener, this, iceState);\n  }\n\n  _onRemoteIceStateChanged(user_id, iceState) {\n    Utils.DLog('[_onRemoteIceStateChanged]', user_id, iceState);\n    Utils.safeCallbackCall(this.onRemoteConnectionStateChangedListener, this, user_id, iceState);\n  }\n\n  _onRemoteStream(user_id, stream) {\n    Utils.DLog('[_onRemoteStream]', user_id, stream);\n    Utils.safeCallbackCall(this.onRemoteStreamListener, this, user_id, stream);\n  }\n\n  _onRemoteTracksUpdated(user_id, track, eventType) {\n    Utils.DLog('[_onRemoteTracksUpdated]', user_id, track, eventType);\n    Utils.safeCallbackCall(this.onRemoteTracksUpdatedListener, this, user_id, track, eventType);\n  }\n\n  _onSlowLink(user_id, uplink, nacks) {\n    Utils.DLog('[_onSlowLink]', user_id, uplink, nacks);\n    Utils.safeCallbackCall(this.onSlowLinkListener, this, user_id, uplink, nacks);\n  }\n\n  listOfOnlineParticipants() {\n    return new Promise((resolve, reject) => {\n      this._clientConf.listOnlineParticipants(this.currentRoomId, {\n        success: resolve,\n        error: reject,\n      });\n    });\n  }\n\n  async leave() {\n    await this._leaveGroup();\n    this.currentRoomId = undefined;\n    this.currentUserDisplayName = undefined;\n    await this._detachVideoConferencingPlugin();\n    await this._destroy();\n    if (this.localStream) {\n      this.localStream.getTracks().forEach((track) => track.stop());\n      this.localStream = undefined;\n    }\n  }\n\n  _leaveGroup() {\n    return new Promise((resolve, reject) => {\n      this._clientConf.leave({\n        success: resolve,\n        error: reject,\n      });\n    });\n  }\n\n  _destroy() {\n    return new Promise((resolve, reject) => {\n      this._clientConf.destroySession({\n        success: resolve,\n        error: reject,\n      });\n    });\n  }\n\n  _detachVideoConferencingPlugin() {\n    return new Promise((resolve, reject) => {\n      this._clientConf.detachVideoConferencingPlugin({\n        success: resolve,\n        error: reject,\n      });\n    });\n  }\n\n  getDisplayMedia(params) {\n    if (!mediaDevices.getDisplayMedia) {\n      throw new Error(\"Your environment does not support 'getDisplayMedia' API\");\n    }\n\n    const elementId = params && params.elementId;\n    const options = params && params.options;\n    const mediaParams = { ...params };\n\n    delete mediaParams.elementId;\n    delete mediaParams.options;\n\n    return mediaDevices\n      .getDisplayMedia(mediaParams)\n      .then((stream) => {\n        return this._upsertStream(stream, elementId, options);\n      })\n      .catch((error) => {\n        throw new Error(error);\n      });\n  }\n\n  getUserMedia(params) {\n    const elementId = params && params.elementId;\n    const options = params && params.options;\n    const mediaParams = { ...params };\n\n    delete mediaParams.elementId;\n    delete mediaParams.options;\n\n    return mediaDevices\n      .getUserMedia(mediaParams)\n      .then((stream) => {\n        return this._upsertStream(stream, elementId, options);\n      })\n      .catch((error) => {\n        throw new Error(error);\n      });\n  }\n\n  _upsertStream(stream, elementId, options) {\n    const shouldUpdateCurrentStream = !!this.localStream;\n\n    if (shouldUpdateCurrentStream) {\n      this.localStream.getTracks().forEach((track) => {\n        if (track.kind === CALL_TYPES.AUDIO && stream.getAudioTracks().length === 0) {\n          return;\n        } else {\n          track.stop();\n          this.localStream.removeTrack(track);\n        }\n      });\n\n      this._replaceTracks(stream);\n    } else {\n      this.localStream = stream;\n    }\n\n    if (elementId) {\n      if (shouldUpdateCurrentStream) {\n        this.detachMediaStream(elementId, options);\n      }\n\n      this.attachMediaStream(elementId, this.localStream, options);\n    }\n\n    return this.localStream;\n  }\n\n  _replaceTracks(stream) {\n    stream.getTracks().forEach((track) => {\n      const pcSenders = this.currentPublisherPC.getSenders();\n      const sender = pcSenders.find((sender) => track.kind === sender.track.kind);\n\n      if (track.kind === CALL_TYPES.AUDIO) {\n        track.enabled = this.localStream.getAudioTracks().every((track) => track.enabled);\n      } else {\n        track.enabled = this.localStream.getVideoTracks().every((track) => track.enabled);\n      }\n\n      if (sender) {\n        sender.replaceTrack(track);\n        this.localStream.addTrack(track);\n      } else {\n        console.warn(`No sender found for track kind: ${track.kind}`);\n      }\n    });\n  }\n\n  switchMediaTracks(constraints) {\n    if (constraints[CALL_TYPES.VIDEO]) {\n      return this._switchVideo(constraints[CALL_TYPES.VIDEO]);\n    } else if (constraints[CALL_TYPES.AUDIO]) {\n      return this._switchAudio(constraints[CALL_TYPES.AUDIO]);\n    }\n    return Promise.reject();\n  }\n\n  _switchVideo(mediaDeviceId) {\n    return this._switchMediaTracks({\n      audio: true,\n      video: { deviceId: mediaDeviceId },\n    });\n  }\n\n  _switchAudio(mediaDeviceId) {\n    return this._switchMediaTracks({\n      audio: { deviceId: mediaDeviceId },\n      video: true,\n    });\n  }\n\n  _switchMediaTracks(mediaParams) {\n    return this.getUserMedia(mediaParams, true).then((newLocalStream) => {\n      const newStreamTracks = newLocalStream.getTracks();\n      const pcSenders = this.currentPublisherPC.getSenders();\n      newStreamTracks.forEach((track) => {\n        const sender = pcSenders.find((sender) => track.kind === sender.track.kind);\n        sender.replaceTrack(track);\n      });\n      return this.localStream;\n    });\n  }\n\n  muteVideo() {\n    if (!this.isVideoMuted()) {\n      this._clientConf.toggleVideoMute();\n    }\n  }\n\n  unmuteVideo() {\n    if (this.isVideoMuted()) {\n      this._clientConf.toggleVideoMute();\n    }\n  }\n\n  muteAudio() {\n    if (!this.isAudioMuted()) {\n      this._clientConf.toggleAudioMute();\n    }\n  }\n\n  unmuteAudio() {\n    if (this.isAudioMuted()) {\n      this._clientConf.toggleAudioMute();\n    }\n  }\n\n  isVideoMuted() {\n    return this._clientConf.isVideoMuted();\n  }\n\n  isAudioMuted() {\n    return this._clientConf.isAudioMuted();\n  }\n\n  getUserVolume() {\n    return new Promise((resolve, reject) => {\n      return this._clientConf.getVolume(resolve);\n    });\n  }\n\n  getRemoteUserBitrate(userId) {\n    return this._clientConf.getUserBitrate(userId);\n  }\n\n  getRemoteUserVolume(userId) {\n    return new Promise((resolve, reject) => {\n      return this._clientConf.getUserVolume(userId, resolve);\n    });\n  }\n\n  attachMediaStream(id, stream, options) {\n    const elem = document.getElementById(id);\n\n    if (elem) {\n      if (typeof elem.srcObject === 'object') {\n        elem.srcObject = stream;\n      } else {\n        elem.src = window.URL.createObjectURL(stream);\n      }\n\n      if (options && options.muted) {\n        elem.muted = true;\n      }\n\n      if (options && options.mirror) {\n        elem.style.webkitTransform = 'scaleX(-1)';\n        elem.style.transform = 'scaleX(-1)';\n      }\n\n      elem.onloadedmetadata = function (e) {\n        elem.play();\n      };\n    } else {\n      throw new Error('Unable to attach media stream, element ' + id + ' is undefined');\n    }\n  }\n\n  detachMediaStream(id, options) {\n    const elem = document.getElementById(id);\n\n    if (elem) {\n      elem.pause();\n\n      if (typeof elem.srcObject === 'object') {\n        elem.srcObject = null;\n      } else {\n        elem.src = '';\n      }\n\n      if (options && !options.mirror) {\n        elem.style.webkitTransform = '';\n        elem.style.transform = '';\n      }\n    } else {\n      throw new Error('Unable to attach media stream, element ' + id + ' is undefined');\n    }\n  }\n\n  async sendData(data, channelLabel) {\n    const sendParams = { data, label: channelLabel };\n    return new Promise((resolve, reject) => {\n      const pluginParams = { success: resolve, error: reject };\n      Object.assign(pluginParams, sendParams);\n\n      this._clientConf.videoRoomPlugin.data(pluginParams);\n    });\n  }\n}\n\nmodule.exports = ConferenceSession;\n","const {\n  adapter,\n  navigator,\n  MediaStream,\n  MediaStreamTrack,\n  RTCPeerConnection,\n  RTCRtpReceiver,\n  RTCRtpSender,\n} = require('../cubeDependencies');\nconst Utils = require('../cubeInternalUtils');\n\n('use strict');\n/*\n  The MIT License (MIT)\n\n  Copyright (c) 2016 Meetecho\n\n  Permission is hereby granted, free of charge, to any person obtaining\n  a copy of this software and associated documentation files (the \"Software\"),\n  to deal in the Software without restriction, including without limitation\n  the rights to use, copy, modify, merge, publish, distribute, sublicense,\n  and/or sell copies of the Software, and to permit persons to whom the\n  Software is furnished to do so, subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be included\n  in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR\n  OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n  ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n  OTHER DEALINGS IN THE SOFTWARE.\n */\n\n// List of sessions\nJanus.sessions = {};\n\nJanus.mobile = Utils.getEnv().reactnative;\n\nJanus.isExtensionEnabled = function () {\n  if (Janus.mobile) {\n    return false;\n  }\n  if (navigator.mediaDevices && navigator.mediaDevices.getDisplayMedia) {\n    // No need for the extension, getDisplayMedia is supported\n    return true;\n  }\n  if (window.navigator.userAgent.match('Chrome')) {\n    let chromever = parseInt(window.navigator.userAgent.match(/Chrome\\/(.*) /)[1], 10);\n    let maxver = 33;\n    if (window.navigator.userAgent.match('Linux')) maxver = 35; // \"known\" crash in chrome 34 and 35 on linux\n    if (chromever >= 26 && chromever <= maxver) {\n      // Older versions of Chrome don't support this extension-based approach, so lie\n      return true;\n    }\n    return Janus.extension.isInstalled();\n  } else {\n    // Firefox and others, no need for the extension (but this doesn't mean it will work)\n    return true;\n  }\n};\n\nconst defaultExtension = {\n  // Screensharing Chrome Extension ID\n  extensionId: 'hapfgfdkleiggjjpfpenajgdnfckjpaj',\n  isInstalled: function () {\n    if (Janus.mobile) {\n      return false;\n    } else {\n      return document.querySelector('#janus-extension-installed') !== null;\n    }\n  },\n  getScreen: function (callback) {\n    if (Janus.mobile) {\n      callback();\n    } else {\n      let pending = window.setTimeout(function () {\n        let error = new Error('NavigatorUserMediaError');\n        error.name =\n          'The required Chrome extension is not installed: click <a href=\"#\">here</a> to install it. (NOTE: this will need you to refresh the page)';\n        return callback(error);\n      }, 1000);\n      this.cache[pending] = callback;\n      window.postMessage({ type: 'janusGetScreen', id: pending }, '*');\n    }\n  },\n  init: function () {\n    let cache = {};\n    this.cache = cache;\n    // Wait for events from the Chrome Extension\n    if (!Janus.mobile) {\n      window.addEventListener('message', function (event) {\n        if (event.origin != window.location.origin) return;\n        if (event.data.type == 'janusGotScreen' && cache[event.data.id]) {\n          let callback = cache[event.data.id];\n          delete cache[event.data.id];\n          if (event.data.sourceId === '') {\n            // user canceled\n            let error = new Error('NavigatorUserMediaError');\n            error.name = 'You cancelled the request for permission, giving up...';\n            callback(error);\n          } else {\n            callback(null, event.data.sourceId);\n          }\n        } else if (event.data.type == 'janusGetScreenPending') {\n          window.clearTimeout(event.data.id);\n        }\n      });\n    }\n  },\n};\n\nJanus.useDefaultDependencies = function (deps) {\n  let f = (deps && deps.fetch) || fetch;\n  let p = (deps && deps.Promise) || Promise;\n  let socketCls = (deps && deps.WebSocket) || WebSocket;\n\n  return {\n    newWebSocket: function (server, proto) {\n      return new socketCls(server, proto);\n    },\n    extension: (deps && deps.extension) || defaultExtension,\n    isArray: function (arr) {\n      return Array.isArray(arr);\n    },\n    webRTCAdapter: (deps && deps.adapter) || adapter,\n    httpAPICall: function (url, options) {\n      let fetchOptions = {\n        method: options.verb,\n        headers: {\n          Accept: 'application/json, text/plain, */*',\n        },\n        cache: 'no-cache',\n      };\n      if (options.verb === 'POST') {\n        fetchOptions.headers['Content-Type'] = 'application/json';\n      }\n      if (typeof options.withCredentials !== 'undefined') {\n        fetchOptions.credentials =\n          options.withCredentials === true ? 'include' : options.withCredentials ? options.withCredentials : 'omit';\n      }\n      if (options.body) {\n        fetchOptions.body = JSON.stringify(options.body);\n      }\n\n      let fetching = f(url, fetchOptions).catch(function (error) {\n        return p.reject({\n          message: 'Probably a network error, is the server down?',\n          error: error,\n        });\n      });\n\n      /*\n       * fetch() does not natively support timeouts.\n       * Work around this by starting a timeout manually, and racing it agains the fetch() to see which thing resolves first.\n       */\n\n      if (options.timeout) {\n        let timeout = new p(function (resolve, reject) {\n          let timerId = setTimeout(function () {\n            clearTimeout(timerId);\n            return reject({\n              message: 'Request timed out',\n              timeout: options.timeout,\n            });\n          }, options.timeout);\n        });\n        fetching = p.race([fetching, timeout]);\n      }\n\n      fetching\n        .then(function (response) {\n          if (response.ok) {\n            if (typeof options.success === typeof Janus.noop) {\n              return response.json().then(\n                function (parsed) {\n                  try {\n                    options.success(parsed);\n                  } catch (error) {\n                    Janus.error('Unhandled httpAPICall success callback error', error);\n                  }\n                },\n                function (error) {\n                  return p.reject({\n                    message: 'Failed to parse response body',\n                    error: error,\n                    response: response,\n                  });\n                }\n              );\n            }\n          } else {\n            return p.reject({ message: 'API call failed', response: response });\n          }\n        })\n        .catch(function (error) {\n          if (typeof options.error === typeof Janus.noop) {\n            options.error(error.message || '<< internal error >>', error);\n          }\n        });\n\n      return fetching;\n    },\n  };\n};\n\nJanus.useOldDependencies = function (deps) {\n  let jq = (deps && deps.jQuery) || jQuery;\n  let socketCls = (deps && deps.WebSocket) || WebSocket;\n  return {\n    newWebSocket: function (server, proto) {\n      return new socketCls(server, proto);\n    },\n    isArray: function (arr) {\n      return jq.isArray(arr);\n    },\n    extension: (deps && deps.extension) || defaultExtension,\n    webRTCAdapter: (deps && deps.adapter) || adapter,\n    httpAPICall: function (url, options) {\n      let payload =\n        typeof options.body !== 'undefined'\n          ? {\n            contentType: 'application/json',\n            data: JSON.stringify(options.body),\n          }\n          : {};\n      let credentials =\n        typeof options.withCredentials !== 'undefined'\n          ? { xhrFields: { withCredentials: options.withCredentials } }\n          : {};\n\n      return jq.ajax(\n        jq.extend(payload, credentials, {\n          url: url,\n          type: options.verb,\n          cache: false,\n          dataType: 'json',\n          async: options.async,\n          timeout: options.timeout,\n          success: function (result) {\n            if (typeof options.success === typeof Janus.noop) {\n              options.success(result);\n            }\n          },\n          error: function (xhr, status, err) {\n            if (typeof options.error === typeof Janus.noop) {\n              options.error(status, err);\n            }\n          },\n        })\n      );\n    },\n  };\n};\n\n// Helper function to convert a deprecated media object to a tracks array\nJanus.mediaToTracks = function (media) {\n  let tracks = [];\n  if (!media) {\n    // Default is bidirectional audio and video, using default devices\n    tracks.push({ type: 'audio', capture: true, recv: true });\n    tracks.push({ type: 'video', capture: true, recv: true });\n  } else {\n    if (\n      !media.keepAudio &&\n      media.audio !== false &&\n      (typeof media.audio === 'undefined' ||\n        media.audio ||\n        media.audioSend ||\n        media.audioRecv ||\n        media.addAudio ||\n        media.replaceAudio ||\n        media.removeAudio)\n    ) {\n      // We may need an audio track\n      let track = { type: 'audio' };\n      if (media.removeAudio) {\n        track.remove = true;\n      } else {\n        if (media.addAudio) track.add = true;\n        else if (media.replaceAudio) track.replace = true;\n        // Check if we need to capture an audio device\n        if (media.audioSend !== false) track.capture = media.audio || true;\n        // Check if we need to receive audio\n        if (media.audioRecv !== false) track.recv = true;\n      }\n      // Add an audio track if needed\n      if (track.remove || track.capture || track.recv) tracks.push(track);\n    }\n    if (\n      !media.keepVideo &&\n      media.video !== false &&\n      (typeof media.video === 'undefined' ||\n        media.video ||\n        media.videoSend ||\n        media.videoRecv ||\n        media.addVideo ||\n        media.replaceVideo ||\n        media.removeVideo)\n    ) {\n      // We may need a video track\n      let track = { type: 'video' };\n      if (media.removeVideo) {\n        track.remove = true;\n      } else {\n        if (media.addVideo) track.add = true;\n        else if (media.replaceVideo) track.replace = true;\n        // Check if we need to capture a video device\n        if (media.videoSend !== false) {\n          track.capture = media.video || true;\n          if (['screen', 'window', 'desktop'].includes(track.capture)) {\n            // Change the type to 'screen'\n            track.type = 'screen';\n            track.capture = { video: {} };\n            // Check if there's constraints\n            if (media.screenshareFrameRate) track.capture.frameRate = media.screenshareFrameRate;\n            if (media.screenshareHeight) track.capture.height = media.screenshareHeight;\n            if (media.screenshareWidth) track.capture.width = media.screenshareWidth;\n          }\n        }\n        // Check if we need to receive video\n        if (media.videoRecv !== false) track.recv = true;\n      }\n      // Add a video track if needed\n      if (track.remove || track.capture || track.recv) tracks.push(track);\n    }\n    if (media.data) {\n      // We need a data channel\n      tracks.push({ type: 'data' });\n    }\n  }\n  // Done\n  return tracks;\n};\n\n// Helper function to convert a track object to a set of constraints\nJanus.trackConstraints = function (track) {\n  let constraints = {};\n  if (!track || !track.capture) return constraints;\n  if (track.type === 'audio') {\n    // Just put the capture part in the constraints\n    constraints.audio = track.capture;\n  } else if (track.type === 'video') {\n    // Check if one of the keywords was passed\n    if ((track.simulcast || track.svc) && track.capture === true) track.capture = 'hires';\n    if (track.capture === true || typeof track.capture === 'object') {\n      // Use the provided capture object as video constraint\n      constraints.video = track.capture;\n    } else {\n      let width = 0;\n      let height = 0;\n      if (track.capture === 'lowres') {\n        // Small resolution, 4:3\n        width = 320;\n        height = 240;\n      } else if (track.capture === 'lowres-16:9') {\n        // Small resolution, 16:9\n        width = 320;\n        height = 180;\n      } else if (track.capture === 'hires' || track.capture === 'hires-16:9' || track.capture === 'hdres') {\n        // High(HD) resolution is only 16:9\n        width = 1280;\n        height = 720;\n      } else if (track.capture === 'fhdres') {\n        // Full HD resolution is only 16:9\n        width = 1920;\n        height = 1080;\n      } else if (track.capture === '4kres') {\n        // 4K resolution is only 16:9\n        width = 3840;\n        height = 2160;\n      } else if (track.capture === 'stdres') {\n        // Normal resolution, 4:3\n        width = 640;\n        height = 480;\n      } else if (track.capture === 'stdres-16:9') {\n        // Normal resolution, 16:9\n        width = 640;\n        height = 360;\n      } else {\n        Janus.log('Default video setting is stdres 4:3');\n        width = 640;\n        height = 480;\n      }\n      constraints.video = {\n        width: { ideal: width },\n        height: { ideal: height },\n      };\n    }\n  } else if (track.type === 'screen') {\n    // Use the provided capture object as video constraint\n    constraints.video = track.capture;\n  }\n  return constraints;\n};\n\nJanus.noop = function () { };\n\nJanus.dataChanDefaultLabel = 'JanusDataChannel';\n\n// Note: in the future we may want to change this, e.g., as was\n// attempted in https://github.com/meetecho/janus-gateway/issues/1670\nJanus.endOfCandidates = null;\n\n// Stop all tracks from a given stream\nJanus.stopAllTracks = function (stream) {\n  try {\n    // Try a MediaStreamTrack.stop() for each track\n    let tracks = stream.getTracks();\n    for (let mst of tracks) {\n      Janus.log(mst);\n      if (mst && mst.dontStop !== true) {\n        mst.stop();\n      }\n    }\n  } catch (e) {\n    // Do nothing if this fails\n  }\n};\n\n// Initialization\nJanus.init = function (options) {\n  options = options || {};\n  options.callback = typeof options.callback == 'function' ? options.callback : Janus.noop;\n  if (Janus.initDone) {\n    // Already initialized\n    options.callback();\n  } else {\n    if (typeof console.log == 'undefined') {\n      console.log = function () { };\n    }\n    // Console logging (all debugging disabled by default)\n    Janus.trace = Janus.noop;\n    Janus.debug = Janus.noop;\n    Janus.vdebug = Janus.noop;\n    Janus.log = Janus.noop;\n    Janus.warn = Janus.noop;\n    Janus.error = Janus.noop;\n    if (options.debug === true || options.debug === 'all') {\n      // Enable all debugging levels\n      Janus.trace = console.trace.bind(console);\n      Janus.debug = console.debug.bind(console);\n      Janus.vdebug = console.debug.bind(console);\n      Janus.log = console.log.bind(console);\n      Janus.warn = console.warn.bind(console);\n      Janus.error = console.error.bind(console);\n    } else if (Array.isArray(options.debug)) {\n      for (let d of options.debug) {\n        switch (d) {\n          case 'trace':\n            Janus.trace = console.trace.bind(console);\n            break;\n          case 'debug':\n            Janus.debug = console.debug.bind(console);\n            break;\n          case 'vdebug':\n            Janus.vdebug = console.debug.bind(console);\n            break;\n          case 'log':\n            Janus.log = console.log.bind(console);\n            break;\n          case 'warn':\n            Janus.warn = console.warn.bind(console);\n            break;\n          case 'error':\n            Janus.error = console.error.bind(console);\n            break;\n          default:\n            console.error(\n              \"Unknown debugging option '\" + d + \"' (supported: 'trace', 'debug', 'vdebug', 'log', warn', 'error')\"\n            );\n            break;\n        }\n      }\n    }\n    Janus.log('Initializing library');\n\n    let usedDependencies = options.dependencies || Janus.useDefaultDependencies();\n    Janus.isArray = usedDependencies.isArray;\n    Janus.webRTCAdapter = usedDependencies.webRTCAdapter;\n    Janus.httpAPICall = usedDependencies.httpAPICall;\n    Janus.newWebSocket = usedDependencies.newWebSocket;\n    Janus.extension = usedDependencies.extension;\n    Janus.extension.init();\n\n    // Helper method to enumerate devices\n    Janus.listDevices = function (callback, config) {\n      callback = typeof callback == 'function' ? callback : Janus.noop;\n      if (!config) config = { audio: true, video: true };\n      if (Janus.isGetUserMediaAvailable()) {\n        navigator.mediaDevices\n          .getUserMedia(config)\n          .then(function (stream) {\n            navigator.mediaDevices.enumerateDevices().then(function (devices) {\n              Janus.debug(devices);\n              callback(devices);\n              // Get rid of the now useless stream\n              Janus.stopAllTracks(stream);\n            });\n          })\n          .catch(function (err) {\n            Janus.error(err);\n            callback([]);\n          });\n      } else {\n        Janus.warn('navigator.mediaDevices unavailable');\n        callback([]);\n      }\n    };\n    // Helper methods to attach/reattach a stream to a video element (previously part of adapter.js)\n    // Janus.attachMediaStream = function(element, stream) {\n    // \ttry {\n    // \t\telement.srcObject = stream;\n    // \t} catch (e) {\n    // \t\ttry {\n    // \t\t\telement.src = URL.createObjectURL(stream);\n    // \t\t} catch (e) {\n    // \t\t\tJanus.error(\"Error attaching stream to element\", e);\n    // \t\t}\n    // \t}\n    // };\n    // Janus.reattachMediaStream = function(to, from) {\n    // \ttry {\n    // \t\tto.srcObject = from.srcObject;\n    // \t} catch (e) {\n    // \t\ttry {\n    // \t\t\tto.src = from.src;\n    // \t\t} catch (e) {\n    // \t\t\tJanus.error(\"Error reattaching stream to element\", e);\n    // \t\t}\n    // \t}\n    // };\n    // Detect tab close: make sure we don't loose existing onbeforeunload handlers\n    // (note: for iOS we need to subscribe to a different event, 'pagehide', see\n    // https://gist.github.com/thehunmonkgroup/6bee8941a49b86be31a787fe8f4b8cfe)\n    // let iOS = ['iPad', 'iPhone', 'iPod'].indexOf(navigator.platform) >= 0;\n    // let eventName = iOS ? 'pagehide' : 'beforeunload';\n    // let oldOBF = window[\"on\" + eventName];\n    // window.addEventListener(eventName, function() {\n    // \tJanus.log(\"Closing window\");\n    // \tfor(let s in Janus.sessions) {\n    // \t\tif(Janus.sessions[s] && Janus.sessions[s].destroyOnUnload) {\n    // \t\t\tJanus.log(\"Destroying session \" + s);\n    // \t\t\tJanus.sessions[s].destroy({unload: true, notifyDestroyed: false});\n    // \t\t}\n    // \t}\n    // \tif(oldOBF && typeof oldOBF == \"function\") {\n    // \t\toldOBF();\n    // \t}\n    // });\n    // If this is a Safari Technology Preview, check if VP8 is supported\n    Janus.safariVp8 = false;\n    if (Janus.webRTCAdapter.browserDetails.browser === 'safari' && Janus.webRTCAdapter.browserDetails.version >= 605) {\n      // Let's see if RTCRtpSender.getCapabilities() is there\n      if (\n        RTCRtpSender &&\n        RTCRtpSender.getCapabilities &&\n        RTCRtpSender.getCapabilities('video') &&\n        RTCRtpSender.getCapabilities('video').codecs &&\n        RTCRtpSender.getCapabilities('video').codecs.length\n      ) {\n        for (let codec of RTCRtpSender.getCapabilities('video').codecs) {\n          if (codec && codec.mimeType && codec.mimeType.toLowerCase() === 'video/vp8') {\n            Janus.safariVp8 = true;\n            break;\n          }\n        }\n        if (Janus.safariVp8) {\n          Janus.log('This version of Safari supports VP8');\n        } else {\n          Janus.warn(\n            \"This version of Safari does NOT support VP8: if you're using a Technology Preview, \" +\n            \"try enabling the 'WebRTC VP8 codec' setting in the 'Experimental Features' Develop menu\"\n          );\n        }\n      } else {\n        // We do it in a very ugly way, as there's no alternative...\n        // We create a PeerConnection to see if VP8 is in an offer\n        let testpc = new RTCPeerConnection({});\n        testpc.createOffer({ offerToReceiveVideo: true }).then(function (offer) {\n          Janus.safariVp8 = offer.sdp.indexOf('VP8') !== -1;\n          if (Janus.safariVp8) {\n            Janus.log('This version of Safari supports VP8');\n          } else {\n            Janus.warn(\n              \"This version of Safari does NOT support VP8: if you're using a Technology Preview, \" +\n              \"try enabling the 'WebRTC VP8 codec' setting in the 'Experimental Features' Develop menu\"\n            );\n          }\n          testpc.close();\n          testpc = null;\n        });\n      }\n    }\n    Janus.initDone = true;\n    options.callback();\n  }\n};\n\n// Helper method to check whether WebRTC is supported by this browser\nJanus.isWebrtcSupported = function () {\n  return !!RTCPeerConnection;\n};\n// Helper method to check whether devices can be accessed by this browser (e.g., not possible via plain HTTP)\nJanus.isGetUserMediaAvailable = function () {\n  return navigator.mediaDevices && navigator.mediaDevices.getUserMedia;\n};\n\n// Helper method to create random identifiers (e.g., transaction)\nJanus.randomString = function (len) {\n  let charSet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n  let randomString = '';\n  for (let i = 0; i < len; i++) {\n    let randomPoz = Math.floor(Math.random() * charSet.length);\n    randomString += charSet.charAt(randomPoz);\n  }\n  return randomString;\n};\n\nfunction Janus(gatewayCallbacks) {\n  gatewayCallbacks = gatewayCallbacks || {};\n  gatewayCallbacks.success = typeof gatewayCallbacks.success == 'function' ? gatewayCallbacks.success : Janus.noop;\n  gatewayCallbacks.error = typeof gatewayCallbacks.error == 'function' ? gatewayCallbacks.error : Janus.noop;\n  gatewayCallbacks.destroyed =\n    typeof gatewayCallbacks.destroyed == 'function' ? gatewayCallbacks.destroyed : Janus.noop;\n  if (!Janus.initDone) {\n    gatewayCallbacks.error('Library not initialized');\n    return {};\n  }\n  if (!Janus.isWebrtcSupported()) {\n    gatewayCallbacks.error('WebRTC not supported by this browser');\n    return {};\n  }\n  Janus.log('Library initialized: ' + Janus.initDone);\n  if (!gatewayCallbacks.server) {\n    gatewayCallbacks.error('Invalid server url');\n    return {};\n  }\n  let websockets = false;\n  let ws = null;\n  let wsHandlers = {};\n  let wsKeepaliveTimeoutId = null;\n  let servers = null;\n  let serversIndex = 0;\n  let server = gatewayCallbacks.server;\n  if (Janus.isArray(server)) {\n    Janus.log('Multiple servers provided (' + server.length + '), will use the first that works');\n    server = null;\n    servers = gatewayCallbacks.server;\n    Janus.debug(servers);\n  } else {\n    if (server.indexOf('ws') === 0) {\n      websockets = true;\n      Janus.log('Using WebSockets to contact Janus: ' + server);\n    } else {\n      websockets = false;\n      Janus.log('Using REST API to contact Janus: ' + server);\n    }\n  }\n  let iceServers = gatewayCallbacks.iceServers || [{ urls: 'stun:stun.l.google.com:19302' }];\n  let iceTransportPolicy = gatewayCallbacks.iceTransportPolicy;\n  let bundlePolicy = gatewayCallbacks.bundlePolicy;\n  // Whether we should enable the withCredentials flag for XHR requests\n  let withCredentials = false;\n  if (typeof gatewayCallbacks.withCredentials !== 'undefined' && gatewayCallbacks.withCredentials !== null)\n    withCredentials = gatewayCallbacks.withCredentials === true;\n  // Optional max events\n  let maxev = 10;\n  if (typeof gatewayCallbacks.max_poll_events !== 'undefined' && gatewayCallbacks.max_poll_events !== null)\n    maxev = gatewayCallbacks.max_poll_events;\n  if (maxev < 1) maxev = 1;\n  // Token to use (only if the token based authentication mechanism is enabled)\n  let token = null;\n  if (typeof gatewayCallbacks.token !== 'undefined' && gatewayCallbacks.token !== null) token = gatewayCallbacks.token;\n  // API secret to use (only if the shared API secret is enabled)\n  let apisecret = null;\n  if (typeof gatewayCallbacks.apisecret !== 'undefined' && gatewayCallbacks.apisecret !== null)\n    apisecret = gatewayCallbacks.apisecret;\n  // Whether we should destroy this session when onbeforeunload is called\n  this.destroyOnUnload = true;\n  if (typeof gatewayCallbacks.destroyOnUnload !== 'undefined' && gatewayCallbacks.destroyOnUnload !== null)\n    this.destroyOnUnload = gatewayCallbacks.destroyOnUnload === true;\n  // Some timeout-related values\n  let keepAlivePeriod = 25000;\n  if (typeof gatewayCallbacks.keepAlivePeriod !== 'undefined' && gatewayCallbacks.keepAlivePeriod !== null)\n    keepAlivePeriod = gatewayCallbacks.keepAlivePeriod;\n  if (isNaN(keepAlivePeriod)) keepAlivePeriod = 25000;\n  let longPollTimeout = 60000;\n  if (typeof gatewayCallbacks.longPollTimeout !== 'undefined' && gatewayCallbacks.longPollTimeout !== null)\n    longPollTimeout = gatewayCallbacks.longPollTimeout;\n  if (isNaN(longPollTimeout)) longPollTimeout = 60000;\n\n  // overrides for default maxBitrate values for simulcasting\n  function getMaxBitrates(simulcastMaxBitrates) {\n    let maxBitrates = {\n      high: 900000,\n      medium: 300000,\n      low: 100000,\n    };\n\n    if (typeof simulcastMaxBitrates !== 'undefined' && simulcastMaxBitrates !== null) {\n      if (simulcastMaxBitrates.high) maxBitrates.high = simulcastMaxBitrates.high;\n      if (simulcastMaxBitrates.medium) maxBitrates.medium = simulcastMaxBitrates.medium;\n      if (simulcastMaxBitrates.low) maxBitrates.low = simulcastMaxBitrates.low;\n    }\n\n    return maxBitrates;\n  }\n\n  let connected = false;\n  let sessionId = null;\n  let pluginHandles = {};\n  let that = this;\n  let retries = 0;\n  let transactions = {};\n  createSession(gatewayCallbacks);\n\n  // Public methods\n  this.getServer = function () {\n    return server;\n  };\n  this.isConnected = function () {\n    return connected;\n  };\n  this.reconnect = function (callbacks) {\n    callbacks = callbacks || {};\n    callbacks.success = typeof callbacks.success == 'function' ? callbacks.success : Janus.noop;\n    callbacks.error = typeof callbacks.error == 'function' ? callbacks.error : Janus.noop;\n    callbacks['reconnect'] = true;\n    createSession(callbacks);\n  };\n  this.getSessionId = function () {\n    return sessionId;\n  };\n  this.getInfo = function (callbacks) {\n    getInfo(callbacks);\n  };\n  this.destroy = function (callbacks) {\n    destroySession(callbacks);\n  };\n  this.attach = function (callbacks) {\n    createHandle(callbacks);\n  };\n\n  function eventHandler() {\n    if (sessionId == null) return;\n    Janus.debug('Long poll...');\n    if (!connected) {\n      Janus.warn('Is the server down? (connected=false)');\n      return;\n    }\n    let longpoll = server + '/' + sessionId + '?rid=' + new Date().getTime();\n    if (maxev) longpoll = longpoll + '&maxev=' + maxev;\n    if (token) longpoll = longpoll + '&token=' + encodeURIComponent(token);\n    if (apisecret) longpoll = longpoll + '&apisecret=' + encodeURIComponent(apisecret);\n    Janus.httpAPICall(longpoll, {\n      verb: 'GET',\n      withCredentials: withCredentials,\n      success: handleEvent,\n      timeout: longPollTimeout,\n      error: function (textStatus, errorThrown) {\n        Janus.error(textStatus + ':', errorThrown);\n        retries++;\n        if (retries > 3) {\n          // Did we just lose the server? :-(\n          connected = false;\n          gatewayCallbacks.error('Lost connection to the server (is it down?)');\n          return;\n        }\n        eventHandler();\n      },\n    });\n  }\n\n  // Private event handler: this will trigger plugin callbacks, if set\n  function handleEvent(json, skipTimeout) {\n    retries = 0;\n    if (!websockets && typeof sessionId !== 'undefined' && sessionId !== null && skipTimeout !== true) eventHandler();\n    if (!websockets && Janus.isArray(json)) {\n      // We got an array: it means we passed a maxev > 1, iterate on all objects\n      for (let i = 0; i < json.length; i++) {\n        handleEvent(json[i], true);\n      }\n      return;\n    }\n    if (json['janus'] === 'keepalive') {\n      // Nothing happened\n      Janus.vdebug('Got a keepalive on session ' + sessionId);\n      return;\n    } else if (json['janus'] === 'server_info') {\n      // Just info on the Janus instance\n      Janus.debug('Got info on the Janus instance');\n      Janus.debug(json);\n      const transaction = json['transaction'];\n      if (transaction) {\n        const reportSuccess = transactions[transaction];\n        if (reportSuccess) reportSuccess(json);\n        delete transactions[transaction];\n      }\n      return;\n    } else if (json['janus'] === 'ack') {\n      // Just an ack, we can probably ignore\n      Janus.debug('Got an ack on session ' + sessionId);\n      Janus.debug(json);\n      const transaction = json['transaction'];\n      if (transaction) {\n        const reportSuccess = transactions[transaction];\n        if (reportSuccess) reportSuccess(json);\n        delete transactions[transaction];\n      }\n      return;\n    } else if (json['janus'] === 'success') {\n      // Success!\n      Janus.debug('Got a success on session ' + sessionId);\n      Janus.debug(json);\n      const transaction = json['transaction'];\n      if (transaction) {\n        const reportSuccess = transactions[transaction];\n        if (reportSuccess) reportSuccess(json);\n        delete transactions[transaction];\n      }\n      return;\n    } else if (json['janus'] === 'trickle') {\n      // We got a trickle candidate from Janus\n      const sender = json['sender'];\n      if (!sender) {\n        Janus.warn('Missing sender...');\n        return;\n      }\n      const pluginHandle = pluginHandles[sender];\n      if (!pluginHandle) {\n        Janus.debug('This handle is not attached to this session');\n        return;\n      }\n      let candidate = json['candidate'];\n      Janus.debug('Got a trickled candidate on session ' + sessionId);\n      Janus.debug(candidate);\n      let config = pluginHandle.webrtcStuff;\n      if (config.pc && config.remoteSdp) {\n        // Add candidate right now\n        Janus.debug('Adding remote candidate:', candidate);\n        if (!candidate || candidate.completed === true) {\n          // end-of-candidates\n          config.pc.addIceCandidate(Janus.endOfCandidates);\n        } else {\n          // New candidate\n          config.pc.addIceCandidate(candidate);\n        }\n      } else {\n        // We didn't do setRemoteDescription (trickle got here before the offer?)\n        Janus.debug(\"We didn't do setRemoteDescription (trickle got here before the offer?), caching candidate\");\n        if (!config.candidates) config.candidates = [];\n        config.candidates.push(candidate);\n        Janus.debug(config.candidates);\n      }\n    } else if (json['janus'] === 'webrtcup') {\n      // The PeerConnection with the server is up! Notify this\n      Janus.debug('Got a webrtcup event on session ' + sessionId);\n      Janus.debug(json);\n      const sender = json['sender'];\n      if (!sender) {\n        Janus.warn('Missing sender...');\n        return;\n      }\n      const pluginHandle = pluginHandles[sender];\n      if (!pluginHandle) {\n        Janus.debug('This handle is not attached to this session');\n        return;\n      }\n      pluginHandle.webrtcState(true);\n      return;\n    } else if (json['janus'] === 'hangup') {\n      // A plugin asked the core to hangup a PeerConnection on one of our handles\n      Janus.debug('Got a hangup event on session ' + sessionId);\n      Janus.debug(json);\n      const sender = json['sender'];\n      if (!sender) {\n        Janus.warn('Missing sender...');\n        return;\n      }\n      const pluginHandle = pluginHandles[sender];\n      if (!pluginHandle) {\n        Janus.debug('This handle is not attached to this session');\n        return;\n      }\n      pluginHandle.webrtcState(false, json['reason']);\n      pluginHandle.hangup();\n    } else if (json['janus'] === 'detached') {\n      // A plugin asked the core to detach one of our handles\n      Janus.debug('Got a detached event on session ' + sessionId);\n      Janus.debug(json);\n      const sender = json['sender'];\n      if (!sender) {\n        Janus.warn('Missing sender...');\n        return;\n      }\n      const pluginHandle = pluginHandles[sender];\n      if (!pluginHandle) {\n        // Don't warn here because destroyHandle causes this situation.\n        return;\n      }\n      pluginHandle.ondetached();\n      pluginHandle.detach();\n    } else if (json['janus'] === 'media') {\n      // Media started/stopped flowing\n      Janus.debug('Got a media event on session ' + sessionId);\n      Janus.debug(json);\n      const sender = json['sender'];\n      if (!sender) {\n        Janus.warn('Missing sender...');\n        return;\n      }\n      const pluginHandle = pluginHandles[sender];\n      if (!pluginHandle) {\n        Janus.debug('This handle is not attached to this session');\n        return;\n      }\n      pluginHandle.mediaState(json['type'], json['receiving'], json['mid']);\n    } else if (json['janus'] === 'slowlink') {\n      Janus.debug('Got a slowlink event on session ' + sessionId);\n      Janus.debug(json);\n      // Trouble uplink or downlink\n      const sender = json['sender'];\n      if (!sender) {\n        Janus.warn('Missing sender...');\n        return;\n      }\n      const pluginHandle = pluginHandles[sender];\n      if (!pluginHandle) {\n        Janus.debug('This handle is not attached to this session');\n        return;\n      }\n      pluginHandle.slowLink(json['uplink'], json['lost'], json['mid']);\n    } else if (json['janus'] === 'error') {\n      // Oops, something wrong happened\n      Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason); // FIXME\n      Janus.debug(json);\n      let transaction = json['transaction'];\n      if (transaction) {\n        let reportSuccess = transactions[transaction];\n        if (reportSuccess) {\n          reportSuccess(json);\n        }\n        delete transactions[transaction];\n      }\n      return;\n    } else if (json['janus'] === 'event') {\n      Janus.debug('Got a plugin event on session ' + sessionId);\n      Janus.debug(json);\n      const sender = json['sender'];\n      if (!sender) {\n        Janus.warn('Missing sender...');\n        return;\n      }\n      let plugindata = json['plugindata'];\n      if (!plugindata) {\n        Janus.warn('Missing plugindata...');\n        return;\n      }\n      Janus.debug('  -- Event is coming from ' + sender + ' (' + plugindata['plugin'] + ')');\n      let data = plugindata['data'];\n      Janus.debug(data);\n      const pluginHandle = pluginHandles[sender];\n      if (!pluginHandle) {\n        Janus.warn('This handle is not attached to this session');\n        return;\n      }\n      let jsep = json['jsep'];\n      if (jsep) {\n        Janus.debug('Handling SDP as well...');\n        Janus.debug(jsep);\n      }\n      let callback = pluginHandle.onmessage;\n      if (callback) {\n        Janus.debug('Notifying application...');\n        // Send to callback specified when attaching plugin handle\n        callback(data, jsep);\n      } else {\n        // Send to generic callback (?)\n        Janus.debug('No provided notification callback');\n      }\n    } else if (json['janus'] === 'timeout') {\n      Janus.error('Timeout on session ' + sessionId);\n      Janus.debug(json);\n      if (websockets) {\n        ws.close(3504, 'Gateway timeout');\n      }\n      return;\n    } else {\n      Janus.warn(\"Unknown message/event  '\" + json['janus'] + \"' on session \" + sessionId);\n      Janus.debug(json);\n    }\n  }\n\n  // Private helper to send keep-alive messages on WebSockets\n  function keepAlive() {\n    if (!server || !websockets || !connected) return;\n    wsKeepaliveTimeoutId = setTimeout(keepAlive, keepAlivePeriod);\n    let request = {\n      janus: 'keepalive',\n      session_id: sessionId,\n      transaction: Janus.randomString(12),\n    };\n    if (token) request['token'] = token;\n    if (apisecret) request['apisecret'] = apisecret;\n    ws.send(JSON.stringify(request));\n  }\n\n  // Private method to create a session\n  function createSession(callbacks) {\n    let transaction = Janus.randomString(12);\n    let request = { janus: 'create', transaction: transaction };\n    if (callbacks['reconnect']) {\n      // We're reconnecting, claim the session\n      connected = false;\n      request['janus'] = 'claim';\n      request['session_id'] = sessionId;\n      // If we were using websockets, ignore the old connection\n      if (ws) {\n        ws.onopen = null;\n        ws.onerror = null;\n        ws.onclose = null;\n        if (wsKeepaliveTimeoutId) {\n          clearTimeout(wsKeepaliveTimeoutId);\n          wsKeepaliveTimeoutId = null;\n        }\n      }\n    }\n    if (token) request['token'] = token;\n    if (apisecret) request['apisecret'] = apisecret;\n    if (!server && Janus.isArray(servers)) {\n      // We still need to find a working server from the list we were given\n      server = servers[serversIndex];\n      if (server.indexOf('ws') === 0) {\n        websockets = true;\n        Janus.log('Server #' + (serversIndex + 1) + ': trying WebSockets to contact Janus (' + server + ')');\n      } else {\n        websockets = false;\n        Janus.log('Server #' + (serversIndex + 1) + ': trying REST API to contact Janus (' + server + ')');\n      }\n    }\n    if (websockets) {\n      ws = Janus.newWebSocket(server, 'janus-protocol');\n      wsHandlers = {\n        error: function () {\n          Janus.error('Error connecting to the Janus WebSockets server... ' + server);\n          if (Janus.isArray(servers) && !callbacks['reconnect']) {\n            serversIndex++;\n            if (serversIndex === servers.length) {\n              // We tried all the servers the user gave us and they all failed\n              callbacks.error('Error connecting to any of the provided Janus servers: Is the server down?');\n              return;\n            }\n            // Let's try the next server\n            server = null;\n            setTimeout(function () {\n              createSession(callbacks);\n            }, 200);\n            return;\n          }\n          callbacks.error('Error connecting to the Janus WebSockets server: Is the server down?');\n        },\n\n        open: function () {\n          // We need to be notified about the success\n          transactions[transaction] = function (json) {\n            Janus.debug(json);\n            if (json['janus'] !== 'success') {\n              Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason); // FIXME\n              callbacks.error(json['error'].reason);\n              return;\n            }\n            wsKeepaliveTimeoutId = setTimeout(keepAlive, keepAlivePeriod);\n            connected = true;\n            sessionId = json['session_id'] ? json['session_id'] : json.data['id'];\n            if (callbacks['reconnect']) {\n              Janus.log('Claimed session: ' + sessionId);\n            } else {\n              Janus.log('Created session: ' + sessionId);\n            }\n            Janus.sessions[sessionId] = that;\n            callbacks.success();\n          };\n          ws.send(JSON.stringify(request));\n        },\n\n        message: function (event) {\n          handleEvent(JSON.parse(event.data));\n        },\n\n        close: function () {\n          if (!server || !connected) {\n            return;\n          }\n          connected = false;\n          // FIXME What if this is called when the page is closed?\n          gatewayCallbacks.error('Lost connection to the server (is it down?)');\n        },\n      };\n\n      for (let eventName in wsHandlers) {\n        ws.addEventListener(eventName, wsHandlers[eventName]);\n      }\n\n      return;\n    }\n    Janus.httpAPICall(server, {\n      verb: 'POST',\n      withCredentials: withCredentials,\n      body: request,\n      success: function (json) {\n        Janus.debug(json);\n        if (json['janus'] !== 'success') {\n          Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason); // FIXME\n          callbacks.error(json['error'].reason);\n          return;\n        }\n        connected = true;\n        sessionId = json['session_id'] ? json['session_id'] : json.data['id'];\n        if (callbacks['reconnect']) {\n          Janus.log('Claimed session: ' + sessionId);\n        } else {\n          Janus.log('Created session: ' + sessionId);\n        }\n        Janus.sessions[sessionId] = that;\n        eventHandler();\n        callbacks.success();\n      },\n      error: function (textStatus, errorThrown) {\n        Janus.error(textStatus + ':', errorThrown); // FIXME\n        if (Janus.isArray(servers) && !callbacks['reconnect']) {\n          serversIndex++;\n          if (serversIndex === servers.length) {\n            // We tried all the servers the user gave us and they all failed\n            callbacks.error('Error connecting to any of the provided Janus servers: Is the server down?');\n            return;\n          }\n          // Let's try the next server\n          server = null;\n          setTimeout(function () {\n            createSession(callbacks);\n          }, 200);\n          return;\n        }\n        if (errorThrown === '') callbacks.error(textStatus + ': Is the server down?');\n        else if (errorThrown && errorThrown.error) callbacks.error(textStatus + ': ' + errorThrown.error.message);\n        else callbacks.error(textStatus + ': ' + errorThrown);\n      },\n    });\n  }\n\n  // Private method to get info on the server\n  function getInfo(callbacks) {\n    callbacks = callbacks || {};\n    // FIXME This method triggers a success even when we fail\n    callbacks.success = typeof callbacks.success == 'function' ? callbacks.success : Janus.noop;\n    callbacks.error = typeof callbacks.error == 'function' ? callbacks.error : Janus.noop;\n    Janus.log('Getting info on Janus instance');\n    if (!connected) {\n      Janus.warn('Is the server down? (connected=false)');\n      callbacks.error('Is the server down? (connected=false)');\n      return;\n    }\n    // We just need to send an \"info\" request\n    let transaction = Janus.randomString(12);\n    let request = { janus: 'info', transaction: transaction };\n    if (token) request['token'] = token;\n    if (apisecret) request['apisecret'] = apisecret;\n    if (websockets) {\n      transactions[transaction] = function (json) {\n        Janus.log('Server info:');\n        Janus.debug(json);\n        if (json['janus'] !== 'server_info') {\n          Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason); // FIXME\n        }\n        callbacks.success(json);\n      };\n      ws.send(JSON.stringify(request));\n      return;\n    }\n    Janus.httpAPICall(server, {\n      verb: 'POST',\n      withCredentials: withCredentials,\n      body: request,\n      success: function (json) {\n        Janus.log('Server info:');\n        Janus.debug(json);\n        if (json['janus'] !== 'server_info') {\n          Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason); // FIXME\n        }\n        callbacks.success(json);\n      },\n      error: function (textStatus, errorThrown) {\n        Janus.error(textStatus + ':', errorThrown); // FIXME\n        if (errorThrown === '') callbacks.error(textStatus + ': Is the server down?');\n        else callbacks.error(textStatus + ': ' + errorThrown);\n      },\n    });\n  }\n\n  // Private method to destroy a session\n  function destroySession(callbacks) {\n    callbacks = callbacks || {};\n    // FIXME This method triggers a success even when we fail\n    callbacks.success = typeof callbacks.success == 'function' ? callbacks.success : Janus.noop;\n    callbacks.error = typeof callbacks.error == 'function' ? callbacks.error : Janus.noop;\n    let unload = callbacks.unload === true;\n    let notifyDestroyed = true;\n    if (typeof callbacks.notifyDestroyed !== 'undefined' && callbacks.notifyDestroyed !== null)\n      notifyDestroyed = callbacks.notifyDestroyed === true;\n    let cleanupHandles = callbacks.cleanupHandles === true;\n    Janus.log('Destroying session ' + sessionId + ' (unload=' + unload + ')');\n    if (!sessionId) {\n      Janus.warn('No session to destroy');\n      callbacks.success();\n      if (notifyDestroyed) gatewayCallbacks.destroyed();\n      return;\n    }\n    if (cleanupHandles) {\n      for (let handleId in pluginHandles) destroyHandle(handleId, { noRequest: true });\n    }\n    if (!connected) {\n      Janus.warn('Is the server down? (connected=false)');\n      sessionId = null;\n      callbacks.success();\n      return;\n    }\n    // No need to destroy all handles first, Janus will do that itself\n    let request = { janus: 'destroy', transaction: Janus.randomString(12) };\n    if (token) request['token'] = token;\n    if (apisecret) request['apisecret'] = apisecret;\n    if (unload) {\n      // We're unloading the page: use sendBeacon for HTTP instead,\n      // or just close the WebSocket connection if we're using that\n      if (websockets) {\n        ws.onclose = null;\n        ws.close();\n        ws = null;\n      } else {\n        navigator.sendBeacon(server + '/' + sessionId, JSON.stringify(request));\n      }\n      Janus.log('Destroyed session:');\n      sessionId = null;\n      connected = false;\n      callbacks.success();\n      if (notifyDestroyed) gatewayCallbacks.destroyed();\n      return;\n    }\n    if (websockets) {\n      request['session_id'] = sessionId;\n\n      let unbindWebSocket = function () {\n        for (let eventName in wsHandlers) {\n          ws.removeEventListener(eventName, wsHandlers[eventName]);\n        }\n        ws.removeEventListener('message', onUnbindMessage);\n        ws.removeEventListener('error', onUnbindError);\n        if (wsKeepaliveTimeoutId) {\n          clearTimeout(wsKeepaliveTimeoutId);\n        }\n        ws.close();\n      };\n\n      let onUnbindMessage = function (event) {\n        let data = JSON.parse(event.data);\n        if (data.session_id == request.session_id && data.transaction == request.transaction) {\n          unbindWebSocket();\n          callbacks.success();\n          if (notifyDestroyed) gatewayCallbacks.destroyed();\n        }\n      };\n      let onUnbindError = function () {\n        unbindWebSocket();\n        callbacks.error('Failed to destroy the server: Is the server down?');\n        if (notifyDestroyed) gatewayCallbacks.destroyed();\n      };\n\n      ws.addEventListener('message', onUnbindMessage);\n      ws.addEventListener('error', onUnbindError);\n\n      if (ws.readyState === 1) {\n        ws.send(JSON.stringify(request));\n      } else {\n        onUnbindError();\n      }\n\n      return;\n    }\n    Janus.httpAPICall(server + '/' + sessionId, {\n      verb: 'POST',\n      withCredentials: withCredentials,\n      body: request,\n      success: function (json) {\n        Janus.log('Destroyed session:');\n        Janus.debug(json);\n        sessionId = null;\n        connected = false;\n        if (json['janus'] !== 'success') {\n          Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason); // FIXME\n        }\n        callbacks.success();\n        if (notifyDestroyed) gatewayCallbacks.destroyed();\n      },\n      error: function (textStatus, errorThrown) {\n        Janus.error(textStatus + ':', errorThrown); // FIXME\n        // Reset everything anyway\n        sessionId = null;\n        connected = false;\n        callbacks.success();\n        if (notifyDestroyed) gatewayCallbacks.destroyed();\n      },\n    });\n  }\n\n  // Private method to create a plugin handle\n  function createHandle(callbacks) {\n    callbacks = callbacks || {};\n    callbacks.success = typeof callbacks.success == 'function' ? callbacks.success : Janus.noop;\n    callbacks.error = typeof callbacks.error == 'function' ? callbacks.error : Janus.noop;\n    callbacks.dataChannelOptions = callbacks.dataChannelOptions || {\n      ordered: true,\n    };\n    callbacks.consentDialog = typeof callbacks.consentDialog == 'function' ? callbacks.consentDialog : Janus.noop;\n    callbacks.iceState = typeof callbacks.iceState == 'function' ? callbacks.iceState : Janus.noop;\n    callbacks.mediaState = typeof callbacks.mediaState == 'function' ? callbacks.mediaState : Janus.noop;\n    callbacks.webrtcState = typeof callbacks.webrtcState == 'function' ? callbacks.webrtcState : Janus.noop;\n    callbacks.slowLink = typeof callbacks.slowLink == 'function' ? callbacks.slowLink : Janus.noop;\n    callbacks.onmessage = typeof callbacks.onmessage == 'function' ? callbacks.onmessage : Janus.noop;\n    callbacks.onlocaltrack = typeof callbacks.onlocaltrack == 'function' ? callbacks.onlocaltrack : Janus.noop;\n    callbacks.onremotetrack = typeof callbacks.onremotetrack == 'function' ? callbacks.onremotetrack : Janus.noop;\n    callbacks.ondata = typeof callbacks.ondata == 'function' ? callbacks.ondata : Janus.noop;\n    callbacks.ondataopen = typeof callbacks.ondataopen == 'function' ? callbacks.ondataopen : Janus.noop;\n    callbacks.oncleanup = typeof callbacks.oncleanup == 'function' ? callbacks.oncleanup : Janus.noop;\n    callbacks.ondetached = typeof callbacks.ondetached == 'function' ? callbacks.ondetached : Janus.noop;\n    if (!connected) {\n      Janus.warn('Is the server down? (connected=false)');\n      callbacks.error('Is the server down? (connected=false)');\n      return;\n    }\n    let plugin = callbacks.plugin;\n    if (!plugin) {\n      Janus.error('Invalid plugin');\n      callbacks.error('Invalid plugin');\n      return;\n    }\n    let opaqueId = callbacks.opaqueId;\n    let loopIndex = callbacks.loopIndex;\n    let handleToken = callbacks.token ? callbacks.token : token;\n    let transaction = Janus.randomString(12);\n    let request = {\n      janus: 'attach',\n      plugin: plugin,\n      opaque_id: opaqueId,\n      loop_index: loopIndex,\n      transaction: transaction,\n    };\n    if (handleToken) request['token'] = handleToken;\n    if (apisecret) request['apisecret'] = apisecret;\n    if (websockets) {\n      transactions[transaction] = function (json) {\n        Janus.debug(json);\n        if (json['janus'] !== 'success') {\n          Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason); // FIXME\n          callbacks.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason);\n          return;\n        }\n        let handleId = json.data['id'];\n        Janus.log('Created handle: ' + handleId);\n        let pluginHandle = {\n          session: that,\n          plugin: plugin,\n          id: handleId,\n          token: handleToken,\n          detached: false,\n          webrtcStuff: {\n            started: false,\n            myStream: null,\n            streamExternal: false,\n            mySdp: null,\n            mediaConstraints: null,\n            pc: null,\n            dataChannelOptions: callbacks.dataChannelOptions,\n            dataChannel: {},\n            dtmfSender: null,\n            trickle: true,\n            iceDone: false,\n            bitrate: {},\n          },\n          getId: function () {\n            return handleId;\n          },\n          getPlugin: function () {\n            return plugin;\n          },\n          getVolume: function (mid, result) {\n            return getVolume(handleId, mid, true, result);\n          },\n          getRemoteVolume: function (mid, result) {\n            return getVolume(handleId, mid, true, result);\n          },\n          getLocalVolume: function (mid, result) {\n            return getVolume(handleId, mid, false, result);\n          },\n          isAudioMuted: function (mid) {\n            return isMuted(handleId, mid, false);\n          },\n          muteAudio: function (mid) {\n            return mute(handleId, mid, false, true);\n          },\n          unmuteAudio: function (mid) {\n            return mute(handleId, mid, false, false);\n          },\n          isVideoMuted: function (mid) {\n            return isMuted(handleId, mid, true);\n          },\n          muteVideo: function (mid) {\n            return mute(handleId, mid, true, true);\n          },\n          unmuteVideo: function (mid) {\n            return mute(handleId, mid, true, false);\n          },\n          getBitrate: function (mid) {\n            return getBitrate(handleId, mid);\n          },\n          setMaxBitrate: function (mid, bitrate) {\n            return setBitrate(handleId, mid, bitrate);\n          },\n          send: function (callbacks) {\n            sendMessage(handleId, callbacks);\n          },\n          data: function (callbacks) {\n            sendData(handleId, callbacks);\n          },\n          dtmf: function (callbacks) {\n            sendDtmf(handleId, callbacks);\n          },\n          consentDialog: callbacks.consentDialog,\n          iceState: callbacks.iceState,\n          mediaState: callbacks.mediaState,\n          webrtcState: callbacks.webrtcState,\n          slowLink: callbacks.slowLink,\n          onmessage: callbacks.onmessage,\n          createOffer: function (callbacks) {\n            prepareWebrtc(handleId, true, callbacks);\n          },\n          createAnswer: function (callbacks) {\n            prepareWebrtc(handleId, false, callbacks);\n          },\n          handleRemoteJsep: function (callbacks) {\n            prepareWebrtcPeer(handleId, callbacks);\n          },\n          replaceTracks: function (callbacks) {\n            replaceTracks(handleId, callbacks);\n          },\n          getLocalTracks: function () {\n            return getLocalTracks(handleId);\n          },\n          getRemoteTracks: function () {\n            return getRemoteTracks(handleId);\n          },\n          onlocaltrack: callbacks.onlocaltrack,\n          onremotetrack: callbacks.onremotetrack,\n          ondata: callbacks.ondata,\n          ondataopen: callbacks.ondataopen,\n          oncleanup: callbacks.oncleanup,\n          ondetached: callbacks.ondetached,\n          hangup: function (sendRequest) {\n            cleanupWebrtc(handleId, sendRequest === true);\n          },\n          detach: function (callbacks) {\n            destroyHandle(handleId, callbacks);\n          },\n        };\n        pluginHandles[handleId] = pluginHandle;\n        callbacks.success(pluginHandle);\n      };\n      request['session_id'] = sessionId;\n      ws.send(JSON.stringify(request));\n      return;\n    }\n    Janus.httpAPICall(server + '/' + sessionId, {\n      verb: 'POST',\n      withCredentials: withCredentials,\n      body: request,\n      success: function (json) {\n        Janus.debug(json);\n        if (json['janus'] !== 'success') {\n          Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason); // FIXME\n          callbacks.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason);\n          return;\n        }\n        let handleId = json.data['id'];\n        Janus.log('Created handle: ' + handleId);\n        let pluginHandle = {\n          session: that,\n          plugin: plugin,\n          id: handleId,\n          token: handleToken,\n          detached: false,\n          webrtcStuff: {\n            started: false,\n            myStream: null,\n            streamExternal: false,\n            mySdp: null,\n            mediaConstraints: null,\n            pc: null,\n            dataChannelOptions: callbacks.dataChannelOptions,\n            dataChannel: {},\n            dtmfSender: null,\n            trickle: true,\n            iceDone: false,\n            bitrate: {},\n          },\n          getId: function () {\n            return handleId;\n          },\n          getPlugin: function () {\n            return plugin;\n          },\n          getVolume: function (mid, result) {\n            return getVolume(handleId, mid, true, result);\n          },\n          getRemoteVolume: function (mid, result) {\n            return getVolume(handleId, mid, true, result);\n          },\n          getLocalVolume: function (mid, result) {\n            return getVolume(handleId, mid, false, result);\n          },\n          isAudioMuted: function (mid) {\n            return isMuted(handleId, mid, false);\n          },\n          muteAudio: function (mid) {\n            return mute(handleId, mid, false, true);\n          },\n          unmuteAudio: function (mid) {\n            return mute(handleId, mid, false, false);\n          },\n          isVideoMuted: function (mid) {\n            return isMuted(handleId, mid, true);\n          },\n          muteVideo: function (mid) {\n            return mute(handleId, mid, true, true);\n          },\n          unmuteVideo: function (mid) {\n            return mute(handleId, mid, true, false);\n          },\n          getBitrate: function (mid) {\n            return getBitrate(handleId, mid);\n          },\n          setMaxBitrate: function (mid, bitrate) {\n            return setBitrate(handleId, mid, bitrate);\n          },\n          send: function (callbacks) {\n            sendMessage(handleId, callbacks);\n          },\n          data: function (callbacks) {\n            sendData(handleId, callbacks);\n          },\n          dtmf: function (callbacks) {\n            sendDtmf(handleId, callbacks);\n          },\n          consentDialog: callbacks.consentDialog,\n          iceState: callbacks.iceState,\n          mediaState: callbacks.mediaState,\n          webrtcState: callbacks.webrtcState,\n          slowLink: callbacks.slowLink,\n          onmessage: callbacks.onmessage,\n          createOffer: function (callbacks) {\n            prepareWebrtc(handleId, true, callbacks);\n          },\n          createAnswer: function (callbacks) {\n            prepareWebrtc(handleId, false, callbacks);\n          },\n          handleRemoteJsep: function (callbacks) {\n            prepareWebrtcPeer(handleId, callbacks);\n          },\n          replaceTracks: function (callbacks) {\n            replaceTracks(handleId, callbacks);\n          },\n          getLocalTracks: function () {\n            return getLocalTracks(handleId);\n          },\n          getRemoteTracks: function () {\n            return getRemoteTracks(handleId);\n          },\n          onlocaltrack: callbacks.onlocaltrack,\n          onremotetrack: callbacks.onremotetrack,\n          ondata: callbacks.ondata,\n          ondataopen: callbacks.ondataopen,\n          oncleanup: callbacks.oncleanup,\n          ondetached: callbacks.ondetached,\n          hangup: function (sendRequest) {\n            cleanupWebrtc(handleId, sendRequest === true);\n          },\n          detach: function (callbacks) {\n            destroyHandle(handleId, callbacks);\n          },\n        };\n        pluginHandles[handleId] = pluginHandle;\n        callbacks.success(pluginHandle);\n      },\n      error: function (textStatus, errorThrown) {\n        Janus.error(textStatus + ':', errorThrown); // FIXME\n        if (errorThrown === '') callbacks.error(textStatus + ': Is the server down?');\n        else callbacks.error(textStatus + ': ' + errorThrown);\n      },\n    });\n  }\n\n  // Private method to send a message\n  function sendMessage(handleId, callbacks) {\n    callbacks = callbacks || {};\n    callbacks.success = typeof callbacks.success == 'function' ? callbacks.success : Janus.noop;\n    callbacks.error = typeof callbacks.error == 'function' ? callbacks.error : Janus.noop;\n    if (!connected) {\n      Janus.warn('Is the server down? (connected=false)');\n      callbacks.error('Is the server down? (connected=false)');\n      return;\n    }\n    let pluginHandle = pluginHandles[handleId];\n    if (!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle');\n      callbacks.error('Invalid handle');\n      return;\n    }\n    let message = callbacks.message;\n    let jsep = callbacks.jsep;\n    let transaction = Janus.randomString(12);\n    let request = { janus: 'message', body: message, transaction: transaction };\n    if (pluginHandle.token) request['token'] = pluginHandle.token;\n    if (apisecret) request['apisecret'] = apisecret;\n    if (jsep) {\n      request.jsep = {\n        type: jsep.type,\n        sdp: jsep.sdp,\n      };\n      if (jsep.e2ee) request.jsep.e2ee = true;\n      if (jsep.rid_order === 'hml' || jsep.rid_order === 'lmh') request.jsep.rid_order = jsep.rid_order;\n      if (jsep.force_relay) request.jsep.force_relay = true;\n    }\n    Janus.debug('Sending message to plugin (handle=' + handleId + '):');\n    Janus.debug(request);\n    if (websockets) {\n      request['session_id'] = sessionId;\n      request['handle_id'] = handleId;\n      transactions[transaction] = function (json) {\n        Janus.debug('Message sent!');\n        Janus.debug(json);\n        if (json['janus'] === 'success') {\n          // We got a success, must have been a synchronous transaction\n          let plugindata = json['plugindata'];\n          if (!plugindata) {\n            Janus.warn('Request succeeded, but missing plugindata...');\n            callbacks.success();\n            return;\n          }\n          Janus.log('Synchronous transaction successful (' + plugindata['plugin'] + ')');\n          let data = plugindata['data'];\n          Janus.debug(data);\n          callbacks.success(data);\n          return;\n        } else if (json['janus'] !== 'ack') {\n          // Not a success and not an ack, must be an error\n          if (json['error']) {\n            Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason); // FIXME\n            callbacks.error(json['error'].code + ' ' + json['error'].reason);\n          } else {\n            Janus.error('Unknown error'); // FIXME\n            callbacks.error('Unknown error');\n          }\n          return;\n        }\n        // If we got here, the plugin decided to handle the request asynchronously\n        callbacks.success();\n      };\n      ws.send(JSON.stringify(request));\n      return;\n    }\n    Janus.httpAPICall(server + '/' + sessionId + '/' + handleId, {\n      verb: 'POST',\n      withCredentials: withCredentials,\n      body: request,\n      success: function (json) {\n        Janus.debug('Message sent!');\n        Janus.debug(json);\n        if (json['janus'] === 'success') {\n          // We got a success, must have been a synchronous transaction\n          let plugindata = json['plugindata'];\n          if (!plugindata) {\n            Janus.warn('Request succeeded, but missing plugindata...');\n            callbacks.success();\n            return;\n          }\n          Janus.log('Synchronous transaction successful (' + plugindata['plugin'] + ')');\n          let data = plugindata['data'];\n          Janus.debug(data);\n          callbacks.success(data);\n          return;\n        } else if (json['janus'] !== 'ack') {\n          // Not a success and not an ack, must be an error\n          if (json['error']) {\n            Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason); // FIXME\n            callbacks.error(json['error'].code + ' ' + json['error'].reason);\n          } else {\n            Janus.error('Unknown error'); // FIXME\n            callbacks.error('Unknown error');\n          }\n          return;\n        }\n        // If we got here, the plugin decided to handle the request asynchronously\n        callbacks.success();\n      },\n      error: function (textStatus, errorThrown) {\n        Janus.error(textStatus + ':', errorThrown); // FIXME\n        callbacks.error(textStatus + ': ' + errorThrown);\n      },\n    });\n  }\n\n  // Private method to send a trickle candidate\n  function sendTrickleCandidate(handleId, candidate) {\n    if (!connected) {\n      Janus.warn('Is the server down? (connected=false)');\n      return;\n    }\n    let pluginHandle = pluginHandles[handleId];\n    if (!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle');\n      return;\n    }\n    let request = {\n      janus: 'trickle',\n      candidate: candidate,\n      transaction: Janus.randomString(12),\n    };\n    if (pluginHandle.token) request['token'] = pluginHandle.token;\n    if (apisecret) request['apisecret'] = apisecret;\n    Janus.vdebug('Sending trickle candidate (handle=' + handleId + '):');\n    Janus.vdebug(request);\n    if (websockets) {\n      request['session_id'] = sessionId;\n      request['handle_id'] = handleId;\n      ws.send(JSON.stringify(request));\n      return;\n    }\n    Janus.httpAPICall(server + '/' + sessionId + '/' + handleId, {\n      verb: 'POST',\n      withCredentials: withCredentials,\n      body: request,\n      success: function (json) {\n        Janus.vdebug('Candidate sent!');\n        Janus.vdebug(json);\n        if (json['janus'] !== 'ack') {\n          Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason); // FIXME\n          return;\n        }\n      },\n      error: function (textStatus, errorThrown) {\n        Janus.error(textStatus + ':', errorThrown); // FIXME\n      },\n    });\n  }\n\n  // Private method to create a data channel\n  function createDataChannel(handleId, dclabel, dcprotocol, incoming, pendingData) {\n    let pluginHandle = pluginHandles[handleId];\n    if (!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle');\n      return;\n    }\n    let config = pluginHandle.webrtcStuff;\n    if (!config.pc) {\n      Janus.warn('Invalid PeerConnection');\n      return;\n    }\n    let onDataChannelMessage = function (event) {\n      Janus.log('Received message on data channel:', event);\n      let label = event.target.label;\n      pluginHandle.ondata(event.data, label);\n    };\n    let onDataChannelStateChange = function (event) {\n      Janus.log('Received state change on data channel:', event);\n      let label = event.target.label;\n      let protocol = event.target.protocol;\n      let dcState = config.dataChannel[label] ? config.dataChannel[label].readyState : 'null';\n      Janus.log('State change on <' + label + '> data channel: ' + dcState);\n      if (dcState === 'open') {\n        // Any pending messages to send?\n        if (config.dataChannel[label].pending && config.dataChannel[label].pending.length > 0) {\n          Janus.log('Sending pending messages on <' + label + '>:', config.dataChannel[label].pending.length);\n          for (let data of config.dataChannel[label].pending) {\n            Janus.log('Sending data on data channel <' + label + '>');\n            Janus.debug(data);\n            config.dataChannel[label].send(data);\n          }\n          config.dataChannel[label].pending = [];\n        }\n        // Notify the open data channel\n        pluginHandle.ondataopen(label, protocol);\n      }\n    };\n    let onDataChannelError = function (error) {\n      Janus.error('Got error on data channel:', error);\n      // TODO\n    };\n    if (!incoming) {\n      // FIXME Add options (ordered, maxRetransmits, etc.)\n      let dcoptions = config.dataChannelOptions;\n      if (dcprotocol) dcoptions.protocol = dcprotocol;\n      config.dataChannel[dclabel] = config.pc.createDataChannel(dclabel, dcoptions);\n    } else {\n      // The channel was created by Janus\n      config.dataChannel[dclabel] = incoming;\n    }\n    config.dataChannel[dclabel].onmessage = onDataChannelMessage;\n    config.dataChannel[dclabel].onopen = onDataChannelStateChange;\n    config.dataChannel[dclabel].onclose = onDataChannelStateChange;\n    config.dataChannel[dclabel].onerror = onDataChannelError;\n    config.dataChannel[dclabel].pending = [];\n    if (pendingData) config.dataChannel[dclabel].pending.push(pendingData);\n  }\n\n  // Private method to send a data channel message\n  function sendData(handleId, callbacks) {\n    callbacks = callbacks || {};\n    callbacks.success = typeof callbacks.success == 'function' ? callbacks.success : Janus.noop;\n    callbacks.error = typeof callbacks.error == 'function' ? callbacks.error : Janus.noop;\n    let pluginHandle = pluginHandles[handleId];\n    if (!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle');\n      callbacks.error('Invalid handle');\n      return;\n    }\n    let config = pluginHandle.webrtcStuff;\n    let data = callbacks.text || callbacks.data;\n    if (!data) {\n      Janus.warn('Invalid data');\n      callbacks.error('Invalid data');\n      return;\n    }\n    let label = callbacks.label ? callbacks.label : Janus.dataChanDefaultLabel;\n    if (!config.dataChannel[label]) {\n      // Create new data channel and wait for it to open\n      createDataChannel(handleId, label, callbacks.protocol, false, data, callbacks.protocol);\n      callbacks.success();\n      return;\n    }\n    if (config.dataChannel[label].readyState !== 'open') {\n      config.dataChannel[label].pending.push(data);\n      callbacks.success();\n      return;\n    }\n    Janus.log('Sending data on data channel <' + label + '>');\n    Janus.debug(data);\n    config.dataChannel[label].send(data);\n    callbacks.success();\n  }\n\n  // Private method to send a DTMF tone\n  function sendDtmf(handleId, callbacks) {\n    callbacks = callbacks || {};\n    callbacks.success = typeof callbacks.success == 'function' ? callbacks.success : Janus.noop;\n    callbacks.error = typeof callbacks.error == 'function' ? callbacks.error : Janus.noop;\n    let pluginHandle = pluginHandles[handleId];\n    if (!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle');\n      callbacks.error('Invalid handle');\n      return;\n    }\n    let config = pluginHandle.webrtcStuff;\n    if (!config.dtmfSender) {\n      // Create the DTMF sender the proper way, if possible\n      if (config.pc) {\n        let senders = config.pc.getSenders();\n        let audioSender = senders.find(function (sender) {\n          return sender.track && sender.track.kind === 'audio';\n        });\n        if (!audioSender) {\n          Janus.warn('Invalid DTMF configuration (no audio track)');\n          callbacks.error('Invalid DTMF configuration (no audio track)');\n          return;\n        }\n        config.dtmfSender = audioSender.dtmf;\n        if (config.dtmfSender) {\n          Janus.log('Created DTMF Sender');\n          config.dtmfSender.ontonechange = function (tone) {\n            Janus.debug('Sent DTMF tone: ' + tone.tone);\n          };\n        }\n      }\n      if (!config.dtmfSender) {\n        Janus.warn('Invalid DTMF configuration');\n        callbacks.error('Invalid DTMF configuration');\n        return;\n      }\n    }\n    let dtmf = callbacks.dtmf;\n    if (!dtmf) {\n      Janus.warn('Invalid DTMF parameters');\n      callbacks.error('Invalid DTMF parameters');\n      return;\n    }\n    let tones = dtmf.tones;\n    if (!tones) {\n      Janus.warn('Invalid DTMF string');\n      callbacks.error('Invalid DTMF string');\n      return;\n    }\n    let duration = typeof dtmf.duration === 'number' ? dtmf.duration : 500; // We choose 500ms as the default duration for a tone\n    let gap = typeof dtmf.gap === 'number' ? dtmf.gap : 50; // We choose 50ms as the default gap between tones\n    Janus.debug('Sending DTMF string ' + tones + ' (duration ' + duration + 'ms, gap ' + gap + 'ms)');\n    config.dtmfSender.insertDTMF(tones, duration, gap);\n    callbacks.success();\n  }\n\n  // Private method to destroy a plugin handle\n  function destroyHandle(handleId, callbacks) {\n    callbacks = callbacks || {};\n    callbacks.success = typeof callbacks.success == 'function' ? callbacks.success : Janus.noop;\n    callbacks.error = typeof callbacks.error == 'function' ? callbacks.error : Janus.noop;\n    let noRequest = callbacks.noRequest === true;\n    Janus.log('Destroying handle ' + handleId + ' (only-locally=' + noRequest + ')');\n    cleanupWebrtc(handleId);\n    let pluginHandle = pluginHandles[handleId];\n    if (!pluginHandle || pluginHandle.detached) {\n      // Plugin was already detached by Janus, calling detach again will return a handle not found error, so just exit here\n      delete pluginHandles[handleId];\n      callbacks.success();\n      return;\n    }\n    pluginHandle.detached = true;\n    if (noRequest) {\n      // We're only removing the handle locally\n      delete pluginHandles[handleId];\n      callbacks.success();\n      return;\n    }\n    if (!connected) {\n      Janus.warn('Is the server down? (connected=false)');\n      callbacks.error('Is the server down? (connected=false)');\n      return;\n    }\n    let request = { janus: 'detach', transaction: Janus.randomString(12) };\n    if (pluginHandle.token) request['token'] = pluginHandle.token;\n    if (apisecret) request['apisecret'] = apisecret;\n    if (websockets) {\n      request['session_id'] = sessionId;\n      request['handle_id'] = handleId;\n      ws.send(JSON.stringify(request));\n      delete pluginHandles[handleId];\n      callbacks.success();\n      return;\n    }\n    Janus.httpAPICall(server + '/' + sessionId + '/' + handleId, {\n      verb: 'POST',\n      withCredentials: withCredentials,\n      body: request,\n      success: function (json) {\n        Janus.log('Destroyed handle:');\n        Janus.debug(json);\n        if (json['janus'] !== 'success') {\n          Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason); // FIXME\n        }\n        delete pluginHandles[handleId];\n        callbacks.success();\n      },\n      error: function (textStatus, errorThrown) {\n        Janus.error(textStatus + ':', errorThrown); // FIXME\n        // We cleanup anyway\n        delete pluginHandles[handleId];\n        callbacks.success();\n      },\n    });\n  }\n\n  // WebRTC stuff\n  // Helper function to create a new PeerConnection, if we need one\n  function createPeerconnectionIfNeeded(handleId, callbacks) {\n    let pluginHandle = pluginHandles[handleId];\n    if (!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle');\n      throw 'Invalid handle';\n    }\n    let config = pluginHandle.webrtcStuff;\n    if (config.pc) {\n      // Nothing to do, we have a PeerConnection already\n      return;\n    }\n    let pc_config = {\n      iceServers: iceServers,\n      iceTransportPolicy: iceTransportPolicy,\n      bundlePolicy: bundlePolicy,\n    };\n    pc_config.sdpSemantics = 'unified-plan';\n    // Check if a sender or receiver transform has been provided\n    let insertableStreams = false;\n    if (callbacks.tracks) {\n      for (let track of callbacks.tracks) {\n        if (track.transforms && (track.transforms.sender || track.transforms.receiver)) {\n          insertableStreams = true;\n          break;\n        }\n      }\n    }\n    if (\n      RTCRtpSender &&\n      (RTCRtpSender.prototype.createEncodedStreams ||\n        (RTCRtpSender.prototype.createEncodedAudioStreams && RTCRtpSender.prototype.createEncodedVideoStreams)) &&\n      insertableStreams\n    ) {\n      config.insertableStreams = true;\n      pc_config.forceEncodedAudioInsertableStreams = true;\n      pc_config.forceEncodedVideoInsertableStreams = true;\n      pc_config.encodedInsertableStreams = true;\n    }\n    Janus.log('Creating PeerConnection');\n    config.pc = new RTCPeerConnection(pc_config);\n    Janus.debug(config.pc);\n    if (config.pc.getStats) {\n      // FIXME\n      config.volume = {};\n      config.bitrate.value = '0 kbits/sec';\n    }\n    Janus.log('Preparing local SDP and gathering candidates (trickle=' + config.trickle + ')');\n    config.pc.oniceconnectionstatechange = function () {\n      if (config.pc) pluginHandle.iceState(config.pc.iceConnectionState);\n    };\n    config.pc.onicecandidate = function (event) {\n      if (!event.candidate || (event.candidate.candidate && event.candidate.candidate.indexOf('endOfCandidates') > 0)) {\n        Janus.log('End of candidates.');\n        config.iceDone = true;\n        if (config.trickle === true) {\n          // Notify end of candidates\n          sendTrickleCandidate(handleId, { completed: true });\n        } else {\n          // No trickle, time to send the complete SDP (including all candidates)\n          sendSDP(handleId, callbacks);\n        }\n      } else {\n        // JSON.stringify doesn't work on some WebRTC objects anymore\n        // See https://code.google.com/p/chromium/issues/detail?id=467366\n        let candidate = {\n          candidate: event.candidate.candidate,\n          sdpMid: event.candidate.sdpMid,\n          sdpMLineIndex: event.candidate.sdpMLineIndex,\n        };\n        if (config.trickle === true) {\n          // Send candidate\n          sendTrickleCandidate(handleId, candidate);\n        }\n      }\n    };\n    config.pc.ontrack = function (event) {\n      Janus.log('Handling Remote Track', event);\n      if (!event.streams) return;\n      if (!event.track) return;\n      // Notify about the new track event\n      let mid = event.transceiver ? event.transceiver.mid || event.transceiver._mid : event.track.id;\n      try {\n        pluginHandle.onremotetrack(event.track, mid, true, {\n          reason: 'created',\n        });\n      } catch (e) {\n        Janus.error('Error calling onremotetrack', e);\n      }\n      if (event.track.onended) return;\n      let trackMutedTimeoutId = null;\n      Janus.log('Adding onended callback to track:', event.track);\n      event.track.onended = function (ev) {\n        Janus.log('Remote track removed:', ev);\n        clearTimeout(trackMutedTimeoutId);\n        // Notify the application\n        let transceivers = config.pc ? config.pc.getTransceivers() : null;\n        let transceiver = transceivers\n          ? transceivers.find((transceiver) => {\n            const receiver = transceiver.receiver || transceiver._receiver;\n            const track = receiver.track || receiver._track;\n            return track === ev.target;\n          })\n          : null;\n        let mid = transceiver ? transceiver.mid || transceiver._mid : ev.target.id;\n        try {\n          pluginHandle.onremotetrack(ev.target, mid, false, {\n            reason: 'ended',\n          });\n        } catch (e) {\n          Janus.error('Error calling onremotetrack on removal', e);\n        }\n      };\n      event.track.onmute = function (ev) {\n        Janus.log('Remote track muted:', ev);\n        if (!trackMutedTimeoutId) {\n          const target = ev.target;\n          trackMutedTimeoutId = setTimeout(function () {\n            Janus.log('Removing remote track');\n            // Notify the application the track is gone\n            let transceivers = config.pc ? config.pc.getTransceivers() : null;\n            let transceiver = transceivers\n              ? transceivers.find((transceiver) => {\n                const receiver = transceiver.receiver || transceiver._receiver;\n                const track = receiver.track || receiver._track;\n                return track === target;\n              })\n              : null;\n            let mid = transceiver ? transceiver.mid || transceiver._mid : target.id;\n            try {\n              pluginHandle.onremotetrack(target, mid, false, {\n                reason: 'mute',\n              });\n            } catch (e) {\n              Janus.error('Error calling onremotetrack on mute', e);\n            }\n            trackMutedTimeoutId = null;\n            // Chrome seems to raise mute events only at multiples of 834ms;\n            // we set the timeout to three times this value (rounded to 840ms);\n          }, 3 * 840);\n        }\n      };\n      event.track.onunmute = function (ev) {\n        Janus.log('Remote track flowing again:', ev);\n        if (trackMutedTimeoutId != null) {\n          clearTimeout(trackMutedTimeoutId);\n          trackMutedTimeoutId = null;\n        } else {\n          try {\n            // Notify the application the track is back\n            let transceivers = config.pc ? config.pc.getTransceivers() : null;\n            let transceiver = transceivers\n              ? transceivers.find((transceiver) => {\n                const receiver = transceiver.receiver || transceiver._receiver;\n                const track = receiver.track || receiver._track;\n                return track === ev.target;\n              })\n              : null;\n            let mid = transceiver ? transceiver.mid || transceiver._mid : ev.target.id;\n            pluginHandle.onremotetrack(ev.target, mid, true, {\n              reason: 'unmute',\n            });\n          } catch (e) {\n            Janus.error('Error calling onremotetrack on unmute', e);\n          }\n        }\n      };\n    };\n  }\n\n  // Helper function used when creating either an offer or answer: it\n  // prepares what needs to be prepared, including creating a new\n  // PeerConnection (if needed) and updating the tracks configuration,\n  // before invoking the function to actually generate the offer/answer\n  async function prepareWebrtc(handleId, offer, callbacks) {\n    callbacks = callbacks || {};\n    callbacks.success = typeof callbacks.success == 'function' ? callbacks.success : Janus.noop;\n    callbacks.error = typeof callbacks.error == 'function' ? callbacks.error : webrtcError;\n    let jsep = callbacks.jsep;\n    if (offer && jsep) {\n      Janus.error('Provided a JSEP to a createOffer');\n      callbacks.error('Provided a JSEP to a createOffer');\n      return;\n    } else if (!offer && (!jsep || !jsep.type || !jsep.sdp)) {\n      Janus.error('A valid JSEP is required for createAnswer');\n      callbacks.error('A valid JSEP is required for createAnswer');\n      return;\n    }\n    // If the deprecated media was provided instead of tracks, translate it\n    if (callbacks.media && !callbacks.tracks) {\n      callbacks.tracks = Janus.mediaToTracks(callbacks.media);\n      if (callbacks.simulcast === true || callbacks.simulcast2 === true || callbacks.svc) {\n        // Find the video track and add simulcast/SVC info there\n        for (let track of callbacks.tracks) {\n          if (track.type === 'video') {\n            if (callbacks.simulcast === true || callbacks.simulcast2 === true) track.simulcast = true;\n            else if (callbacks.svc) track.svc = callbacks.svc;\n            break;\n          }\n        }\n      }\n      Janus.warn('Deprecated media object passed, use tracks instead. Automatically translated to:', callbacks.tracks);\n    }\n    // Check that callbacks.array is a valid array\n    if (callbacks.tracks && !Array.isArray(callbacks.tracks)) {\n      Janus.error('Tracks must be an array');\n      callbacks.error('Tracks must be an array');\n      return;\n    }\n    // Get the plugin handle\n    let pluginHandle = pluginHandles[handleId];\n    if (!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle');\n      callbacks.error('Invalid handle');\n      return;\n    }\n    let config = pluginHandle.webrtcStuff;\n    config.trickle = isTrickleEnabled(callbacks.trickle);\n    try {\n      // Create a PeerConnection, if needed\n      createPeerconnectionIfNeeded(handleId, callbacks);\n      if (offer) {\n        // Capture devices and setup tracks, if needed\n        await captureDevices(handleId, callbacks);\n      }\n      // Create offer or answer now (depending on the context)\n      if (!jsep) {\n        let offer = await createOffer(handleId, callbacks);\n        callbacks.success(offer);\n      } else {\n        await config.pc.setRemoteDescription(jsep);\n        Janus.log('Remote description accepted!');\n        config.remoteSdp = jsep.sdp;\n        // Any trickle candidate we cached?\n        if (config.candidates && config.candidates.length > 0) {\n          for (let i = 0; i < config.candidates.length; i++) {\n            let candidate = config.candidates[i];\n            Janus.debug('Adding remote candidate:', candidate);\n            if (!candidate || candidate.completed === true) {\n              // end-of-candidates\n              config.pc.addIceCandidate(Janus.endOfCandidates);\n            } else {\n              // New candidate\n              config.pc.addIceCandidate(candidate);\n            }\n          }\n          config.candidates = [];\n        }\n        // Capture devices and setup tracks, if needed\n        await captureDevices(handleId, callbacks);\n        // Create the answer now\n        let answer = await createAnswer(handleId, callbacks);\n        callbacks.success(answer);\n      }\n    } catch (err) {\n      Janus.error(err);\n      callbacks.error(err);\n    }\n  }\n\n  function prepareWebrtcPeer(handleId, callbacks) {\n    callbacks = callbacks || {};\n    callbacks.success = typeof callbacks.success == 'function' ? callbacks.success : Janus.noop;\n    callbacks.error = typeof callbacks.error == 'function' ? callbacks.error : webrtcError;\n    callbacks.customizeSdp = typeof callbacks.customizeSdp == 'function' ? callbacks.customizeSdp : Janus.noop;\n    let jsep = callbacks.jsep;\n    let pluginHandle = pluginHandles[handleId];\n    if (!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle');\n      callbacks.error('Invalid handle');\n      return;\n    }\n    let config = pluginHandle.webrtcStuff;\n    if (jsep) {\n      if (!config.pc) {\n        Janus.warn('Wait, no PeerConnection?? if this is an answer, use createAnswer and not handleRemoteJsep');\n        callbacks.error('No PeerConnection: if this is an answer, use createAnswer and not handleRemoteJsep');\n        return;\n      }\n      callbacks.customizeSdp(jsep);\n      config.pc.setRemoteDescription(jsep).then(function () {\n        Janus.log('Remote description accepted!');\n        config.remoteSdp = jsep.sdp;\n        // Any trickle candidate we cached?\n        if (config.candidates && config.candidates.length > 0) {\n          for (let i = 0; i < config.candidates.length; i++) {\n            let candidate = config.candidates[i];\n            Janus.debug('Adding remote candidate:', candidate);\n            if (!candidate || candidate.completed === true) {\n              // end-of-candidates\n              config.pc.addIceCandidate(Janus.endOfCandidates);\n            } else {\n              // New candidate\n              config.pc.addIceCandidate(candidate);\n            }\n          }\n          config.candidates = [];\n        }\n        // Done\n        callbacks.success();\n      }, callbacks.error);\n    } else {\n      callbacks.error('Invalid JSEP');\n    }\n  }\n\n  async function createOffer(handleId, callbacks) {\n    callbacks = callbacks || {};\n    callbacks.customizeSdp = typeof callbacks.customizeSdp == 'function' ? callbacks.customizeSdp : Janus.noop;\n    let pluginHandle = pluginHandles[handleId];\n    if (!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle');\n      throw 'Invalid handle';\n    }\n    let config = pluginHandle.webrtcStuff;\n    Janus.log('Creating offer (iceDone=' + config.iceDone + ')');\n    // https://code.google.com/p/webrtc/issues/detail?id=3508\n    let mediaConstraints = {};\n    let iceRestart = callbacks.iceRestart === true;\n    // If we need an ICE restart, set the related constraint\n    if (iceRestart) mediaConstraints.iceRestart = true;\n    Janus.debug(mediaConstraints);\n    let offer = await config.pc.createOffer(mediaConstraints);\n    Janus.debug(offer);\n    // JSON.stringify doesn't work on some WebRTC objects anymore\n    // See https://code.google.com/p/chromium/issues/detail?id=467366\n    let jsep = {\n      type: 'offer',\n      sdp: offer.sdp,\n    };\n    callbacks.customizeSdp(jsep);\n    offer.sdp = jsep.sdp;\n    Janus.log('Setting local description');\n    config.mySdp = {\n      type: 'offer',\n      sdp: offer.sdp,\n    };\n    await config.pc.setLocalDescription(offer);\n    config.mediaConstraints = mediaConstraints;\n    if (!config.iceDone && !config.trickle) {\n      // FIXME Don't do anything until we have all candidates\n      Janus.log('Waiting for all candidates...');\n      return null;\n    }\n    // If transforms are present, notify Janus that the media is end-to-end encrypted\n    if (config.insertableStreams) offer.e2ee = true;\n    return offer;\n  }\n\n  async function createAnswer(handleId, callbacks) {\n    callbacks = callbacks || {};\n    callbacks.customizeSdp = typeof callbacks.customizeSdp == 'function' ? callbacks.customizeSdp : Janus.noop;\n    let pluginHandle = pluginHandles[handleId];\n    if (!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle');\n      throw 'Invalid handle';\n    }\n    let config = pluginHandle.webrtcStuff;\n    Janus.log('Creating answer (iceDone=' + config.iceDone + ')');\n    let answer = await config.pc.createAnswer();\n    Janus.debug(answer);\n    // JSON.stringify doesn't work on some WebRTC objects anymore\n    // See https://code.google.com/p/chromium/issues/detail?id=467366\n    let jsep = {\n      type: 'answer',\n      sdp: answer.sdp,\n    };\n    callbacks.customizeSdp(jsep);\n    answer.sdp = jsep.sdp;\n    Janus.log('Setting local description');\n    config.mySdp = {\n      type: 'answer',\n      sdp: answer.sdp,\n    };\n    await config.pc.setLocalDescription(answer);\n    if (!config.iceDone && !config.trickle) {\n      // FIXME Don't do anything until we have all candidates\n      Janus.log('Waiting for all candidates...');\n      return null;\n    }\n    // If transforms are present, notify Janus that the media is end-to-end encrypted\n    if (config.insertableStreams) answer.e2ee = true;\n    return answer;\n  }\n\n  function sendSDP(handleId, callbacks) {\n    callbacks = callbacks || {};\n    callbacks.success = typeof callbacks.success == 'function' ? callbacks.success : Janus.noop;\n    callbacks.error = typeof callbacks.error == 'function' ? callbacks.error : Janus.noop;\n    let pluginHandle = pluginHandles[handleId];\n    if (!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle, not sending anything');\n      return;\n    }\n    let config = pluginHandle.webrtcStuff;\n    Janus.log('Sending offer/answer SDP...');\n    if (!config.mySdp) {\n      Janus.warn('Local SDP instance is invalid, not sending anything...');\n      return;\n    }\n    config.mySdp = {\n      type: config.pc.localDescription.type,\n      sdp: config.pc.localDescription.sdp,\n    };\n    if (config.trickle === false) config.mySdp['trickle'] = false;\n    Janus.debug(callbacks);\n    config.sdpSent = true;\n    callbacks.success(config.mySdp);\n  }\n\n  async function replaceTracks(handleId, callbacks) {\n    callbacks = callbacks || {};\n    callbacks.success = typeof callbacks.success == 'function' ? callbacks.success : Janus.noop;\n    callbacks.error = typeof callbacks.error == 'function' ? callbacks.error : Janus.noop;\n    // Check that callbacks.array is a valid array\n    if (callbacks.tracks && !Array.isArray(callbacks.tracks)) {\n      Janus.error('Tracks must be an array');\n      callbacks.error('Tracks must be an array');\n      return;\n    }\n    // Add the replace:true if it's missing\n    for (let track of callbacks.tracks) {\n      if (track.add || (!track.replace && !track.remove)) track.replace = true;\n    }\n    try {\n      await captureDevices(handleId, callbacks);\n      callbacks.success();\n    } catch (err) {\n      Janus.error(err);\n      callbacks.error(err);\n    }\n  }\n\n  async function captureDevices(handleId, callbacks) {\n    let pluginHandle = pluginHandles[handleId];\n    if (!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle, not sending anything');\n      throw 'Invalid handle';\n    }\n    let config = pluginHandle.webrtcStuff;\n    if (!config.pc) {\n      Janus.warn('Invalid PeerConnection');\n      throw 'Invalid PeerConnection';\n    }\n    let tracks = callbacks.tracks;\n    if (!tracks || !Array.isArray(tracks) || tracks.length === 0) {\n      // Nothing to do\n      return;\n    }\n    let openedConsentDialog = false;\n    // Check if we can/should group getUserMedia calls\n    let groups = {};\n    for (let track of tracks) {\n      delete track.gumGroup;\n      if (!track.type || !['audio', 'video'].includes(track.type)) continue;\n      if (!track.capture || track.capture instanceof MediaStreamTrack) continue;\n      let group = track.group ? track.group : 'default';\n      if (!groups[group]) groups[group] = {};\n      if (groups[group][track.type]) continue;\n      track.gumGroup = group;\n      groups[group][track.type] = track;\n    }\n    let keys = Object.keys(groups);\n    for (let key of keys) {\n      let group = groups[key];\n      if (!group.audio || !group.video) {\n        if (group.audio) delete group.audio.gumGroup;\n        if (group.video) delete group.video.gumGroup;\n        delete groups[key];\n      }\n    }\n    let answer = callbacks.jsep ? true : false;\n    for (let track of tracks) {\n      if (!track.type) {\n        Janus.warn('Missing track type:', track);\n        continue;\n      }\n      if (track.type === 'data') {\n        // Easy enough: create a datachannel if we don't have one already\n        if (config.pc.ondatachannel) {\n          Janus.warn('Data channel exists already, not creating another one');\n          continue;\n        }\n        Janus.log('Creating default data channel');\n        createDataChannel(handleId, Janus.dataChanDefaultLabel, null, false);\n        config.pc.ondatachannel = function (event) {\n          Janus.log('Data channel created by Janus:', event);\n          createDataChannel(handleId, event.channel.label, event.channel.protocol, event.channel);\n        };\n        continue;\n      }\n      if (\n        typeof track.add === 'undefined' &&\n        track.add === null &&\n        typeof track.remove === 'undefined' &&\n        track.remove === null &&\n        typeof track.replace === 'undefined' &&\n        track.replace === null\n      ) {\n        // Let's default to 'add'\n        track.add = true;\n      }\n      if ((track.add && track.remove) || (track.add && track.remove && track.replace)) {\n        Janus.warn('Conflicting actions for track, ignoring:', track);\n        continue;\n      }\n      if (track.add && track.replace) {\n        Janus.warn('Both add and replace provided, falling back to replace:', track);\n        delete track.add;\n      } else if (track.remove && track.replace) {\n        Janus.warn('Both remove and replace provided, falling back to remove:', track);\n        delete track.replace;\n      }\n      let kind = track.type;\n      if (track.type === 'screen') kind = 'video'; // FIXME\n      let transceiver = null,\n        sender = null;\n      if (track.mid) {\n        // Search by mid\n        transceiver = config.pc.getTransceivers().find((t) => t.mid === track.mid && t.receiver.track.kind === kind);\n      } else {\n        // Find the first track of this type\n        transceiver = config.pc.getTransceivers().find((t) => t.receiver.track.kind === kind);\n      }\n      if (track.replace || track.remove) {\n        if (!transceiver) {\n          Janus.warn(\"Couldn't find a transceiver for track:\", track);\n          continue;\n        }\n        if (!transceiver.sender) {\n          Janus.warn('No sender in the transceiver for track:', track);\n          continue;\n        }\n        sender = transceiver.sender;\n      }\n      if (answer && !transceiver) {\n        transceiver = config.pc.getTransceivers().find((t) => t.receiver.track.kind === kind);\n        if (!transceiver) {\n          Janus.warn(\"Couldn't find a transceiver for track:\", track);\n          continue;\n        }\n      }\n      // Capture the new track, if we need to\n      let nt = null,\n        trackId = null;\n      if (track.remove) {\n        Janus.log('Removing track from PeerConnection', track);\n        trackId = sender.track ? sender.track.id : null;\n        await sender.replaceTrack(null);\n      } else if (track.capture) {\n        if (track.gumGroup && groups[track.gumGroup] && groups[track.gumGroup].stream) {\n          // We did a getUserMedia before already\n          let stream = groups[track.gumGroup].stream;\n          nt = track.type === 'audio' ? stream.getAudioTracks()[0] : stream.getVideoTracks()[0];\n          delete groups[track.gumGroup].stream;\n          delete groups[track.gumGroup];\n          delete track.gumGroup;\n        } else if (track.capture instanceof MediaStreamTrack) {\n          // An external track was provided, use that\n          nt = track.capture;\n        } else {\n          if (!openedConsentDialog) {\n            openedConsentDialog = true;\n            pluginHandle.consentDialog(true);\n          }\n          let constraints = Janus.trackConstraints(track),\n            stream = null;\n          if (track.type === 'audio' || track.type === 'video') {\n            // Use getUserMedia: check if we need to group audio and video together\n            if (track.gumGroup) {\n              let otherType = track.type === 'audio' ? 'video' : 'audio';\n              if (groups[track.gumGroup] && groups[track.gumGroup][otherType]) {\n                let otherTrack = groups[track.gumGroup][otherType];\n                let otherConstraints = Janus.trackConstraints(otherTrack);\n                constraints[otherType] = otherConstraints[otherType];\n              }\n            }\n            stream = await navigator.mediaDevices.getUserMedia(constraints);\n            if (track.gumGroup && constraints.audio && constraints.video) {\n              // We just performed a grouped getUserMedia, keep track of the\n              // stream so that we can immediately assign the track later\n              groups[track.gumGroup].stream = stream;\n              delete track.gumGroup;\n            }\n          } else {\n            // Use getDisplayMedia\n            stream = await navigator.mediaDevices.getDisplayMedia(constraints);\n          }\n          nt = track.type === 'audio' ? stream.getAudioTracks()[0] : stream.getVideoTracks()[0];\n        }\n        if (track.replace) {\n          // Replace the track\n          await sender.replaceTrack(nt);\n          // Update the transceiver direction\n          let newDirection = 'sendrecv';\n          if (track.recv === false || transceiver.direction === 'inactive' || transceiver.direction === 'sendonly')\n            newDirection = 'sendonly';\n          if (transceiver.setDirection) transceiver.setDirection(newDirection);\n          else transceiver.direction = newDirection;\n        } else {\n          // FIXME Add as a new track\n          if (!config.myStream) config.myStream = new MediaStream();\n          if (kind === 'audio' || (!track.simulcast && !track.svc)) {\n            sender = config.pc.addTrack(nt, config.myStream);\n            transceiver = config.pc.getTransceivers().find((t) => t.sender === sender);\n          } else if (track.simulcast) {\n            if (Janus.webRTCAdapter.browserDetails.browser !== 'firefox') {\n              // Standard RID\n              Janus.log('Enabling rid-based simulcasting:', nt);\n              let maxBitrates = getMaxBitrates(track.simulcastMaxBitrates);\n              transceiver = config.pc.addTransceiver(nt, {\n                direction: 'sendrecv',\n                streams: [config.myStream],\n                sendEncodings: track.sendEncodings || [\n                  { rid: 'h', active: true, maxBitrate: maxBitrates.high },\n                  {\n                    rid: 'm',\n                    active: true,\n                    maxBitrate: maxBitrates.medium,\n                    scaleResolutionDownBy: 2,\n                  },\n                  {\n                    rid: 'l',\n                    active: true,\n                    maxBitrate: maxBitrates.low,\n                    scaleResolutionDownBy: 4,\n                  },\n                ],\n              });\n            } else {\n              // Firefox-based RID, based on https://gist.github.com/voluntas/088bc3cc62094730647b\n              Janus.log('Enabling Simulcasting for Firefox (RID)');\n              transceiver = config.pc.addTransceiver(nt, {\n                direction: 'sendrecv',\n                streams: [config.myStream],\n              });\n              sender = transceiver ? transceiver.sender : null;\n              if (sender) {\n                let parameters = sender.getParameters();\n                if (!parameters) parameters = {};\n                let maxBitrates = getMaxBitrates(track.simulcastMaxBitrates);\n                parameters.encodings = track.sendEncodings || [\n                  { rid: 'h', active: true, maxBitrate: maxBitrates.high },\n                  {\n                    rid: 'm',\n                    active: true,\n                    maxBitrate: maxBitrates.medium,\n                    scaleResolutionDownBy: 2,\n                  },\n                  {\n                    rid: 'l',\n                    active: true,\n                    maxBitrate: maxBitrates.low,\n                    scaleResolutionDownBy: 4,\n                  },\n                ];\n                sender.setParameters(parameters);\n              }\n            }\n          } else {\n            Janus.log('Enabling SVC (' + track.svc + '):', nt);\n            transceiver = config.pc.addTransceiver(nt, {\n              direction: 'sendrecv',\n              streams: [config.myStream],\n              sendEncodings: [{ scalabilityMode: track.svc }],\n            });\n          }\n          if (!sender) sender = transceiver ? transceiver.sender : null;\n          // Check if we need to override some settings\n          if (track.codec) {\n            if (Janus.webRTCAdapter.browserDetails.browser === 'firefox') {\n              Janus.warn('setCodecPreferences not supported in Firefox, ignoring codec for track:', track);\n            } else if (typeof track.codec !== 'string') {\n              Janus.warn('Invalid codec value, ignoring for track:', track);\n            } else {\n              let mimeType = kind + '/' + track.codec.toLowerCase();\n              let codecs = RTCRtpReceiver.getCapabilities(kind).codecs.filter(function (codec) {\n                return codec.mimeType.toLowerCase() === mimeType;\n              });\n              if (!codecs || codecs.length === 0) {\n                Janus.warn('Codec not supported in this browser for this track, ignoring:', track);\n              } else if (transceiver) {\n                try {\n                  transceiver.setCodecPreferences(codecs);\n                } catch (err) {\n                  Janus.warn('Failed enforcing codec for this ' + kind + ' track:', err);\n                }\n              }\n            }\n          }\n          if (track.bitrate) {\n            // Override maximum bitrate\n            if (track.simulcast || track.svc) {\n              Janus.warn('Ignoring bitrate for simulcast/SVC track, use sendEncodings for that');\n            } else if (isNaN(track.bitrate) || track.bitrate < 0) {\n              Janus.warn('Ignoring invalid bitrate for track:', track);\n            } else if (sender) {\n              let params = sender.getParameters();\n              if (!params || !params.encodings || params.encodings.length === 0) {\n                Janus.warn('No encodings in the sender parameters, ignoring bitrate for track:', track);\n              } else {\n                params.encodings[0].maxBitrate = track.bitrate;\n                await sender.setParameters(params);\n              }\n            }\n          }\n          if (kind === 'video' && track.framerate) {\n            // Override maximum framerate\n            if (track.simulcast || track.svc) {\n              Janus.warn('Ignoring framerate for simulcast/SVC track, use sendEncodings for that');\n            } else if (isNaN(track.framerate) || track.framerate < 0) {\n              Janus.warn('Ignoring invalid framerate for track:', track);\n            } else if (sender) {\n              let params = sender.getParameters();\n              if (!params || !params.encodings || params.encodings.length === 0) {\n                Janus.warn('No encodings in the sender parameters, ignoring framerate for track:', track);\n              } else {\n                params.encodings[0].maxFramerate = track.framerate;\n                await sender.setParameters(params);\n              }\n            }\n          }\n          // Check if insertable streams are involved\n          if (track.transforms) {\n            if (sender && track.transforms.sender) {\n              // There's a sender transform, set it on the transceiver sender\n              let senderStreams = null;\n              if (RTCRtpSender.prototype.createEncodedStreams) {\n                senderStreams = sender.createEncodedStreams();\n              } else if (\n                RTCRtpSender.prototype.createAudioEncodedStreams ||\n                RTCRtpSender.prototype.createEncodedVideoStreams\n              ) {\n                if (kind === 'audio') {\n                  senderStreams = sender.createEncodedAudioStreams();\n                } else if (kind === 'video') {\n                  senderStreams = sender.createEncodedVideoStreams();\n                }\n              }\n              if (senderStreams) {\n                Janus.log('Insertable Streams sender transform:', senderStreams);\n                if (senderStreams.readableStream && senderStreams.writableStream) {\n                  senderStreams.readableStream\n                    .pipeThrough(track.transforms.sender)\n                    .pipeTo(senderStreams.writableStream);\n                } else if (senderStreams.readable && senderStreams.writable) {\n                  senderStreams.readable.pipeThrough(track.transforms.sender).pipeTo(senderStreams.writable);\n                }\n              }\n            }\n            if (transceiver && transceiver.receiver && track.transforms.receiver) {\n              // There's a receiver transform, set it on the transceiver receiver\n              let receiverStreams = null;\n              if (RTCRtpReceiver.prototype.createEncodedStreams) {\n                receiverStreams = transceiver.receiver.createEncodedStreams();\n              } else if (\n                RTCRtpReceiver.prototype.createAudioEncodedStreams ||\n                RTCRtpReceiver.prototype.createEncodedVideoStreams\n              ) {\n                if (kind === 'audio') {\n                  receiverStreams = transceiver.receiver.createEncodedAudioStreams();\n                } else if (kind === 'video') {\n                  receiverStreams = transceiver.receiver.createEncodedVideoStreams();\n                }\n              }\n              if (receiverStreams) {\n                Janus.log('Insertable Streams receiver transform:', receiverStreams);\n                if (receiverStreams.readableStream && receiverStreams.writableStream) {\n                  receiverStreams.readableStream\n                    .pipeThrough(track.transforms.receiver)\n                    .pipeTo(receiverStreams.writableStream);\n                } else if (receiverStreams.readable && receiverStreams.writable) {\n                  receiverStreams.readable.pipeThrough(track.transforms.receiver).pipeTo(receiverStreams.writable);\n                }\n              }\n            }\n          }\n        }\n        if (nt && track.dontStop === true) nt.dontStop = true;\n      } else if (track.recv && !transceiver) {\n        // Maybe a new recvonly track\n        transceiver = config.pc.addTransceiver(kind);\n        if (transceiver) {\n          // Check if we need to override some settings\n          if (track.codec) {\n            if (Janus.webRTCAdapter.browserDetails.browser === 'firefox') {\n              Janus.warn('setCodecPreferences not supported in Firefox, ignoring codec for track:', track);\n            } else if (typeof track.codec !== 'string') {\n              Janus.warn('Invalid codec value, ignoring for track:', track);\n            } else {\n              let mimeType = kind + '/' + track.codec.toLowerCase();\n              let codecs = RTCRtpReceiver.getCapabilities(kind).codecs.filter(function (codec) {\n                return codec.mimeType.toLowerCase() === mimeType;\n              });\n              if (!codecs || codecs.length === 0) {\n                Janus.warn('Codec not supported in this browser for this track, ignoring:', track);\n              } else {\n                try {\n                  transceiver.setCodecPreferences(codecs);\n                } catch (err) {\n                  Janus.warn('Failed enforcing codec for this ' + kind + ' track:', err);\n                }\n              }\n            }\n          }\n          // Check if insertable streams are involved\n          if (transceiver.receiver && track.transforms && track.transforms.receiver) {\n            // There's a receiver transform, set it on the transceiver receiver\n            let receiverStreams = null;\n            if (RTCRtpReceiver.prototype.createEncodedStreams) {\n              receiverStreams = transceiver.receiver.createEncodedStreams();\n            } else if (\n              RTCRtpReceiver.prototype.createAudioEncodedStreams ||\n              RTCRtpReceiver.prototype.createEncodedVideoStreams\n            ) {\n              if (kind === 'audio') {\n                receiverStreams = transceiver.receiver.createEncodedAudioStreams();\n              } else if (kind === 'video') {\n                receiverStreams = transceiver.receiver.createEncodedVideoStreams();\n              }\n            }\n            if (receiverStreams) {\n              Janus.log('Insertable Streams receiver transform:', receiverStreams);\n              if (receiverStreams.readableStream && receiverStreams.writableStream) {\n                receiverStreams.readableStream\n                  .pipeThrough(track.transforms.receiver)\n                  .pipeTo(receiverStreams.writableStream);\n              } else if (receiverStreams.readable && receiverStreams.writable) {\n                receiverStreams.readable.pipeThrough(track.transforms.receiver).pipeTo(receiverStreams.writable);\n              }\n            }\n          }\n        }\n      }\n      // Get rid of the old track\n      // FIXME We should probably do this *before* capturing the new\n      // track, since this prevents, for instance, just changing the\n      // resolution of the same webcam we're capturing already (the\n      // existing resolution would be returned, or an overconstrained\n      // error). On the other end, closing the track before we capture\n      // the new device means we'd end up with a period of time where\n      // no video is sent (changing device takes some time), and\n      // media would be stopped entirely in case capturing the new\n      // device results in an error. To keep things simpler, we're\n      // doing it after: we can make this configurable in the future.\n      if (trackId && config.myStream) {\n        let rt = null;\n        if (kind === 'audio' && config.myStream.getAudioTracks() && config.myStream.getAudioTracks().length) {\n          for (let t of config.myStream.getAudioTracks()) {\n            if (t.id === trackId) {\n              rt = t;\n              Janus.log('Removing audio track:', rt);\n            }\n          }\n        } else if (kind === 'video' && config.myStream.getVideoTracks() && config.myStream.getVideoTracks().length) {\n          for (let t of config.myStream.getVideoTracks()) {\n            if (t.id === trackId) {\n              rt = t;\n              Janus.log('Removing video track:', rt);\n            }\n          }\n        }\n        if (rt) {\n          // Remove the track and notify the application\n          try {\n            config.myStream.removeTrack(rt);\n            pluginHandle.onlocaltrack(rt, false);\n          } catch (e) {\n            Janus.error('Error calling onlocaltrack on removal for renegotiation', e);\n          }\n          // Close the old track (unless we've been asked not to)\n          if (rt.dontStop !== true) {\n            try {\n              rt.stop();\n            } catch (e) { }\n          }\n        }\n      }\n      if (nt) {\n        // FIXME Add the new track locally\n        config.myStream.addTrack(nt);\n        // Notify the application about the new local track, if any\n        nt.onended = function (ev) {\n          Janus.log('Local track removed:', ev);\n          try {\n            pluginHandle.onlocaltrack(ev.target, false);\n          } catch (e) {\n            Janus.error('Error calling onlocaltrack following end', e);\n          }\n        };\n        try {\n          pluginHandle.onlocaltrack(nt, true);\n        } catch (e) {\n          Janus.error('Error calling onlocaltrack for track add', e);\n        }\n      }\n      // Update the direction of the transceiver\n      if (transceiver) {\n        let curdir = transceiver.direction,\n          newdir = null;\n        let send = nt && transceiver.sender.track,\n          recv = track.recv !== false && transceiver.receiver.track;\n        if (send && recv) newdir = 'sendrecv';\n        else if (send && !recv) newdir = 'sendonly';\n        else if (!send && recv) newdir = 'recvonly';\n        else if (!send && !recv) newdir = 'inactive';\n        if (newdir && newdir !== curdir) {\n          Janus.warn('Changing direction of transceiver to ' + newdir + ' (was ' + curdir + ')', track);\n          if (transceiver.setDirection) transceiver.setDirection(newdir);\n          else transceiver.direction = newdir;\n        }\n      }\n    }\n    if (openedConsentDialog) pluginHandle.consentDialog(false);\n  }\n\n  function getLocalTracks(handleId) {\n    let pluginHandle = pluginHandles[handleId];\n    if (!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle');\n      return null;\n    }\n    let config = pluginHandle.webrtcStuff;\n    if (!config.pc) {\n      Janus.warn('Invalid PeerConnection');\n      return null;\n    }\n    let tracks = [];\n    let transceivers = config.pc.getTransceivers();\n    for (let tr of transceivers) {\n      let track = null;\n      if (tr.sender && tr.sender.track) {\n        track = { mid: tr.mid };\n        track.type = tr.sender.track.kind;\n        track.id = tr.sender.track.id;\n        track.label = tr.sender.track.label;\n      }\n      if (track) tracks.push(track);\n    }\n    return tracks;\n  }\n\n  function getRemoteTracks(handleId) {\n    let pluginHandle = pluginHandles[handleId];\n    if (!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle');\n      return null;\n    }\n    let config = pluginHandle.webrtcStuff;\n    if (!config.pc) {\n      Janus.warn('Invalid PeerConnection');\n      return null;\n    }\n    let tracks = [];\n    let transceivers = config.pc.getTransceivers();\n    for (let tr of transceivers) {\n      let track = null;\n      if (tr.receiver && tr.receiver.track) {\n        track = { mid: tr.mid };\n        track.type = tr.receiver.track.kind;\n        track.id = tr.receiver.track.id;\n        track.label = tr.receiver.track.label;\n      }\n      if (track) tracks.push(track);\n    }\n    return tracks;\n  }\n\n  function getVolume(handleId, mid, remote, result) {\n    result = typeof result == 'function' ? result : Janus.noop;\n    let pluginHandle = pluginHandles[handleId];\n    if (!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle');\n      result(0);\n      return;\n    }\n    let stream = remote ? 'remote' : 'local';\n    let config = pluginHandle.webrtcStuff;\n    if (!config.volume[stream]) config.volume[stream] = { value: 0 };\n    // Start getting the volume, if audioLevel in getStats is supported (apparently\n    // they're only available in Chrome/Safari right now: https://webrtc-stats.callstats.io/)\n    if (\n      config.pc &&\n      config.pc.getStats &&\n      (Janus.webRTCAdapter.browserDetails.browser === 'chrome' ||\n        Janus.webRTCAdapter.browserDetails.browser === 'safari')\n    ) {\n      // Are we interested in a mid in particular?\n      let query = config.pc;\n      if (mid) {\n        let transceiver = config.pc.getTransceivers().find((t) => t.mid === mid && t.receiver.track.kind === 'audio');\n        if (!transceiver) {\n          Janus.warn('No audio transceiver with mid ' + mid);\n          result(0);\n          return;\n        }\n        if (remote && !transceiver.receiver) {\n          Janus.warn('Remote transceiver track unavailable');\n          result(0);\n          return;\n        } else if (!remote && !transceiver.sender) {\n          Janus.warn('Local transceiver track unavailable');\n          result(0);\n          return;\n        }\n        query = remote ? transceiver.receiver : transceiver.sender;\n      }\n      query.getStats().then(function (stats) {\n        stats.forEach(function (res) {\n          if (!res || res.kind !== 'audio') return;\n          if ((remote && !res.remoteSource) || (!remote && res.type !== 'media-source')) return;\n          result(res.audioLevel ? res.audioLevel : 0);\n        });\n      });\n      return config.volume[stream].value;\n    } else {\n      // audioInputLevel and audioOutputLevel seem only available in Chrome? audioLevel\n      // seems to be available on Chrome and Firefox, but they don't seem to work\n      Janus.warn('Getting the ' + stream + ' volume unsupported by browser');\n      result(0);\n      return;\n    }\n  }\n\n  function isMuted(handleId, mid, video) {\n    let pluginHandle = pluginHandles[handleId];\n    if (!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle');\n      return true;\n    }\n    let config = pluginHandle.webrtcStuff;\n    if (!config.pc) {\n      Janus.warn('Invalid PeerConnection');\n      return true;\n    }\n    if (!config.myStream) {\n      Janus.warn('Invalid local MediaStream');\n      return true;\n    }\n    if (video) {\n      // Check video track\n      if (!config.myStream.getVideoTracks() || config.myStream.getVideoTracks().length === 0) {\n        Janus.warn('No video track');\n        return true;\n      }\n      if (mid) {\n        let transceiver = config.pc.getTransceivers().find((t) => t.mid === mid && t.receiver.track.kind === 'video');\n        if (!transceiver) {\n          Janus.warn('No video transceiver with mid ' + mid);\n          return true;\n        }\n        if (!transceiver.sender || !transceiver.sender.track) {\n          Janus.warn('No video sender with mid ' + mid);\n          return true;\n        }\n        return !transceiver.sender.track.enabled;\n      } else {\n        return !config.myStream.getVideoTracks()[0].enabled;\n      }\n    } else {\n      // Check audio track\n      if (!config.myStream.getAudioTracks() || config.myStream.getAudioTracks().length === 0) {\n        Janus.warn('No audio track');\n        return true;\n      }\n      if (mid) {\n        let transceiver = config.pc.getTransceivers().find((t) => t.mid === mid && t.receiver.track.kind === 'audio');\n        if (!transceiver) {\n          Janus.warn('No audio transceiver with mid ' + mid);\n          return true;\n        }\n        if (!transceiver.sender || !transceiver.sender.track) {\n          Janus.warn('No audio sender with mid ' + mid);\n          return true;\n        }\n        return !transceiver.sender.track.enabled;\n      } else {\n        return !config.myStream.getAudioTracks()[0].enabled;\n      }\n    }\n  }\n\n  function mute(handleId, mid, video, mute) {\n    let pluginHandle = pluginHandles[handleId];\n    if (!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle');\n      return false;\n    }\n    let config = pluginHandle.webrtcStuff;\n    if (!config.pc) {\n      Janus.warn('Invalid PeerConnection');\n      return false;\n    }\n    if (!config.myStream) {\n      Janus.warn('Invalid local MediaStream');\n      return false;\n    }\n    if (video) {\n      // Mute/unmute video track\n      if (!config.myStream.getVideoTracks() || config.myStream.getVideoTracks().length === 0) {\n        Janus.warn('No video track');\n        return false;\n      }\n      if (mid) {\n        let transceiver = config.pc.getTransceivers().find((t) => t.mid === mid && t.receiver.track.kind === 'video');\n        if (!transceiver) {\n          Janus.warn('No video transceiver with mid ' + mid);\n          return false;\n        }\n        if (!transceiver.sender || !transceiver.sender.track) {\n          Janus.warn('No video sender with mid ' + mid);\n          return false;\n        }\n        transceiver.sender.track.enabled = mute ? false : true;\n      } else {\n        for (const videostream of config.myStream.getVideoTracks()) {\n          videostream.enabled = !mute;\n        }\n      }\n    } else {\n      // Mute/unmute audio track\n      if (!config.myStream.getAudioTracks() || config.myStream.getAudioTracks().length === 0) {\n        Janus.warn('No audio track');\n        return false;\n      }\n      if (mid) {\n        let transceiver = config.pc.getTransceivers().find((t) => t.mid === mid && t.receiver.track.kind === 'audio');\n        if (!transceiver) {\n          Janus.warn('No audio transceiver with mid ' + mid);\n          return false;\n        }\n        if (!transceiver.sender || !transceiver.sender.track) {\n          Janus.warn('No audio sender with mid ' + mid);\n          return false;\n        }\n        transceiver.sender.track.enabled = mute ? false : true;\n      } else {\n        for (const audiostream of config.myStream.getAudioTracks()) {\n          audiostream.enabled = !mute;\n        }\n      }\n    }\n    return true;\n  }\n\n  function getBitrate(handleId, mid) {\n    let pluginHandle = pluginHandles[handleId];\n    if (!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle');\n      return 'Invalid handle';\n    }\n    let config = pluginHandle.webrtcStuff;\n    if (!config.pc) return 'Invalid PeerConnection';\n    // Start getting the bitrate, if getStats is supported\n    if (config.pc.getStats) {\n      let query = config.pc;\n      let target = mid ? mid : 'default';\n      if (mid) {\n        let transceiver = config.pc.getTransceivers().find((t) => t.mid === mid && t.receiver.track.kind === 'video');\n        if (!transceiver) {\n          Janus.warn('No video transceiver with mid ' + mid);\n          return 'No video transceiver with mid ' + mid;\n        }\n        if (!transceiver.receiver) {\n          Janus.warn('No video receiver with mid ' + mid);\n          return 'No video receiver with mid ' + mid;\n        }\n        query = transceiver.receiver;\n      }\n      if (!config.bitrate[target]) {\n        config.bitrate[target] = {\n          timer: null,\n          bsnow: null,\n          bsbefore: null,\n          tsnow: null,\n          tsbefore: null,\n          value: '0 kbits/sec',\n        };\n      }\n      if (!config.bitrate[target].timer) {\n        Janus.log('Starting bitrate timer' + (mid ? ' for mid ' + mid : '') + ' (via getStats)');\n        config.bitrate[target].timer = setInterval(function () {\n          query.getStats().then(function (stats) {\n            stats.forEach(function (res) {\n              if (!res) return;\n              let inStats = false;\n              // Check if these are statistics on incoming media\n              if (\n                (res.mediaType === 'video' || res.id.toLowerCase().indexOf('video') > -1) &&\n                res.type === 'inbound-rtp' &&\n                res.id.indexOf('rtcp') < 0\n              ) {\n                // New stats\n                inStats = true;\n              } else if (\n                res.type == 'ssrc' &&\n                res.bytesReceived &&\n                (res.googCodecName === 'VP8' || res.googCodecName === '')\n              ) {\n                // Older Chromer versions\n                inStats = true;\n              }\n              // Parse stats now\n              if (inStats) {\n                config.bitrate[target].bsnow = res.bytesReceived;\n                config.bitrate[target].tsnow = res.timestamp;\n                if (config.bitrate[target].bsbefore === null || config.bitrate[target].tsbefore === null) {\n                  // Skip this round\n                  config.bitrate[target].bsbefore = config.bitrate[target].bsnow;\n                  config.bitrate[target].tsbefore = config.bitrate[target].tsnow;\n                } else {\n                  // Calculate bitrate\n                  let timePassed = config.bitrate[target].tsnow - config.bitrate[target].tsbefore;\n                  if (Janus.webRTCAdapter.browserDetails.browser === 'safari') timePassed = timePassed / 1000; // Apparently the timestamp is in microseconds, in Safari\n                  let bitRate = Math.round(\n                    ((config.bitrate[target].bsnow - config.bitrate[target].bsbefore) * 8) / timePassed\n                  );\n                  if (Janus.webRTCAdapter.browserDetails.browser === 'safari') bitRate = parseInt(bitRate / 1000);\n                  config.bitrate[target].value = bitRate + ' kbits/sec';\n                  //~ Janus.log(\"Estimated bitrate is \" + config.bitrate.value);\n                  config.bitrate[target].bsbefore = config.bitrate[target].bsnow;\n                  config.bitrate[target].tsbefore = config.bitrate[target].tsnow;\n                }\n              }\n            });\n          });\n        }, 1000);\n        return '0 kbits/sec'; // We don't have a bitrate value yet\n      }\n      return config.bitrate[target].value;\n    } else {\n      Janus.warn('Getting the video bitrate unsupported by browser');\n      return 'Feature unsupported by browser';\n    }\n  }\n\n  function setBitrate(handleId, mid, bitrate) {\n    let pluginHandle = pluginHandles[handleId];\n    if (!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle');\n      return;\n    }\n    let config = pluginHandle.webrtcStuff;\n    if (!config.pc) {\n      Janus.warn('Invalid PeerConnection');\n      return;\n    }\n    let transceiver = config.pc.getTransceivers().find((t) => t.mid === mid);\n    if (!transceiver) {\n      Janus.warn('No transceiver with mid', mid);\n      return;\n    }\n    if (!transceiver.sender) {\n      Janus.warn('No sender for transceiver with mid', mid);\n      return;\n    }\n    let params = transceiver.sender.getParameters();\n    if (!params || !params.encodings || params.encodings.length === 0) {\n      Janus.warn('No parameters encodings');\n    } else if (params.encodings.length > 1) {\n      Janus.warn('Ignoring bitrate for simulcast track, use sendEncodings for that');\n    } else if (isNaN(bitrate) || bitrate < 0) {\n      Janus.warn('Invalid bitrate (must be a positive integer)');\n    } else {\n      params.encodings[0].maxBitrate = bitrate;\n      transceiver.sender.setParameters(params);\n    }\n  }\n\n  function webrtcError(error) {\n    Janus.error('WebRTC error:', error);\n  }\n\n  function cleanupWebrtc(handleId, hangupRequest) {\n    Janus.log('Cleaning WebRTC stuff');\n    let pluginHandle = pluginHandles[handleId];\n    if (!pluginHandle) {\n      // Nothing to clean\n      return;\n    }\n    let config = pluginHandle.webrtcStuff;\n    if (config) {\n      if (hangupRequest === true) {\n        // Send a hangup request (we don't really care about the response)\n        let request = { janus: 'hangup', transaction: Janus.randomString(12) };\n        if (pluginHandle.token) request['token'] = pluginHandle.token;\n        if (apisecret) request['apisecret'] = apisecret;\n        Janus.debug('Sending hangup request (handle=' + handleId + '):');\n        Janus.debug(request);\n        if (websockets) {\n          request['session_id'] = sessionId;\n          request['handle_id'] = handleId;\n          ws.send(JSON.stringify(request));\n        } else {\n          Janus.httpAPICall(server + '/' + sessionId + '/' + handleId, {\n            verb: 'POST',\n            withCredentials: withCredentials,\n            body: request,\n          });\n        }\n      }\n      // Cleanup stack\n      if (config.volume) {\n        if (config.volume['local'] && config.volume['local'].timer) clearInterval(config.volume['local'].timer);\n        if (config.volume['remote'] && config.volume['remote'].timer) clearInterval(config.volume['remote'].timer);\n      }\n      for (let i in config.bitrate) {\n        if (config.bitrate[i].timer) clearInterval(config.bitrate[i].timer);\n      }\n      config.bitrate = {};\n      if (!config.streamExternal && config.myStream) {\n        Janus.log('Stopping local stream tracks');\n        Janus.stopAllTracks(config.myStream);\n      }\n      config.streamExternal = false;\n      config.myStream = null;\n      // Close PeerConnection\n      try {\n        config.pc.close();\n      } catch (e) {\n        // Do nothing\n      }\n      config.pc = null;\n      config.candidates = null;\n      config.mySdp = null;\n      config.remoteSdp = null;\n      config.iceDone = false;\n      config.dataChannel = {};\n      config.dtmfSender = null;\n      config.insertableStreams = false;\n    }\n    pluginHandle.oncleanup();\n  }\n\n  function isTrickleEnabled(trickle) {\n    Janus.debug('isTrickleEnabled:', trickle);\n    return trickle === false ? false : true;\n  }\n}\n\nmodule.exports = Janus;\n",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory();\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\troot.CryptoJS = factory();\n\t}\n}(this, function () {\n\n\t/*globals window, global, require*/\n\n\t/**\n\t * CryptoJS core components.\n\t */\n\tvar CryptoJS = CryptoJS || (function (Math, undefined) {\n\n\t    var crypto;\n\n\t    // Native crypto from window (Browser)\n\t    if (typeof window !== 'undefined' && window.crypto) {\n\t        crypto = window.crypto;\n\t    }\n\n\t    // Native crypto in web worker (Browser)\n\t    if (typeof self !== 'undefined' && self.crypto) {\n\t        crypto = self.crypto;\n\t    }\n\n\t    // Native crypto from worker\n\t    if (typeof globalThis !== 'undefined' && globalThis.crypto) {\n\t        crypto = globalThis.crypto;\n\t    }\n\n\t    // Native (experimental IE 11) crypto from window (Browser)\n\t    if (!crypto && typeof window !== 'undefined' && window.msCrypto) {\n\t        crypto = window.msCrypto;\n\t    }\n\n\t    // Native crypto from global (NodeJS)\n\t    if (!crypto && typeof global !== 'undefined' && global.crypto) {\n\t        crypto = global.crypto;\n\t    }\n\n\t    // Native crypto import via require (NodeJS)\n\t    if (!crypto && typeof require === 'function') {\n\t        try {\n\t            crypto = require('crypto');\n\t        } catch (err) {}\n\t    }\n\n\t    /*\n\t     * Cryptographically secure pseudorandom number generator\n\t     *\n\t     * As Math.random() is cryptographically not safe to use\n\t     */\n\t    var cryptoSecureRandomInt = function () {\n\t        if (crypto) {\n\t            // Use getRandomValues method (Browser)\n\t            if (typeof crypto.getRandomValues === 'function') {\n\t                try {\n\t                    return crypto.getRandomValues(new Uint32Array(1))[0];\n\t                } catch (err) {}\n\t            }\n\n\t            // Use randomBytes method (NodeJS)\n\t            if (typeof crypto.randomBytes === 'function') {\n\t                try {\n\t                    return crypto.randomBytes(4).readInt32LE();\n\t                } catch (err) {}\n\t            }\n\t        }\n\n\t        throw new Error('Native crypto module could not be used to get secure random number.');\n\t    };\n\n\t    /*\n\t     * Local polyfill of Object.create\n\n\t     */\n\t    var create = Object.create || (function () {\n\t        function F() {}\n\n\t        return function (obj) {\n\t            var subtype;\n\n\t            F.prototype = obj;\n\n\t            subtype = new F();\n\n\t            F.prototype = null;\n\n\t            return subtype;\n\t        };\n\t    }());\n\n\t    /**\n\t     * CryptoJS namespace.\n\t     */\n\t    var C = {};\n\n\t    /**\n\t     * Library namespace.\n\t     */\n\t    var C_lib = C.lib = {};\n\n\t    /**\n\t     * Base object for prototypal inheritance.\n\t     */\n\t    var Base = C_lib.Base = (function () {\n\n\n\t        return {\n\t            /**\n\t             * Creates a new object that inherits from this object.\n\t             *\n\t             * @param {Object} overrides Properties to copy into the new object.\n\t             *\n\t             * @return {Object} The new object.\n\t             *\n\t             * @static\n\t             *\n\t             * @example\n\t             *\n\t             *     var MyType = CryptoJS.lib.Base.extend({\n\t             *         field: 'value',\n\t             *\n\t             *         method: function () {\n\t             *         }\n\t             *     });\n\t             */\n\t            extend: function (overrides) {\n\t                // Spawn\n\t                var subtype = create(this);\n\n\t                // Augment\n\t                if (overrides) {\n\t                    subtype.mixIn(overrides);\n\t                }\n\n\t                // Create default initializer\n\t                if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {\n\t                    subtype.init = function () {\n\t                        subtype.$super.init.apply(this, arguments);\n\t                    };\n\t                }\n\n\t                // Initializer's prototype is the subtype object\n\t                subtype.init.prototype = subtype;\n\n\t                // Reference supertype\n\t                subtype.$super = this;\n\n\t                return subtype;\n\t            },\n\n\t            /**\n\t             * Extends this object and runs the init method.\n\t             * Arguments to create() will be passed to init().\n\t             *\n\t             * @return {Object} The new object.\n\t             *\n\t             * @static\n\t             *\n\t             * @example\n\t             *\n\t             *     var instance = MyType.create();\n\t             */\n\t            create: function () {\n\t                var instance = this.extend();\n\t                instance.init.apply(instance, arguments);\n\n\t                return instance;\n\t            },\n\n\t            /**\n\t             * Initializes a newly created object.\n\t             * Override this method to add some logic when your objects are created.\n\t             *\n\t             * @example\n\t             *\n\t             *     var MyType = CryptoJS.lib.Base.extend({\n\t             *         init: function () {\n\t             *             // ...\n\t             *         }\n\t             *     });\n\t             */\n\t            init: function () {\n\t            },\n\n\t            /**\n\t             * Copies properties into this object.\n\t             *\n\t             * @param {Object} properties The properties to mix in.\n\t             *\n\t             * @example\n\t             *\n\t             *     MyType.mixIn({\n\t             *         field: 'value'\n\t             *     });\n\t             */\n\t            mixIn: function (properties) {\n\t                for (var propertyName in properties) {\n\t                    if (properties.hasOwnProperty(propertyName)) {\n\t                        this[propertyName] = properties[propertyName];\n\t                    }\n\t                }\n\n\t                // IE won't copy toString using the loop above\n\t                if (properties.hasOwnProperty('toString')) {\n\t                    this.toString = properties.toString;\n\t                }\n\t            },\n\n\t            /**\n\t             * Creates a copy of this object.\n\t             *\n\t             * @return {Object} The clone.\n\t             *\n\t             * @example\n\t             *\n\t             *     var clone = instance.clone();\n\t             */\n\t            clone: function () {\n\t                return this.init.prototype.extend(this);\n\t            }\n\t        };\n\t    }());\n\n\t    /**\n\t     * An array of 32-bit words.\n\t     *\n\t     * @property {Array} words The array of 32-bit words.\n\t     * @property {number} sigBytes The number of significant bytes in this word array.\n\t     */\n\t    var WordArray = C_lib.WordArray = Base.extend({\n\t        /**\n\t         * Initializes a newly created word array.\n\t         *\n\t         * @param {Array} words (Optional) An array of 32-bit words.\n\t         * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.lib.WordArray.create();\n\t         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\n\t         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\n\t         */\n\t        init: function (words, sigBytes) {\n\t            words = this.words = words || [];\n\n\t            if (sigBytes != undefined) {\n\t                this.sigBytes = sigBytes;\n\t            } else {\n\t                this.sigBytes = words.length * 4;\n\t            }\n\t        },\n\n\t        /**\n\t         * Converts this word array to a string.\n\t         *\n\t         * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\n\t         *\n\t         * @return {string} The stringified word array.\n\t         *\n\t         * @example\n\t         *\n\t         *     var string = wordArray + '';\n\t         *     var string = wordArray.toString();\n\t         *     var string = wordArray.toString(CryptoJS.enc.Utf8);\n\t         */\n\t        toString: function (encoder) {\n\t            return (encoder || Hex).stringify(this);\n\t        },\n\n\t        /**\n\t         * Concatenates a word array to this word array.\n\t         *\n\t         * @param {WordArray} wordArray The word array to append.\n\t         *\n\t         * @return {WordArray} This word array.\n\t         *\n\t         * @example\n\t         *\n\t         *     wordArray1.concat(wordArray2);\n\t         */\n\t        concat: function (wordArray) {\n\t            // Shortcuts\n\t            var thisWords = this.words;\n\t            var thatWords = wordArray.words;\n\t            var thisSigBytes = this.sigBytes;\n\t            var thatSigBytes = wordArray.sigBytes;\n\n\t            // Clamp excess bits\n\t            this.clamp();\n\n\t            // Concat\n\t            if (thisSigBytes % 4) {\n\t                // Copy one byte at a time\n\t                for (var i = 0; i < thatSigBytes; i++) {\n\t                    var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t                    thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\n\t                }\n\t            } else {\n\t                // Copy one word at a time\n\t                for (var j = 0; j < thatSigBytes; j += 4) {\n\t                    thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2];\n\t                }\n\t            }\n\t            this.sigBytes += thatSigBytes;\n\n\t            // Chainable\n\t            return this;\n\t        },\n\n\t        /**\n\t         * Removes insignificant bits.\n\t         *\n\t         * @example\n\t         *\n\t         *     wordArray.clamp();\n\t         */\n\t        clamp: function () {\n\t            // Shortcuts\n\t            var words = this.words;\n\t            var sigBytes = this.sigBytes;\n\n\t            // Clamp\n\t            words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\n\t            words.length = Math.ceil(sigBytes / 4);\n\t        },\n\n\t        /**\n\t         * Creates a copy of this word array.\n\t         *\n\t         * @return {WordArray} The clone.\n\t         *\n\t         * @example\n\t         *\n\t         *     var clone = wordArray.clone();\n\t         */\n\t        clone: function () {\n\t            var clone = Base.clone.call(this);\n\t            clone.words = this.words.slice(0);\n\n\t            return clone;\n\t        },\n\n\t        /**\n\t         * Creates a word array filled with random bytes.\n\t         *\n\t         * @param {number} nBytes The number of random bytes to generate.\n\t         *\n\t         * @return {WordArray} The random word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.lib.WordArray.random(16);\n\t         */\n\t        random: function (nBytes) {\n\t            var words = [];\n\n\t            for (var i = 0; i < nBytes; i += 4) {\n\t                words.push(cryptoSecureRandomInt());\n\t            }\n\n\t            return new WordArray.init(words, nBytes);\n\t        }\n\t    });\n\n\t    /**\n\t     * Encoder namespace.\n\t     */\n\t    var C_enc = C.enc = {};\n\n\t    /**\n\t     * Hex encoding strategy.\n\t     */\n\t    var Hex = C_enc.Hex = {\n\t        /**\n\t         * Converts a word array to a hex string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The hex string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var hexString = CryptoJS.enc.Hex.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            // Shortcuts\n\t            var words = wordArray.words;\n\t            var sigBytes = wordArray.sigBytes;\n\n\t            // Convert\n\t            var hexChars = [];\n\t            for (var i = 0; i < sigBytes; i++) {\n\t                var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t                hexChars.push((bite >>> 4).toString(16));\n\t                hexChars.push((bite & 0x0f).toString(16));\n\t            }\n\n\t            return hexChars.join('');\n\t        },\n\n\t        /**\n\t         * Converts a hex string to a word array.\n\t         *\n\t         * @param {string} hexStr The hex string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Hex.parse(hexString);\n\t         */\n\t        parse: function (hexStr) {\n\t            // Shortcut\n\t            var hexStrLength = hexStr.length;\n\n\t            // Convert\n\t            var words = [];\n\t            for (var i = 0; i < hexStrLength; i += 2) {\n\t                words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\n\t            }\n\n\t            return new WordArray.init(words, hexStrLength / 2);\n\t        }\n\t    };\n\n\t    /**\n\t     * Latin1 encoding strategy.\n\t     */\n\t    var Latin1 = C_enc.Latin1 = {\n\t        /**\n\t         * Converts a word array to a Latin1 string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The Latin1 string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            // Shortcuts\n\t            var words = wordArray.words;\n\t            var sigBytes = wordArray.sigBytes;\n\n\t            // Convert\n\t            var latin1Chars = [];\n\t            for (var i = 0; i < sigBytes; i++) {\n\t                var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t                latin1Chars.push(String.fromCharCode(bite));\n\t            }\n\n\t            return latin1Chars.join('');\n\t        },\n\n\t        /**\n\t         * Converts a Latin1 string to a word array.\n\t         *\n\t         * @param {string} latin1Str The Latin1 string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\n\t         */\n\t        parse: function (latin1Str) {\n\t            // Shortcut\n\t            var latin1StrLength = latin1Str.length;\n\n\t            // Convert\n\t            var words = [];\n\t            for (var i = 0; i < latin1StrLength; i++) {\n\t                words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\n\t            }\n\n\t            return new WordArray.init(words, latin1StrLength);\n\t        }\n\t    };\n\n\t    /**\n\t     * UTF-8 encoding strategy.\n\t     */\n\t    var Utf8 = C_enc.Utf8 = {\n\t        /**\n\t         * Converts a word array to a UTF-8 string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The UTF-8 string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            try {\n\t                return decodeURIComponent(escape(Latin1.stringify(wordArray)));\n\t            } catch (e) {\n\t                throw new Error('Malformed UTF-8 data');\n\t            }\n\t        },\n\n\t        /**\n\t         * Converts a UTF-8 string to a word array.\n\t         *\n\t         * @param {string} utf8Str The UTF-8 string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\n\t         */\n\t        parse: function (utf8Str) {\n\t            return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\n\t        }\n\t    };\n\n\t    /**\n\t     * Abstract buffered block algorithm template.\n\t     *\n\t     * The property blockSize must be implemented in a concrete subtype.\n\t     *\n\t     * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0\n\t     */\n\t    var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({\n\t        /**\n\t         * Resets this block algorithm's data buffer to its initial state.\n\t         *\n\t         * @example\n\t         *\n\t         *     bufferedBlockAlgorithm.reset();\n\t         */\n\t        reset: function () {\n\t            // Initial values\n\t            this._data = new WordArray.init();\n\t            this._nDataBytes = 0;\n\t        },\n\n\t        /**\n\t         * Adds new data to this block algorithm's buffer.\n\t         *\n\t         * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.\n\t         *\n\t         * @example\n\t         *\n\t         *     bufferedBlockAlgorithm._append('data');\n\t         *     bufferedBlockAlgorithm._append(wordArray);\n\t         */\n\t        _append: function (data) {\n\t            // Convert string to WordArray, else assume WordArray already\n\t            if (typeof data == 'string') {\n\t                data = Utf8.parse(data);\n\t            }\n\n\t            // Append\n\t            this._data.concat(data);\n\t            this._nDataBytes += data.sigBytes;\n\t        },\n\n\t        /**\n\t         * Processes available data blocks.\n\t         *\n\t         * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\n\t         *\n\t         * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\n\t         *\n\t         * @return {WordArray} The processed data.\n\t         *\n\t         * @example\n\t         *\n\t         *     var processedData = bufferedBlockAlgorithm._process();\n\t         *     var processedData = bufferedBlockAlgorithm._process(!!'flush');\n\t         */\n\t        _process: function (doFlush) {\n\t            var processedWords;\n\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\t            var dataSigBytes = data.sigBytes;\n\t            var blockSize = this.blockSize;\n\t            var blockSizeBytes = blockSize * 4;\n\n\t            // Count blocks ready\n\t            var nBlocksReady = dataSigBytes / blockSizeBytes;\n\t            if (doFlush) {\n\t                // Round up to include partial blocks\n\t                nBlocksReady = Math.ceil(nBlocksReady);\n\t            } else {\n\t                // Round down to include only full blocks,\n\t                // less the number of blocks that must remain in the buffer\n\t                nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\n\t            }\n\n\t            // Count words ready\n\t            var nWordsReady = nBlocksReady * blockSize;\n\n\t            // Count bytes ready\n\t            var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\n\n\t            // Process blocks\n\t            if (nWordsReady) {\n\t                for (var offset = 0; offset < nWordsReady; offset += blockSize) {\n\t                    // Perform concrete-algorithm logic\n\t                    this._doProcessBlock(dataWords, offset);\n\t                }\n\n\t                // Remove processed words\n\t                processedWords = dataWords.splice(0, nWordsReady);\n\t                data.sigBytes -= nBytesReady;\n\t            }\n\n\t            // Return processed words\n\t            return new WordArray.init(processedWords, nBytesReady);\n\t        },\n\n\t        /**\n\t         * Creates a copy of this object.\n\t         *\n\t         * @return {Object} The clone.\n\t         *\n\t         * @example\n\t         *\n\t         *     var clone = bufferedBlockAlgorithm.clone();\n\t         */\n\t        clone: function () {\n\t            var clone = Base.clone.call(this);\n\t            clone._data = this._data.clone();\n\n\t            return clone;\n\t        },\n\n\t        _minBufferSize: 0\n\t    });\n\n\t    /**\n\t     * Abstract hasher template.\n\t     *\n\t     * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\n\t     */\n\t    var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({\n\t        /**\n\t         * Configuration options.\n\t         */\n\t        cfg: Base.extend(),\n\n\t        /**\n\t         * Initializes a newly created hasher.\n\t         *\n\t         * @param {Object} cfg (Optional) The configuration options to use for this hash computation.\n\t         *\n\t         * @example\n\t         *\n\t         *     var hasher = CryptoJS.algo.SHA256.create();\n\t         */\n\t        init: function (cfg) {\n\t            // Apply config defaults\n\t            this.cfg = this.cfg.extend(cfg);\n\n\t            // Set initial values\n\t            this.reset();\n\t        },\n\n\t        /**\n\t         * Resets this hasher to its initial state.\n\t         *\n\t         * @example\n\t         *\n\t         *     hasher.reset();\n\t         */\n\t        reset: function () {\n\t            // Reset data buffer\n\t            BufferedBlockAlgorithm.reset.call(this);\n\n\t            // Perform concrete-hasher logic\n\t            this._doReset();\n\t        },\n\n\t        /**\n\t         * Updates this hasher with a message.\n\t         *\n\t         * @param {WordArray|string} messageUpdate The message to append.\n\t         *\n\t         * @return {Hasher} This hasher.\n\t         *\n\t         * @example\n\t         *\n\t         *     hasher.update('message');\n\t         *     hasher.update(wordArray);\n\t         */\n\t        update: function (messageUpdate) {\n\t            // Append\n\t            this._append(messageUpdate);\n\n\t            // Update the hash\n\t            this._process();\n\n\t            // Chainable\n\t            return this;\n\t        },\n\n\t        /**\n\t         * Finalizes the hash computation.\n\t         * Note that the finalize operation is effectively a destructive, read-once operation.\n\t         *\n\t         * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t         *\n\t         * @return {WordArray} The hash.\n\t         *\n\t         * @example\n\t         *\n\t         *     var hash = hasher.finalize();\n\t         *     var hash = hasher.finalize('message');\n\t         *     var hash = hasher.finalize(wordArray);\n\t         */\n\t        finalize: function (messageUpdate) {\n\t            // Final message update\n\t            if (messageUpdate) {\n\t                this._append(messageUpdate);\n\t            }\n\n\t            // Perform concrete-hasher logic\n\t            var hash = this._doFinalize();\n\n\t            return hash;\n\t        },\n\n\t        blockSize: 512/32,\n\n\t        /**\n\t         * Creates a shortcut function to a hasher's object interface.\n\t         *\n\t         * @param {Hasher} hasher The hasher to create a helper for.\n\t         *\n\t         * @return {Function} The shortcut function.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\n\t         */\n\t        _createHelper: function (hasher) {\n\t            return function (message, cfg) {\n\t                return new hasher.init(cfg).finalize(message);\n\t            };\n\t        },\n\n\t        /**\n\t         * Creates a shortcut function to the HMAC's object interface.\n\t         *\n\t         * @param {Hasher} hasher The hasher to use in this HMAC helper.\n\t         *\n\t         * @return {Function} The shortcut function.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\n\t         */\n\t        _createHmacHelper: function (hasher) {\n\t            return function (message, key) {\n\t                return new C_algo.HMAC.init(hasher, key).finalize(message);\n\t            };\n\t        }\n\t    });\n\n\t    /**\n\t     * Algorithm namespace.\n\t     */\n\t    var C_algo = C.algo = {};\n\n\t    return C;\n\t}(Math));\n\n\n\treturn CryptoJS;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./sha1\"), require(\"./hmac\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./sha1\", \"./hmac\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\treturn CryptoJS.HmacSHA1;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./sha256\"), require(\"./hmac\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./sha256\", \"./hmac\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\treturn CryptoJS.HmacSHA256;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var Base = C_lib.Base;\n\t    var C_enc = C.enc;\n\t    var Utf8 = C_enc.Utf8;\n\t    var C_algo = C.algo;\n\n\t    /**\n\t     * HMAC algorithm.\n\t     */\n\t    var HMAC = C_algo.HMAC = Base.extend({\n\t        /**\n\t         * Initializes a newly created HMAC.\n\t         *\n\t         * @param {Hasher} hasher The hash algorithm to use.\n\t         * @param {WordArray|string} key The secret key.\n\t         *\n\t         * @example\n\t         *\n\t         *     var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\n\t         */\n\t        init: function (hasher, key) {\n\t            // Init hasher\n\t            hasher = this._hasher = new hasher.init();\n\n\t            // Convert string to WordArray, else assume WordArray already\n\t            if (typeof key == 'string') {\n\t                key = Utf8.parse(key);\n\t            }\n\n\t            // Shortcuts\n\t            var hasherBlockSize = hasher.blockSize;\n\t            var hasherBlockSizeBytes = hasherBlockSize * 4;\n\n\t            // Allow arbitrary length keys\n\t            if (key.sigBytes > hasherBlockSizeBytes) {\n\t                key = hasher.finalize(key);\n\t            }\n\n\t            // Clamp excess bits\n\t            key.clamp();\n\n\t            // Clone key for inner and outer pads\n\t            var oKey = this._oKey = key.clone();\n\t            var iKey = this._iKey = key.clone();\n\n\t            // Shortcuts\n\t            var oKeyWords = oKey.words;\n\t            var iKeyWords = iKey.words;\n\n\t            // XOR keys with pad constants\n\t            for (var i = 0; i < hasherBlockSize; i++) {\n\t                oKeyWords[i] ^= 0x5c5c5c5c;\n\t                iKeyWords[i] ^= 0x36363636;\n\t            }\n\t            oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;\n\n\t            // Set initial values\n\t            this.reset();\n\t        },\n\n\t        /**\n\t         * Resets this HMAC to its initial state.\n\t         *\n\t         * @example\n\t         *\n\t         *     hmacHasher.reset();\n\t         */\n\t        reset: function () {\n\t            // Shortcut\n\t            var hasher = this._hasher;\n\n\t            // Reset\n\t            hasher.reset();\n\t            hasher.update(this._iKey);\n\t        },\n\n\t        /**\n\t         * Updates this HMAC with a message.\n\t         *\n\t         * @param {WordArray|string} messageUpdate The message to append.\n\t         *\n\t         * @return {HMAC} This HMAC instance.\n\t         *\n\t         * @example\n\t         *\n\t         *     hmacHasher.update('message');\n\t         *     hmacHasher.update(wordArray);\n\t         */\n\t        update: function (messageUpdate) {\n\t            this._hasher.update(messageUpdate);\n\n\t            // Chainable\n\t            return this;\n\t        },\n\n\t        /**\n\t         * Finalizes the HMAC computation.\n\t         * Note that the finalize operation is effectively a destructive, read-once operation.\n\t         *\n\t         * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t         *\n\t         * @return {WordArray} The HMAC.\n\t         *\n\t         * @example\n\t         *\n\t         *     var hmac = hmacHasher.finalize();\n\t         *     var hmac = hmacHasher.finalize('message');\n\t         *     var hmac = hmacHasher.finalize(wordArray);\n\t         */\n\t        finalize: function (messageUpdate) {\n\t            // Shortcut\n\t            var hasher = this._hasher;\n\n\t            // Compute HMAC\n\t            var innerHash = hasher.finalize(messageUpdate);\n\t            hasher.reset();\n\t            var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\n\n\t            return hmac;\n\t        }\n\t    });\n\t}());\n\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var Hasher = C_lib.Hasher;\n\t    var C_algo = C.algo;\n\n\t    // Reusable object\n\t    var W = [];\n\n\t    /**\n\t     * SHA-1 hash algorithm.\n\t     */\n\t    var SHA1 = C_algo.SHA1 = Hasher.extend({\n\t        _doReset: function () {\n\t            this._hash = new WordArray.init([\n\t                0x67452301, 0xefcdab89,\n\t                0x98badcfe, 0x10325476,\n\t                0xc3d2e1f0\n\t            ]);\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Shortcut\n\t            var H = this._hash.words;\n\n\t            // Working variables\n\t            var a = H[0];\n\t            var b = H[1];\n\t            var c = H[2];\n\t            var d = H[3];\n\t            var e = H[4];\n\n\t            // Computation\n\t            for (var i = 0; i < 80; i++) {\n\t                if (i < 16) {\n\t                    W[i] = M[offset + i] | 0;\n\t                } else {\n\t                    var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];\n\t                    W[i] = (n << 1) | (n >>> 31);\n\t                }\n\n\t                var t = ((a << 5) | (a >>> 27)) + e + W[i];\n\t                if (i < 20) {\n\t                    t += ((b & c) | (~b & d)) + 0x5a827999;\n\t                } else if (i < 40) {\n\t                    t += (b ^ c ^ d) + 0x6ed9eba1;\n\t                } else if (i < 60) {\n\t                    t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;\n\t                } else /* if (i < 80) */ {\n\t                    t += (b ^ c ^ d) - 0x359d3e2a;\n\t                }\n\n\t                e = d;\n\t                d = c;\n\t                c = (b << 30) | (b >>> 2);\n\t                b = a;\n\t                a = t;\n\t            }\n\n\t            // Intermediate hash value\n\t            H[0] = (H[0] + a) | 0;\n\t            H[1] = (H[1] + b) | 0;\n\t            H[2] = (H[2] + c) | 0;\n\t            H[3] = (H[3] + d) | 0;\n\t            H[4] = (H[4] + e) | 0;\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\n\t            var nBitsTotal = this._nDataBytes * 8;\n\t            var nBitsLeft = data.sigBytes * 8;\n\n\t            // Add padding\n\t            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\n\t            data.sigBytes = dataWords.length * 4;\n\n\t            // Hash final blocks\n\t            this._process();\n\n\t            // Return final computed hash\n\t            return this._hash;\n\t        },\n\n\t        clone: function () {\n\t            var clone = Hasher.clone.call(this);\n\t            clone._hash = this._hash.clone();\n\n\t            return clone;\n\t        }\n\t    });\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.SHA1('message');\n\t     *     var hash = CryptoJS.SHA1(wordArray);\n\t     */\n\t    C.SHA1 = Hasher._createHelper(SHA1);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacSHA1(message, key);\n\t     */\n\t    C.HmacSHA1 = Hasher._createHmacHelper(SHA1);\n\t}());\n\n\n\treturn CryptoJS.SHA1;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function (Math) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var Hasher = C_lib.Hasher;\n\t    var C_algo = C.algo;\n\n\t    // Initialization and round constants tables\n\t    var H = [];\n\t    var K = [];\n\n\t    // Compute constants\n\t    (function () {\n\t        function isPrime(n) {\n\t            var sqrtN = Math.sqrt(n);\n\t            for (var factor = 2; factor <= sqrtN; factor++) {\n\t                if (!(n % factor)) {\n\t                    return false;\n\t                }\n\t            }\n\n\t            return true;\n\t        }\n\n\t        function getFractionalBits(n) {\n\t            return ((n - (n | 0)) * 0x100000000) | 0;\n\t        }\n\n\t        var n = 2;\n\t        var nPrime = 0;\n\t        while (nPrime < 64) {\n\t            if (isPrime(n)) {\n\t                if (nPrime < 8) {\n\t                    H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));\n\t                }\n\t                K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));\n\n\t                nPrime++;\n\t            }\n\n\t            n++;\n\t        }\n\t    }());\n\n\t    // Reusable object\n\t    var W = [];\n\n\t    /**\n\t     * SHA-256 hash algorithm.\n\t     */\n\t    var SHA256 = C_algo.SHA256 = Hasher.extend({\n\t        _doReset: function () {\n\t            this._hash = new WordArray.init(H.slice(0));\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Shortcut\n\t            var H = this._hash.words;\n\n\t            // Working variables\n\t            var a = H[0];\n\t            var b = H[1];\n\t            var c = H[2];\n\t            var d = H[3];\n\t            var e = H[4];\n\t            var f = H[5];\n\t            var g = H[6];\n\t            var h = H[7];\n\n\t            // Computation\n\t            for (var i = 0; i < 64; i++) {\n\t                if (i < 16) {\n\t                    W[i] = M[offset + i] | 0;\n\t                } else {\n\t                    var gamma0x = W[i - 15];\n\t                    var gamma0  = ((gamma0x << 25) | (gamma0x >>> 7))  ^\n\t                                  ((gamma0x << 14) | (gamma0x >>> 18)) ^\n\t                                   (gamma0x >>> 3);\n\n\t                    var gamma1x = W[i - 2];\n\t                    var gamma1  = ((gamma1x << 15) | (gamma1x >>> 17)) ^\n\t                                  ((gamma1x << 13) | (gamma1x >>> 19)) ^\n\t                                   (gamma1x >>> 10);\n\n\t                    W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];\n\t                }\n\n\t                var ch  = (e & f) ^ (~e & g);\n\t                var maj = (a & b) ^ (a & c) ^ (b & c);\n\n\t                var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));\n\t                var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7)  | (e >>> 25));\n\n\t                var t1 = h + sigma1 + ch + K[i] + W[i];\n\t                var t2 = sigma0 + maj;\n\n\t                h = g;\n\t                g = f;\n\t                f = e;\n\t                e = (d + t1) | 0;\n\t                d = c;\n\t                c = b;\n\t                b = a;\n\t                a = (t1 + t2) | 0;\n\t            }\n\n\t            // Intermediate hash value\n\t            H[0] = (H[0] + a) | 0;\n\t            H[1] = (H[1] + b) | 0;\n\t            H[2] = (H[2] + c) | 0;\n\t            H[3] = (H[3] + d) | 0;\n\t            H[4] = (H[4] + e) | 0;\n\t            H[5] = (H[5] + f) | 0;\n\t            H[6] = (H[6] + g) | 0;\n\t            H[7] = (H[7] + h) | 0;\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\n\t            var nBitsTotal = this._nDataBytes * 8;\n\t            var nBitsLeft = data.sigBytes * 8;\n\n\t            // Add padding\n\t            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\n\t            data.sigBytes = dataWords.length * 4;\n\n\t            // Hash final blocks\n\t            this._process();\n\n\t            // Return final computed hash\n\t            return this._hash;\n\t        },\n\n\t        clone: function () {\n\t            var clone = Hasher.clone.call(this);\n\t            clone._hash = this._hash.clone();\n\n\t            return clone;\n\t        }\n\t    });\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.SHA256('message');\n\t     *     var hash = CryptoJS.SHA256(wordArray);\n\t     */\n\t    C.SHA256 = Hasher._createHelper(SHA256);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacSHA256(message, key);\n\t     */\n\t    C.HmacSHA256 = Hasher._createHmacHelper(SHA256);\n\t}(Math));\n\n\n\treturn CryptoJS.SHA256;\n\n}));","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n  ? R.apply\n  : function ReflectApply(target, receiver, args) {\n    return Function.prototype.apply.call(target, receiver, args);\n  }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n  ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n  ReflectOwnKeys = function ReflectOwnKeys(target) {\n    return Object.getOwnPropertyNames(target)\n      .concat(Object.getOwnPropertySymbols(target));\n  };\n} else {\n  ReflectOwnKeys = function ReflectOwnKeys(target) {\n    return Object.getOwnPropertyNames(target);\n  };\n}\n\nfunction ProcessEmitWarning(warning) {\n  if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n  return value !== value;\n}\n\nfunction EventEmitter() {\n  EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n  if (typeof listener !== 'function') {\n    throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n  }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n  enumerable: true,\n  get: function() {\n    return defaultMaxListeners;\n  },\n  set: function(arg) {\n    if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n      throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n    }\n    defaultMaxListeners = arg;\n  }\n});\n\nEventEmitter.init = function() {\n\n  if (this._events === undefined ||\n      this._events === Object.getPrototypeOf(this)._events) {\n    this._events = Object.create(null);\n    this._eventsCount = 0;\n  }\n\n  this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n  if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n    throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n  }\n  this._maxListeners = n;\n  return this;\n};\n\nfunction _getMaxListeners(that) {\n  if (that._maxListeners === undefined)\n    return EventEmitter.defaultMaxListeners;\n  return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n  return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n  var args = [];\n  for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n  var doError = (type === 'error');\n\n  var events = this._events;\n  if (events !== undefined)\n    doError = (doError && events.error === undefined);\n  else if (!doError)\n    return false;\n\n  // If there is no 'error' event listener then throw.\n  if (doError) {\n    var er;\n    if (args.length > 0)\n      er = args[0];\n    if (er instanceof Error) {\n      // Note: The comments on the `throw` lines are intentional, they show\n      // up in Node's output if this results in an unhandled exception.\n      throw er; // Unhandled 'error' event\n    }\n    // At least give some kind of context to the user\n    var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n    err.context = er;\n    throw err; // Unhandled 'error' event\n  }\n\n  var handler = events[type];\n\n  if (handler === undefined)\n    return false;\n\n  if (typeof handler === 'function') {\n    ReflectApply(handler, this, args);\n  } else {\n    var len = handler.length;\n    var listeners = arrayClone(handler, len);\n    for (var i = 0; i < len; ++i)\n      ReflectApply(listeners[i], this, args);\n  }\n\n  return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n  var m;\n  var events;\n  var existing;\n\n  checkListener(listener);\n\n  events = target._events;\n  if (events === undefined) {\n    events = target._events = Object.create(null);\n    target._eventsCount = 0;\n  } else {\n    // To avoid recursion in the case that type === \"newListener\"! Before\n    // adding it to the listeners, first emit \"newListener\".\n    if (events.newListener !== undefined) {\n      target.emit('newListener', type,\n                  listener.listener ? listener.listener : listener);\n\n      // Re-assign `events` because a newListener handler could have caused the\n      // this._events to be assigned to a new object\n      events = target._events;\n    }\n    existing = events[type];\n  }\n\n  if (existing === undefined) {\n    // Optimize the case of one listener. Don't need the extra array object.\n    existing = events[type] = listener;\n    ++target._eventsCount;\n  } else {\n    if (typeof existing === 'function') {\n      // Adding the second element, need to change to array.\n      existing = events[type] =\n        prepend ? [listener, existing] : [existing, listener];\n      // If we've already got an array, just append.\n    } else if (prepend) {\n      existing.unshift(listener);\n    } else {\n      existing.push(listener);\n    }\n\n    // Check for listener leak\n    m = _getMaxListeners(target);\n    if (m > 0 && existing.length > m && !existing.warned) {\n      existing.warned = true;\n      // No error code for this since it is a Warning\n      // eslint-disable-next-line no-restricted-syntax\n      var w = new Error('Possible EventEmitter memory leak detected. ' +\n                          existing.length + ' ' + String(type) + ' listeners ' +\n                          'added. Use emitter.setMaxListeners() to ' +\n                          'increase limit');\n      w.name = 'MaxListenersExceededWarning';\n      w.emitter = target;\n      w.type = type;\n      w.count = existing.length;\n      ProcessEmitWarning(w);\n    }\n  }\n\n  return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n  return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n    function prependListener(type, listener) {\n      return _addListener(this, type, listener, true);\n    };\n\nfunction onceWrapper() {\n  if (!this.fired) {\n    this.target.removeListener(this.type, this.wrapFn);\n    this.fired = true;\n    if (arguments.length === 0)\n      return this.listener.call(this.target);\n    return this.listener.apply(this.target, arguments);\n  }\n}\n\nfunction _onceWrap(target, type, listener) {\n  var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n  var wrapped = onceWrapper.bind(state);\n  wrapped.listener = listener;\n  state.wrapFn = wrapped;\n  return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n  checkListener(listener);\n  this.on(type, _onceWrap(this, type, listener));\n  return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n    function prependOnceListener(type, listener) {\n      checkListener(listener);\n      this.prependListener(type, _onceWrap(this, type, listener));\n      return this;\n    };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n    function removeListener(type, listener) {\n      var list, events, position, i, originalListener;\n\n      checkListener(listener);\n\n      events = this._events;\n      if (events === undefined)\n        return this;\n\n      list = events[type];\n      if (list === undefined)\n        return this;\n\n      if (list === listener || list.listener === listener) {\n        if (--this._eventsCount === 0)\n          this._events = Object.create(null);\n        else {\n          delete events[type];\n          if (events.removeListener)\n            this.emit('removeListener', type, list.listener || listener);\n        }\n      } else if (typeof list !== 'function') {\n        position = -1;\n\n        for (i = list.length - 1; i >= 0; i--) {\n          if (list[i] === listener || list[i].listener === listener) {\n            originalListener = list[i].listener;\n            position = i;\n            break;\n          }\n        }\n\n        if (position < 0)\n          return this;\n\n        if (position === 0)\n          list.shift();\n        else {\n          spliceOne(list, position);\n        }\n\n        if (list.length === 1)\n          events[type] = list[0];\n\n        if (events.removeListener !== undefined)\n          this.emit('removeListener', type, originalListener || listener);\n      }\n\n      return this;\n    };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n    function removeAllListeners(type) {\n      var listeners, events, i;\n\n      events = this._events;\n      if (events === undefined)\n        return this;\n\n      // not listening for removeListener, no need to emit\n      if (events.removeListener === undefined) {\n        if (arguments.length === 0) {\n          this._events = Object.create(null);\n          this._eventsCount = 0;\n        } else if (events[type] !== undefined) {\n          if (--this._eventsCount === 0)\n            this._events = Object.create(null);\n          else\n            delete events[type];\n        }\n        return this;\n      }\n\n      // emit removeListener for all listeners on all events\n      if (arguments.length === 0) {\n        var keys = Object.keys(events);\n        var key;\n        for (i = 0; i < keys.length; ++i) {\n          key = keys[i];\n          if (key === 'removeListener') continue;\n          this.removeAllListeners(key);\n        }\n        this.removeAllListeners('removeListener');\n        this._events = Object.create(null);\n        this._eventsCount = 0;\n        return this;\n      }\n\n      listeners = events[type];\n\n      if (typeof listeners === 'function') {\n        this.removeListener(type, listeners);\n      } else if (listeners !== undefined) {\n        // LIFO order\n        for (i = listeners.length - 1; i >= 0; i--) {\n          this.removeListener(type, listeners[i]);\n        }\n      }\n\n      return this;\n    };\n\nfunction _listeners(target, type, unwrap) {\n  var events = target._events;\n\n  if (events === undefined)\n    return [];\n\n  var evlistener = events[type];\n  if (evlistener === undefined)\n    return [];\n\n  if (typeof evlistener === 'function')\n    return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n  return unwrap ?\n    unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n  return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n  return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  if (typeof emitter.listenerCount === 'function') {\n    return emitter.listenerCount(type);\n  } else {\n    return listenerCount.call(emitter, type);\n  }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n  var events = this._events;\n\n  if (events !== undefined) {\n    var evlistener = events[type];\n\n    if (typeof evlistener === 'function') {\n      return 1;\n    } else if (evlistener !== undefined) {\n      return evlistener.length;\n    }\n  }\n\n  return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n  return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n  var copy = new Array(n);\n  for (var i = 0; i < n; ++i)\n    copy[i] = arr[i];\n  return copy;\n}\n\nfunction spliceOne(list, index) {\n  for (; index + 1 < list.length; index++)\n    list[index] = list[index + 1];\n  list.pop();\n}\n\nfunction unwrapListeners(arr) {\n  var ret = new Array(arr.length);\n  for (var i = 0; i < ret.length; ++i) {\n    ret[i] = arr[i].listener || arr[i];\n  }\n  return ret;\n}\n\nfunction once(emitter, name) {\n  return new Promise(function (resolve, reject) {\n    function errorListener(err) {\n      emitter.removeListener(name, resolver);\n      reject(err);\n    }\n\n    function resolver() {\n      if (typeof emitter.removeListener === 'function') {\n        emitter.removeListener('error', errorListener);\n      }\n      resolve([].slice.call(arguments));\n    };\n\n    eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n    if (name !== 'error') {\n      addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n    }\n  });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n  if (typeof emitter.on === 'function') {\n    eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n  }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n  if (typeof emitter.on === 'function') {\n    if (flags.once) {\n      emitter.once(name, listener);\n    } else {\n      emitter.on(name, listener);\n    }\n  } else if (typeof emitter.addEventListener === 'function') {\n    // EventTarget does not have `error` event semantics like Node\n    // EventEmitters, we do not listen for `error` events here.\n    emitter.addEventListener(name, function wrapListener(arg) {\n      // IE does not have builtin `{ once: true }` support so we\n      // have to do it manually.\n      if (flags.once) {\n        emitter.removeEventListener(name, wrapListener);\n      }\n      listener(arg);\n    });\n  } else {\n    throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n  }\n}\n","/**\r\n * Copyright (c) 2014-present, Facebook, Inc.\r\n * All rights reserved.\r\n *\r\n * This source code is licensed under the BSD-style license found in the\r\n * LICENSE file in the root directory of this source tree. An additional grant\r\n * of patent rights can be found in the PATENTS file in the same directory.\r\n */\r\n\r\nvar fbemitter = {\r\n  EventEmitter: require('./lib/BaseEventEmitter'),\r\n  EmitterSubscription : require('./lib/EmitterSubscription')\r\n};\r\n\r\nmodule.exports = fbemitter;\r\n","\"use strict\";\n\n/**\r\n * Copyright (c) 2014-present, Facebook, Inc.\r\n * All rights reserved.\r\n *\r\n * This source code is licensed under the BSD-style license found in the\r\n * LICENSE file in the root directory of this source tree. An additional grant\r\n * of patent rights can be found in the PATENTS file in the same directory.\r\n *\r\n * @providesModule BaseEventEmitter\r\n * @typechecks\r\n */\nvar EmitterSubscription = require(\"./EmitterSubscription.js\");\n\nvar EventSubscriptionVendor = require(\"./EventSubscriptionVendor.js\");\n\nvar invariant = require(\"fbjs/lib/invariant\");\n\nvar emptyFunction = require(\"fbjs/lib/emptyFunction\");\n/**\r\n * @class BaseEventEmitter\r\n * @description\r\n * An EventEmitter is responsible for managing a set of listeners and publishing\r\n * events to them when it is told that such events happened. In addition to the\r\n * data for the given event it also sends a event control object which allows\r\n * the listeners/handlers to prevent the default behavior of the given event.\r\n *\r\n * The emitter is designed to be generic enough to support all the different\r\n * contexts in which one might want to emit events. It is a simple multicast\r\n * mechanism on top of which extra functionality can be composed. For example, a\r\n * more advanced emitter may use an EventHolder and EventFactory.\r\n */\n\n\nvar BaseEventEmitter = /*#__PURE__*/function () {\n  /**\r\n   * @constructor\r\n   */\n  function BaseEventEmitter() {\n    this._subscriber = new EventSubscriptionVendor();\n    this._currentSubscription = null;\n  }\n  /**\r\n   * Adds a listener to be invoked when events of the specified type are\r\n   * emitted. An optional calling context may be provided. The data arguments\r\n   * emitted will be passed to the listener function.\r\n   *\r\n   * TODO: Annotate the listener arg's type. This is tricky because listeners\r\n   *       can be invoked with varargs.\r\n   *\r\n   * @param {string} eventType - Name of the event to listen to\r\n   * @param {function} listener - Function to invoke when the specified event is\r\n   *   emitted\r\n   * @param {*} context - Optional context object to use when invoking the\r\n   *   listener\r\n   */\n\n\n  var _proto = BaseEventEmitter.prototype;\n\n  _proto.addListener = function addListener(eventType, listener, context) {\n    return this._subscriber.addSubscription(eventType, new EmitterSubscription(this._subscriber, listener, context));\n  }\n  /**\r\n   * Similar to addListener, except that the listener is removed after it is\r\n   * invoked once.\r\n   *\r\n   * @param {string} eventType - Name of the event to listen to\r\n   * @param {function} listener - Function to invoke only once when the\r\n   *   specified event is emitted\r\n   * @param {*} context - Optional context object to use when invoking the\r\n   *   listener\r\n   */\n  ;\n\n  _proto.once = function once(eventType, listener, context) {\n    var emitter = this;\n    return this.addListener(eventType, function () {\n      emitter.removeCurrentListener();\n      listener.apply(context, arguments);\n    });\n  }\n  /**\r\n   * Removes all of the registered listeners, including those registered as\r\n   * listener maps.\r\n   *\r\n   * @param {?string} eventType - Optional name of the event whose registered\r\n   *   listeners to remove\r\n   */\n  ;\n\n  _proto.removeAllListeners = function removeAllListeners(eventType) {\n    this._subscriber.removeAllSubscriptions(eventType);\n  }\n  /**\r\n   * Provides an API that can be called during an eventing cycle to remove the\r\n   * last listener that was invoked. This allows a developer to provide an event\r\n   * object that can remove the listener (or listener map) during the\r\n   * invocation.\r\n   *\r\n   * If it is called when not inside of an emitting cycle it will throw.\r\n   *\r\n   * @throws {Error} When called not during an eventing cycle\r\n   *\r\n   * @example\r\n   *   var subscription = emitter.addListenerMap({\r\n   *     someEvent: function(data, event) {\r\n   *       console.log(data);\r\n   *       emitter.removeCurrentListener();\r\n   *     }\r\n   *   });\r\n   *\r\n   *   emitter.emit('someEvent', 'abc'); // logs 'abc'\r\n   *   emitter.emit('someEvent', 'def'); // does not log anything\r\n   */\n  ;\n\n  _proto.removeCurrentListener = function removeCurrentListener() {\n    !!!this._currentSubscription ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Not in an emitting cycle; there is no current subscription') : invariant(false) : void 0;\n\n    this._subscriber.removeSubscription(this._currentSubscription);\n  }\n  /**\r\n   * Returns an array of listeners that are currently registered for the given\r\n   * event.\r\n   *\r\n   * @param {string} eventType - Name of the event to query\r\n   * @return {array}\r\n   */\n  ;\n\n  _proto.listeners = function listeners(eventType)\n  /* TODO: Array<EventSubscription> */\n  {\n    var subscriptions = this._subscriber.getSubscriptionsForType(eventType);\n\n    return subscriptions ? subscriptions.filter(emptyFunction.thatReturnsTrue).map(function (subscription) {\n      return subscription.listener;\n    }) : [];\n  }\n  /**\r\n   * Emits an event of the given type with the given data. All handlers of that\r\n   * particular type will be notified.\r\n   *\r\n   * @param {string} eventType - Name of the event to emit\r\n   * @param {*} Arbitrary arguments to be passed to each registered listener\r\n   *\r\n   * @example\r\n   *   emitter.addListener('someEvent', function(message) {\r\n   *     console.log(message);\r\n   *   });\r\n   *\r\n   *   emitter.emit('someEvent', 'abc'); // logs 'abc'\r\n   */\n  ;\n\n  _proto.emit = function emit(eventType) {\n    var subscriptions = this._subscriber.getSubscriptionsForType(eventType);\n\n    if (subscriptions) {\n      var keys = Object.keys(subscriptions);\n\n      for (var ii = 0; ii < keys.length; ii++) {\n        var key = keys[ii];\n        var subscription = subscriptions[key]; // The subscription may have been removed during this event loop.\n\n        if (subscription) {\n          this._currentSubscription = subscription;\n\n          this.__emitToSubscription.apply(this, [subscription].concat(Array.prototype.slice.call(arguments)));\n        }\n      }\n\n      this._currentSubscription = null;\n    }\n  }\n  /**\r\n   * Provides a hook to override how the emitter emits an event to a specific\r\n   * subscription. This allows you to set up logging and error boundaries\r\n   * specific to your environment.\r\n   *\r\n   * @param {EmitterSubscription} subscription\r\n   * @param {string} eventType\r\n   * @param {*} Arbitrary arguments to be passed to each registered listener\r\n   */\n  ;\n\n  _proto.__emitToSubscription = function __emitToSubscription(subscription, eventType) {\n    var args = Array.prototype.slice.call(arguments, 2);\n    subscription.listener.apply(subscription.context, args);\n  };\n\n  return BaseEventEmitter;\n}();\n\nmodule.exports = BaseEventEmitter;","/**\r\n * Copyright (c) 2014-present, Facebook, Inc.\r\n * All rights reserved.\r\n *\r\n * This source code is licensed under the BSD-style license found in the\r\n * LICENSE file in the root directory of this source tree. An additional grant\r\n * of patent rights can be found in the PATENTS file in the same directory.\r\n *\r\n * @providesModule EmitterSubscription\r\n * @typechecks\r\n */\n'use strict';\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\nvar EventSubscription = require(\"./EventSubscription.js\");\n/**\r\n * EmitterSubscription represents a subscription with listener and context data.\r\n */\n\n\nvar EmitterSubscription = /*#__PURE__*/function (_EventSubscription) {\n  _inheritsLoose(EmitterSubscription, _EventSubscription);\n\n  /**\r\n   * @param {EventSubscriptionVendor} subscriber - The subscriber that controls\r\n   *   this subscription\r\n   * @param {function} listener - Function to invoke when the specified event is\r\n   *   emitted\r\n   * @param {*} context - Optional context object to use when invoking the\r\n   *   listener\r\n   */\n  function EmitterSubscription(subscriber, listener, context) {\n    var _this;\n\n    _this = _EventSubscription.call(this, subscriber) || this;\n    _this.listener = listener;\n    _this.context = context;\n    return _this;\n  }\n\n  return EmitterSubscription;\n}(EventSubscription);\n\nmodule.exports = EmitterSubscription;","/**\r\n * Copyright (c) 2014-present, Facebook, Inc.\r\n * All rights reserved.\r\n *\r\n * This source code is licensed under the BSD-style license found in the\r\n * LICENSE file in the root directory of this source tree. An additional grant\r\n * of patent rights can be found in the PATENTS file in the same directory.\r\n *\r\n * @providesModule EventSubscription\r\n * @typechecks\r\n */\n'use strict';\n/**\r\n * EventSubscription represents a subscription to a particular event. It can\r\n * remove its own subscription.\r\n */\n\nvar EventSubscription = /*#__PURE__*/function () {\n  /**\r\n   * @param {EventSubscriptionVendor} subscriber the subscriber that controls\r\n   *   this subscription.\r\n   */\n  function EventSubscription(subscriber) {\n    this.subscriber = subscriber;\n  }\n  /**\r\n   * Removes this subscription from the subscriber that controls it.\r\n   */\n\n\n  var _proto = EventSubscription.prototype;\n\n  _proto.remove = function remove() {\n    if (this.subscriber) {\n      this.subscriber.removeSubscription(this);\n      this.subscriber = null;\n    }\n  };\n\n  return EventSubscription;\n}();\n\nmodule.exports = EventSubscription;","/**\r\n * Copyright (c) 2014-present, Facebook, Inc.\r\n * All rights reserved.\r\n *\r\n * This source code is licensed under the BSD-style license found in the\r\n * LICENSE file in the root directory of this source tree. An additional grant\r\n * of patent rights can be found in the PATENTS file in the same directory.\r\n *\r\n * @providesModule EventSubscriptionVendor\r\n * @typechecks\r\n */\n'use strict';\n\nvar invariant = require(\"fbjs/lib/invariant\");\n/**\r\n * EventSubscriptionVendor stores a set of EventSubscriptions that are\r\n * subscribed to a particular event type.\r\n */\n\n\nvar EventSubscriptionVendor = /*#__PURE__*/function () {\n  function EventSubscriptionVendor() {\n    this._subscriptionsForType = {};\n    this._currentSubscription = null;\n  }\n  /**\r\n   * Adds a subscription keyed by an event type.\r\n   *\r\n   * @param {string} eventType\r\n   * @param {EventSubscription} subscription\r\n   */\n\n\n  var _proto = EventSubscriptionVendor.prototype;\n\n  _proto.addSubscription = function addSubscription(eventType, subscription) {\n    !(subscription.subscriber === this) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'The subscriber of the subscription is incorrectly set.') : invariant(false) : void 0;\n\n    if (!this._subscriptionsForType[eventType]) {\n      this._subscriptionsForType[eventType] = [];\n    }\n\n    var key = this._subscriptionsForType[eventType].length;\n\n    this._subscriptionsForType[eventType].push(subscription);\n\n    subscription.eventType = eventType;\n    subscription.key = key;\n    return subscription;\n  }\n  /**\r\n   * Removes a bulk set of the subscriptions.\r\n   *\r\n   * @param {?string} eventType - Optional name of the event type whose\r\n   *   registered supscriptions to remove, if null remove all subscriptions.\r\n   */\n  ;\n\n  _proto.removeAllSubscriptions = function removeAllSubscriptions(eventType) {\n    if (eventType === undefined) {\n      this._subscriptionsForType = {};\n    } else {\n      delete this._subscriptionsForType[eventType];\n    }\n  }\n  /**\r\n   * Removes a specific subscription. Instead of calling this function, call\r\n   * `subscription.remove()` directly.\r\n   *\r\n   * @param {object} subscription\r\n   */\n  ;\n\n  _proto.removeSubscription = function removeSubscription(subscription) {\n    var eventType = subscription.eventType;\n    var key = subscription.key;\n    var subscriptionsForType = this._subscriptionsForType[eventType];\n\n    if (subscriptionsForType) {\n      delete subscriptionsForType[key];\n    }\n  }\n  /**\r\n   * Returns the array of subscriptions that are currently registered for the\r\n   * given event type.\r\n   *\r\n   * Note: This array can be potentially sparse as subscriptions are deleted\r\n   * from it when they are removed.\r\n   *\r\n   * TODO: This returns a nullable array. wat?\r\n   *\r\n   * @param {string} eventType\r\n   * @return {?array}\r\n   */\n  ;\n\n  _proto.getSubscriptionsForType = function getSubscriptionsForType(eventType) {\n    return this._subscriptionsForType[eventType];\n  };\n\n  return EventSubscriptionVendor;\n}();\n\nmodule.exports = EventSubscriptionVendor;","\"use strict\";\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * \n */\nfunction makeEmptyFunction(arg) {\n  return function () {\n    return arg;\n  };\n}\n/**\n * This function accepts and discards inputs; it has no side effects. This is\n * primarily useful idiomatically for overridable function endpoints which\n * always need to be callable, since JS lacks a null-call idiom ala Cocoa.\n */\n\n\nvar emptyFunction = function emptyFunction() {};\n\nemptyFunction.thatReturns = makeEmptyFunction;\nemptyFunction.thatReturnsFalse = makeEmptyFunction(false);\nemptyFunction.thatReturnsTrue = makeEmptyFunction(true);\nemptyFunction.thatReturnsNull = makeEmptyFunction(null);\n\nemptyFunction.thatReturnsThis = function () {\n  return this;\n};\n\nemptyFunction.thatReturnsArgument = function (arg) {\n  return arg;\n};\n\nmodule.exports = emptyFunction;","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * \n */\n'use strict';\n\nvar validateFormat = process.env.NODE_ENV !== \"production\" ? function (format) {\n  if (format === undefined) {\n    throw new Error('invariant(...): Second argument must be a string.');\n  }\n} : function (format) {};\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments to provide\n * information about what broke and what you were expecting.\n *\n * The invariant message will be stripped in production, but the invariant will\n * remain to ensure logic does not differ in production.\n */\n\nfunction invariant(condition, format) {\n  for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n    args[_key - 2] = arguments[_key];\n  }\n\n  validateFormat(format);\n\n  if (!condition) {\n    var error;\n\n    if (format === undefined) {\n      error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.');\n    } else {\n      var argIndex = 0;\n      error = new Error(format.replace(/%s/g, function () {\n        return String(args[argIndex++]);\n      }));\n      error.name = 'Invariant Violation';\n    }\n\n    error.framesToPop = 1; // Skip invariant's own stack frame.\n\n    throw error;\n  }\n}\n\nmodule.exports = invariant;","'use strict'\n\n/**\n * Expose compositor.\n */\n\nmodule.exports = compose\n\n/**\n * Compose `middleware` returning\n * a fully valid middleware comprised\n * of all those which are passed.\n *\n * @param {Array} middleware\n * @return {Function}\n * @api public\n */\n\nfunction compose (middleware) {\n  if (!Array.isArray(middleware)) throw new TypeError('Middleware stack must be an array!')\n  for (const fn of middleware) {\n    if (typeof fn !== 'function') throw new TypeError('Middleware must be composed of functions!')\n  }\n\n  /**\n   * @param {Object} context\n   * @return {Promise}\n   * @api public\n   */\n\n  return function (context, next) {\n    // last called middleware #\n    let index = -1\n    return dispatch(0)\n    function dispatch (i) {\n      if (i <= index) return Promise.reject(new Error('next() called multiple times'))\n      index = i\n      let fn = middleware[i]\n      if (i === middleware.length) fn = next\n      if (!fn) return Promise.resolve()\n      try {\n        return Promise.resolve(fn(context, dispatch.bind(null, i + 1)));\n      } catch (err) {\n        return Promise.reject(err)\n      }\n    }\n  }\n}\n","(function(root, factory) {\n  if (typeof exports === 'object') {\n    // CommonJS\n    factory(exports, module);\n  } else if (typeof define === 'function' && define.amd) {\n    // AMD\n    define(['exports', 'module'], factory);\n  }\n}(this, function(exports, module) {\n\n  /**\n   * ANONYMOUS `Mechanism` constructor.\n   *\n   * This class implements the ANONYMOUS SASL mechanism.\n   *\n   * The ANONYMOUS SASL mechanism provides support for permitting anonymous\n   * access to various services\n   *\n   * References:\n   *  - [RFC 4505](http://tools.ietf.org/html/rfc4505)\n   *\n   * @api public\n   */\n  function Mechanism() {\n  }\n  \n  Mechanism.prototype.name = 'ANONYMOUS';\n  Mechanism.prototype.clientFirst = true;\n  \n  /**\n   * Encode a response using optional trace information.\n   *\n   * Options:\n   *  - `trace`  trace information (optional)\n   *\n   * @param {Object} cred\n   * @api public\n   */\n  Mechanism.prototype.response = function(cred) {\n    return cred.trace || '';\n  };\n  \n  /**\n   * Decode a challenge issued by the server.\n   *\n   * @param {String} chal\n   * @api public\n   */\n  Mechanism.prototype.challenge = function(chal) {\n  };\n\n  exports = module.exports = Mechanism;\n  \n}));\n","(function(root, factory) {\n  if (typeof exports === 'object') {\n    // CommonJS\n    factory(exports,\n            module,\n            require('./lib/mechanism'));\n  } else if (typeof define === 'function' && define.amd) {\n    // AMD\n    define(['exports',\n            'module',\n            './lib/mechanism'], factory);\n  }\n}(this, function(exports, module, Mechanism) {\n\n  exports = module.exports = Mechanism;\n  exports.Mechanism = Mechanism;\n  \n}));\n","(function(root, factory) {\n  if (typeof exports === 'object') {\n    // CommonJS\n    factory(exports, module);\n  } else if (typeof define === 'function' && define.amd) {\n    // AMD\n    define(['exports', 'module'], factory);\n  }\n}(this, function(exports, module) {\n\n  /**\n   * PLAIN `Mechanism` constructor.\n   *\n   * This class implements the PLAIN SASL mechanism.\n   *\n   * The PLAIN SASL mechanism provides support for exchanging a clear-text\n   * username and password.  This mechanism should not be used without adequate\n   * security provided by an underlying transport layer. \n   *\n   * References:\n   *  - [RFC 4616](http://tools.ietf.org/html/rfc4616)\n   *\n   * @api public\n   */\n  function Mechanism() {\n  }\n  \n  Mechanism.prototype.name = 'PLAIN';\n  Mechanism.prototype.clientFirst = true;\n  \n  /**\n   * Encode a response using given credential.\n   *\n   * Options:\n   *  - `username`\n   *  - `password`\n   *  - `authzid`   authorization identity (optional)\n   *\n   * @param {Object} cred\n   * @api public\n   */\n  Mechanism.prototype.response = function(cred) {\n    var str = '';\n    str += cred.authzid || '';\n    str += '\\0';\n    str += cred.username;\n    str += '\\0';\n    str += cred.password;\n    return str;\n  };\n  \n  /**\n   * Decode a challenge issued by the server.\n   *\n   * @param {String} chal\n   * @return {Mechanism} for chaining\n   * @api public\n   */\n  Mechanism.prototype.challenge = function(chal) {\n    return this;\n  };\n\n  exports = module.exports = Mechanism;\n  \n}));\n","(function(root, factory) {\n  if (typeof exports === 'object') {\n    // CommonJS\n    factory(exports,\n            module,\n            require('./lib/mechanism'));\n  } else if (typeof define === 'function' && define.amd) {\n    // AMD\n    define(['exports',\n            'module',\n            './lib/mechanism'], factory);\n  }\n}(this, function(exports, module, Mechanism) {\n\n  exports = module.exports = Mechanism;\n  exports.Mechanism = Mechanism;\n  \n}));\n","(function(root, factory) {\n  if (typeof exports === 'object') {\n    // CommonJS\n    factory(exports, module);\n  } else if (typeof define === 'function' && define.amd) {\n    // AMD\n    define(['exports', 'module'], factory);\n  }\n}(this, function(exports, module) {\n  \n  /**\n   * `Factory` constructor.\n   *\n   * @api public\n   */\n  function Factory() {\n    this._mechs = [];\n  }\n  \n  /**\n   * Utilize the given `mech` with optional `name`, overridding the mechanism's\n   * default name.\n   *\n   * Examples:\n   *\n   *     factory.use(FooMechanism);\n   *\n   *     factory.use('XFOO', FooMechanism);\n   *\n   * @param {String|Mechanism} name\n   * @param {Mechanism} mech\n   * @return {Factory} for chaining\n   * @api public\n   */\n  Factory.prototype.use = function(name, mech) {\n    if (!mech) {\n      mech = name;\n      name = mech.prototype.name;\n    }\n    this._mechs.push({ name: name, mech: mech });\n    return this;\n  };\n  \n  /**\n   * Create a new mechanism from supported list of `mechs`.\n   *\n   * If no mechanisms are supported, returns `null`.\n   *\n   * Examples:\n   *\n   *     var mech = factory.create(['FOO', 'BAR']);\n   *\n   * @param {Array} mechs\n   * @return {Mechanism}\n   * @api public\n   */\n  Factory.prototype.create = function(mechs) {\n    for (var i = 0, len = this._mechs.length; i < len; i++) {\n      for (var j = 0, jlen = mechs.length; j < jlen; j++) {\n        var entry = this._mechs[i];\n        if (entry.name == mechs[j]) {\n          return new entry.mech();\n        }\n      }\n    }\n    return null;\n  };\n\n  exports = module.exports = Factory;\n  \n}));\n","(function(root, factory) {\n  if (typeof exports === 'object') {\n    // CommonJS\n    factory(exports,\n            module,\n            require('./lib/factory'));\n  } else if (typeof define === 'function' && define.amd) {\n    // AMD\n    define(['exports',\n            'module',\n            './lib/factory'], factory);\n  }\n}(this, function(exports, module, Factory) {\n  \n  exports = module.exports = Factory;\n  exports.Factory = Factory;\n  \n}));\n","module.exports = __WEBPACK_EXTERNAL_MODULE__6245__;","module.exports = __WEBPACK_EXTERNAL_MODULE__8849__;","function _arrayLikeToArray(r, a) {\n  (null == a || a > r.length) && (a = r.length);\n  for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n  return n;\n}\nmodule.exports = _arrayLikeToArray, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _arrayWithHoles(r) {\n  if (Array.isArray(r)) return r;\n}\nmodule.exports = _arrayWithHoles, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function asyncGeneratorStep(n, t, e, r, o, a, c) {\n  try {\n    var i = n[a](c),\n      u = i.value;\n  } catch (n) {\n    return void e(n);\n  }\n  i.done ? t(u) : Promise.resolve(u).then(r, o);\n}\nfunction _asyncToGenerator(n) {\n  return function () {\n    var t = this,\n      e = arguments;\n    return new Promise(function (r, o) {\n      var a = n.apply(t, e);\n      function _next(n) {\n        asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n);\n      }\n      function _throw(n) {\n        asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n);\n      }\n      _next(void 0);\n    });\n  };\n}\nmodule.exports = _asyncToGenerator, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _classCallCheck(a, n) {\n  if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\");\n}\nmodule.exports = _classCallCheck, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var toPropertyKey = require(\"./toPropertyKey.js\");\nfunction _defineProperties(e, r) {\n  for (var t = 0; t < r.length; t++) {\n    var o = r[t];\n    o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, toPropertyKey(o.key), o);\n  }\n}\nfunction _createClass(e, r, t) {\n  return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", {\n    writable: !1\n  }), e;\n}\nmodule.exports = _createClass, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var toPropertyKey = require(\"./toPropertyKey.js\");\nfunction _defineProperty(e, r, t) {\n  return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n    value: t,\n    enumerable: !0,\n    configurable: !0,\n    writable: !0\n  }) : e[r] = t, e;\n}\nmodule.exports = _defineProperty, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _interopRequireDefault(e) {\n  return e && e.__esModule ? e : {\n    \"default\": e\n  };\n}\nmodule.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _iterableToArrayLimit(r, l) {\n  var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n  if (null != t) {\n    var e,\n      n,\n      i,\n      u,\n      a = [],\n      f = !0,\n      o = !1;\n    try {\n      if (i = (t = t.call(r)).next, 0 === l) {\n        if (Object(t) !== t) return;\n        f = !1;\n      } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n    } catch (r) {\n      o = !0, n = r;\n    } finally {\n      try {\n        if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return;\n      } finally {\n        if (o) throw n;\n      }\n    }\n    return a;\n  }\n}\nmodule.exports = _iterableToArrayLimit, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nmodule.exports = _nonIterableRest, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var objectWithoutPropertiesLoose = require(\"./objectWithoutPropertiesLoose.js\");\nfunction _objectWithoutProperties(e, t) {\n  if (null == e) return {};\n  var o,\n    r,\n    i = objectWithoutPropertiesLoose(e, t);\n  if (Object.getOwnPropertySymbols) {\n    var s = Object.getOwnPropertySymbols(e);\n    for (r = 0; r < s.length; r++) o = s[r], t.includes(o) || {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]);\n  }\n  return i;\n}\nmodule.exports = _objectWithoutProperties, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _objectWithoutPropertiesLoose(r, e) {\n  if (null == r) return {};\n  var t = {};\n  for (var n in r) if ({}.hasOwnProperty.call(r, n)) {\n    if (e.includes(n)) continue;\n    t[n] = r[n];\n  }\n  return t;\n}\nmodule.exports = _objectWithoutPropertiesLoose, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction _regeneratorRuntime() {\n  \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */\n  module.exports = _regeneratorRuntime = function _regeneratorRuntime() {\n    return e;\n  }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;\n  var t,\n    e = {},\n    r = Object.prototype,\n    n = r.hasOwnProperty,\n    o = Object.defineProperty || function (t, e, r) {\n      t[e] = r.value;\n    },\n    i = \"function\" == typeof Symbol ? Symbol : {},\n    a = i.iterator || \"@@iterator\",\n    c = i.asyncIterator || \"@@asyncIterator\",\n    u = i.toStringTag || \"@@toStringTag\";\n  function define(t, e, r) {\n    return Object.defineProperty(t, e, {\n      value: r,\n      enumerable: !0,\n      configurable: !0,\n      writable: !0\n    }), t[e];\n  }\n  try {\n    define({}, \"\");\n  } catch (t) {\n    define = function define(t, e, r) {\n      return t[e] = r;\n    };\n  }\n  function wrap(t, e, r, n) {\n    var i = e && e.prototype instanceof Generator ? e : Generator,\n      a = Object.create(i.prototype),\n      c = new Context(n || []);\n    return o(a, \"_invoke\", {\n      value: makeInvokeMethod(t, r, c)\n    }), a;\n  }\n  function tryCatch(t, e, r) {\n    try {\n      return {\n        type: \"normal\",\n        arg: t.call(e, r)\n      };\n    } catch (t) {\n      return {\n        type: \"throw\",\n        arg: t\n      };\n    }\n  }\n  e.wrap = wrap;\n  var h = \"suspendedStart\",\n    l = \"suspendedYield\",\n    f = \"executing\",\n    s = \"completed\",\n    y = {};\n  function Generator() {}\n  function GeneratorFunction() {}\n  function GeneratorFunctionPrototype() {}\n  var p = {};\n  define(p, a, function () {\n    return this;\n  });\n  var d = Object.getPrototypeOf,\n    v = d && d(d(values([])));\n  v && v !== r && n.call(v, a) && (p = v);\n  var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p);\n  function defineIteratorMethods(t) {\n    [\"next\", \"throw\", \"return\"].forEach(function (e) {\n      define(t, e, function (t) {\n        return this._invoke(e, t);\n      });\n    });\n  }\n  function AsyncIterator(t, e) {\n    function invoke(r, o, i, a) {\n      var c = tryCatch(t[r], t, o);\n      if (\"throw\" !== c.type) {\n        var u = c.arg,\n          h = u.value;\n        return h && \"object\" == _typeof(h) && n.call(h, \"__await\") ? e.resolve(h.__await).then(function (t) {\n          invoke(\"next\", t, i, a);\n        }, function (t) {\n          invoke(\"throw\", t, i, a);\n        }) : e.resolve(h).then(function (t) {\n          u.value = t, i(u);\n        }, function (t) {\n          return invoke(\"throw\", t, i, a);\n        });\n      }\n      a(c.arg);\n    }\n    var r;\n    o(this, \"_invoke\", {\n      value: function value(t, n) {\n        function callInvokeWithMethodAndArg() {\n          return new e(function (e, r) {\n            invoke(t, n, e, r);\n          });\n        }\n        return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();\n      }\n    });\n  }\n  function makeInvokeMethod(e, r, n) {\n    var o = h;\n    return function (i, a) {\n      if (o === f) throw Error(\"Generator is already running\");\n      if (o === s) {\n        if (\"throw\" === i) throw a;\n        return {\n          value: t,\n          done: !0\n        };\n      }\n      for (n.method = i, n.arg = a;;) {\n        var c = n.delegate;\n        if (c) {\n          var u = maybeInvokeDelegate(c, n);\n          if (u) {\n            if (u === y) continue;\n            return u;\n          }\n        }\n        if (\"next\" === n.method) n.sent = n._sent = n.arg;else if (\"throw\" === n.method) {\n          if (o === h) throw o = s, n.arg;\n          n.dispatchException(n.arg);\n        } else \"return\" === n.method && n.abrupt(\"return\", n.arg);\n        o = f;\n        var p = tryCatch(e, r, n);\n        if (\"normal\" === p.type) {\n          if (o = n.done ? s : l, p.arg === y) continue;\n          return {\n            value: p.arg,\n            done: n.done\n          };\n        }\n        \"throw\" === p.type && (o = s, n.method = \"throw\", n.arg = p.arg);\n      }\n    };\n  }\n  function maybeInvokeDelegate(e, r) {\n    var n = r.method,\n      o = e.iterator[n];\n    if (o === t) return r.delegate = null, \"throw\" === n && e.iterator[\"return\"] && (r.method = \"return\", r.arg = t, maybeInvokeDelegate(e, r), \"throw\" === r.method) || \"return\" !== n && (r.method = \"throw\", r.arg = new TypeError(\"The iterator does not provide a '\" + n + \"' method\")), y;\n    var i = tryCatch(o, e.iterator, r.arg);\n    if (\"throw\" === i.type) return r.method = \"throw\", r.arg = i.arg, r.delegate = null, y;\n    var a = i.arg;\n    return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, \"return\" !== r.method && (r.method = \"next\", r.arg = t), r.delegate = null, y) : a : (r.method = \"throw\", r.arg = new TypeError(\"iterator result is not an object\"), r.delegate = null, y);\n  }\n  function pushTryEntry(t) {\n    var e = {\n      tryLoc: t[0]\n    };\n    1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e);\n  }\n  function resetTryEntry(t) {\n    var e = t.completion || {};\n    e.type = \"normal\", delete e.arg, t.completion = e;\n  }\n  function Context(t) {\n    this.tryEntries = [{\n      tryLoc: \"root\"\n    }], t.forEach(pushTryEntry, this), this.reset(!0);\n  }\n  function values(e) {\n    if (e || \"\" === e) {\n      var r = e[a];\n      if (r) return r.call(e);\n      if (\"function\" == typeof e.next) return e;\n      if (!isNaN(e.length)) {\n        var o = -1,\n          i = function next() {\n            for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next;\n            return next.value = t, next.done = !0, next;\n          };\n        return i.next = i;\n      }\n    }\n    throw new TypeError(_typeof(e) + \" is not iterable\");\n  }\n  return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, \"constructor\", {\n    value: GeneratorFunctionPrototype,\n    configurable: !0\n  }), o(GeneratorFunctionPrototype, \"constructor\", {\n    value: GeneratorFunction,\n    configurable: !0\n  }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, \"GeneratorFunction\"), e.isGeneratorFunction = function (t) {\n    var e = \"function\" == typeof t && t.constructor;\n    return !!e && (e === GeneratorFunction || \"GeneratorFunction\" === (e.displayName || e.name));\n  }, e.mark = function (t) {\n    return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, \"GeneratorFunction\")), t.prototype = Object.create(g), t;\n  }, e.awrap = function (t) {\n    return {\n      __await: t\n    };\n  }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () {\n    return this;\n  }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) {\n    void 0 === i && (i = Promise);\n    var a = new AsyncIterator(wrap(t, r, n, o), i);\n    return e.isGeneratorFunction(r) ? a : a.next().then(function (t) {\n      return t.done ? t.value : a.next();\n    });\n  }, defineIteratorMethods(g), define(g, u, \"Generator\"), define(g, a, function () {\n    return this;\n  }), define(g, \"toString\", function () {\n    return \"[object Generator]\";\n  }), e.keys = function (t) {\n    var e = Object(t),\n      r = [];\n    for (var n in e) r.push(n);\n    return r.reverse(), function next() {\n      for (; r.length;) {\n        var t = r.pop();\n        if (t in e) return next.value = t, next.done = !1, next;\n      }\n      return next.done = !0, next;\n    };\n  }, e.values = values, Context.prototype = {\n    constructor: Context,\n    reset: function reset(e) {\n      if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) \"t\" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t);\n    },\n    stop: function stop() {\n      this.done = !0;\n      var t = this.tryEntries[0].completion;\n      if (\"throw\" === t.type) throw t.arg;\n      return this.rval;\n    },\n    dispatchException: function dispatchException(e) {\n      if (this.done) throw e;\n      var r = this;\n      function handle(n, o) {\n        return a.type = \"throw\", a.arg = e, r.next = n, o && (r.method = \"next\", r.arg = t), !!o;\n      }\n      for (var o = this.tryEntries.length - 1; o >= 0; --o) {\n        var i = this.tryEntries[o],\n          a = i.completion;\n        if (\"root\" === i.tryLoc) return handle(\"end\");\n        if (i.tryLoc <= this.prev) {\n          var c = n.call(i, \"catchLoc\"),\n            u = n.call(i, \"finallyLoc\");\n          if (c && u) {\n            if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);\n            if (this.prev < i.finallyLoc) return handle(i.finallyLoc);\n          } else if (c) {\n            if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);\n          } else {\n            if (!u) throw Error(\"try statement without catch or finally\");\n            if (this.prev < i.finallyLoc) return handle(i.finallyLoc);\n          }\n        }\n      }\n    },\n    abrupt: function abrupt(t, e) {\n      for (var r = this.tryEntries.length - 1; r >= 0; --r) {\n        var o = this.tryEntries[r];\n        if (o.tryLoc <= this.prev && n.call(o, \"finallyLoc\") && this.prev < o.finallyLoc) {\n          var i = o;\n          break;\n        }\n      }\n      i && (\"break\" === t || \"continue\" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null);\n      var a = i ? i.completion : {};\n      return a.type = t, a.arg = e, i ? (this.method = \"next\", this.next = i.finallyLoc, y) : this.complete(a);\n    },\n    complete: function complete(t, e) {\n      if (\"throw\" === t.type) throw t.arg;\n      return \"break\" === t.type || \"continue\" === t.type ? this.next = t.arg : \"return\" === t.type ? (this.rval = this.arg = t.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === t.type && e && (this.next = e), y;\n    },\n    finish: function finish(t) {\n      for (var e = this.tryEntries.length - 1; e >= 0; --e) {\n        var r = this.tryEntries[e];\n        if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y;\n      }\n    },\n    \"catch\": function _catch(t) {\n      for (var e = this.tryEntries.length - 1; e >= 0; --e) {\n        var r = this.tryEntries[e];\n        if (r.tryLoc === t) {\n          var n = r.completion;\n          if (\"throw\" === n.type) {\n            var o = n.arg;\n            resetTryEntry(r);\n          }\n          return o;\n        }\n      }\n      throw Error(\"illegal catch attempt\");\n    },\n    delegateYield: function delegateYield(e, r, n) {\n      return this.delegate = {\n        iterator: values(e),\n        resultName: r,\n        nextLoc: n\n      }, \"next\" === this.method && (this.arg = t), y;\n    }\n  }, e;\n}\nmodule.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var arrayWithHoles = require(\"./arrayWithHoles.js\");\nvar iterableToArrayLimit = require(\"./iterableToArrayLimit.js\");\nvar unsupportedIterableToArray = require(\"./unsupportedIterableToArray.js\");\nvar nonIterableRest = require(\"./nonIterableRest.js\");\nfunction _slicedToArray(r, e) {\n  return arrayWithHoles(r) || iterableToArrayLimit(r, e) || unsupportedIterableToArray(r, e) || nonIterableRest();\n}\nmodule.exports = _slicedToArray, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction toPrimitive(t, r) {\n  if (\"object\" != _typeof(t) || !t) return t;\n  var e = t[Symbol.toPrimitive];\n  if (void 0 !== e) {\n    var i = e.call(t, r || \"default\");\n    if (\"object\" != _typeof(i)) return i;\n    throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n  }\n  return (\"string\" === r ? String : Number)(t);\n}\nmodule.exports = toPrimitive, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nvar toPrimitive = require(\"./toPrimitive.js\");\nfunction toPropertyKey(t) {\n  var i = toPrimitive(t, \"string\");\n  return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nmodule.exports = toPropertyKey, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _typeof(o) {\n  \"@babel/helpers - typeof\";\n\n  return module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n    return typeof o;\n  } : function (o) {\n    return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n  }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _typeof(o);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var arrayLikeToArray = require(\"./arrayLikeToArray.js\");\nfunction _unsupportedIterableToArray(r, a) {\n  if (r) {\n    if (\"string\" == typeof r) return arrayLikeToArray(r, a);\n    var t = {}.toString.call(r).slice(8, -1);\n    return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? arrayLikeToArray(r, a) : void 0;\n  }\n}\nmodule.exports = _unsupportedIterableToArray, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","// TODO(Babel 8): Remove this file.\n\nvar runtime = require(\"../helpers/regeneratorRuntime\")();\nmodule.exports = runtime;\n\n// Copied from https://github.com/facebook/regenerator/blob/main/packages/runtime/runtime.js#L736=\ntry {\n  regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n  if (typeof globalThis === \"object\") {\n    globalThis.regeneratorRuntime = runtime;\n  } else {\n    Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n  }\n}\n","'use strict';\n\nvar _escape = require('./escape.js');\n\n/**\n * Element\n *\n * Attributes are in the element.attrs object. Children is a list of\n * either other Elements or Strings for text content.\n **/\nclass Element {\n  constructor(name, attrs) {\n    this.name = name;\n    this.parent = null;\n    this.children = [];\n    this.attrs = {};\n    this.setAttrs(attrs);\n  }\n\n  /* Accessors */\n\n  /**\n   * if (element.is('message', 'jabber:client')) ...\n   **/\n  is(name, xmlns) {\n    return this.getName() === name && (!xmlns || this.getNS() === xmlns);\n  }\n\n  /* without prefix */\n  getName() {\n    const idx = this.name.indexOf(\":\");\n    return idx >= 0 ? this.name.slice(idx + 1) : this.name;\n  }\n\n  /**\n   * retrieves the namespace of the current element, upwards recursively\n   **/\n  getNS() {\n    const idx = this.name.indexOf(\":\");\n    if (idx >= 0) {\n      const prefix = this.name.slice(0, idx);\n      return this.findNS(prefix);\n    }\n    return this.findNS();\n  }\n\n  /**\n   * find the namespace to the given prefix, upwards recursively\n   **/\n  findNS(prefix) {\n    if (!prefix) {\n      /* default namespace */\n      if (this.attrs.xmlns) {\n        return this.attrs.xmlns;\n      } else if (this.parent) {\n        return this.parent.findNS();\n      }\n    } else {\n      /* prefixed namespace */\n      const attr = \"xmlns:\" + prefix;\n      if (this.attrs[attr]) {\n        return this.attrs[attr];\n      } else if (this.parent) {\n        return this.parent.findNS(prefix);\n      }\n    }\n  }\n\n  /**\n   * Recursiverly gets all xmlns defined, in the form of {url:prefix}\n   **/\n  getXmlns() {\n    let namespaces = {};\n\n    if (this.parent) {\n      namespaces = this.parent.getXmlns();\n    }\n\n    for (const attr in this.attrs) {\n      const m = attr.match(\"xmlns:?(.*)\");\n      // eslint-disable-next-line  no-prototype-builtins\n      if (this.attrs.hasOwnProperty(attr) && m) {\n        namespaces[this.attrs[attr]] = m[1];\n      }\n    }\n    return namespaces;\n  }\n\n  setAttrs(attrs) {\n    if (typeof attrs === \"string\") {\n      this.attrs.xmlns = attrs;\n    } else if (attrs) {\n      Object.assign(this.attrs, attrs);\n    }\n  }\n\n  /**\n   * xmlns can be null, returns the matching attribute.\n   **/\n  getAttr(name, xmlns) {\n    if (!xmlns) {\n      return this.attrs[name];\n    }\n\n    const namespaces = this.getXmlns();\n\n    if (!namespaces[xmlns]) {\n      return null;\n    }\n\n    return this.attrs[[namespaces[xmlns], name].join(\":\")];\n  }\n\n  /**\n   * xmlns can be null\n   **/\n  getChild(name, xmlns) {\n    return this.getChildren(name, xmlns)[0];\n  }\n\n  /**\n   * xmlns can be null\n   **/\n  getChildren(name, xmlns) {\n    const result = [];\n    for (const child of this.children) {\n      if (\n        child.getName &&\n        child.getName() === name &&\n        (!xmlns || child.getNS() === xmlns)\n      ) {\n        result.push(child);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * xmlns and recursive can be null\n   **/\n  getChildByAttr(attr, val, xmlns, recursive) {\n    return this.getChildrenByAttr(attr, val, xmlns, recursive)[0];\n  }\n\n  /**\n   * xmlns and recursive can be null\n   **/\n  getChildrenByAttr(attr, val, xmlns, recursive) {\n    let result = [];\n    for (const child of this.children) {\n      if (\n        child.attrs &&\n        child.attrs[attr] === val &&\n        (!xmlns || child.getNS() === xmlns)\n      ) {\n        result.push(child);\n      }\n      if (recursive && child.getChildrenByAttr) {\n        result.push(child.getChildrenByAttr(attr, val, xmlns, true));\n      }\n    }\n    if (recursive) {\n      result = result.flat();\n    }\n    return result;\n  }\n\n  getChildrenByFilter(filter, recursive) {\n    let result = [];\n    for (const child of this.children) {\n      if (filter(child)) {\n        result.push(child);\n      }\n      if (recursive && child.getChildrenByFilter) {\n        result.push(child.getChildrenByFilter(filter, true));\n      }\n    }\n    if (recursive) {\n      result = result.flat();\n    }\n    return result;\n  }\n\n  getText() {\n    let text = \"\";\n    for (const child of this.children) {\n      if (typeof child === \"string\" || typeof child === \"number\") {\n        text += child;\n      }\n    }\n    return text;\n  }\n\n  getChildText(name, xmlns) {\n    const child = this.getChild(name, xmlns);\n    return child ? child.getText() : null;\n  }\n\n  /**\n   * Return all direct descendents that are Elements.\n   * This differs from `getChildren` in that it will exclude text nodes,\n   * processing instructions, etc.\n   */\n  getChildElements() {\n    return this.getChildrenByFilter((child) => {\n      return child instanceof Element;\n    });\n  }\n\n  /* Builder */\n\n  /** returns uppermost parent */\n  root() {\n    if (this.parent) {\n      return this.parent.root();\n    }\n    return this;\n  }\n\n  /** just parent or itself */\n  up() {\n    if (this.parent) {\n      return this.parent;\n    }\n    return this;\n  }\n\n  /** create child node and return it */\n  c(name, attrs) {\n    return this.cnode(new Element(name, attrs));\n  }\n\n  cnode(child) {\n    this.children.push(child);\n    if (typeof child === \"object\") {\n      child.parent = this;\n    }\n    return child;\n  }\n\n  append(...nodes) {\n    for (const node of nodes) {\n      this.children.push(node);\n      if (typeof node === \"object\") {\n        node.parent = this;\n      }\n    }\n  }\n\n  prepend(...nodes) {\n    for (const node of nodes) {\n      this.children.unshift(node);\n      if (typeof node === \"object\") {\n        node.parent = this;\n      }\n    }\n  }\n\n  /** add text node and return element */\n  t(text) {\n    this.children.push(text);\n    return this;\n  }\n\n  /* Manipulation */\n\n  /**\n   * Either:\n   *   el.remove(childEl)\n   *   el.remove('author', 'urn:...')\n   */\n  remove(el, xmlns) {\n    const filter =\n      typeof el === \"string\"\n        ? (child) => {\n            /* 1st parameter is tag name */\n            return !(child.is && child.is(el, xmlns));\n          }\n        : (child) => {\n            /* 1st parameter is element */\n            return child !== el;\n          };\n\n    this.children = this.children.filter(filter);\n\n    return this;\n  }\n\n  text(val) {\n    if (val && this.children.length === 1) {\n      this.children[0] = val;\n      return this;\n    }\n    return this.getText();\n  }\n\n  attr(attr, val) {\n    if (typeof val !== \"undefined\" || val === null) {\n      if (!this.attrs) {\n        this.attrs = {};\n      }\n      this.attrs[attr] = val;\n      return this;\n    }\n    return this.attrs[attr];\n  }\n\n  /* Serialization */\n\n  toString() {\n    let s = \"\";\n    this.write((c) => {\n      s += c;\n    });\n    return s;\n  }\n\n  _addChildren(writer) {\n    writer(\">\");\n    for (const child of this.children) {\n      /* Skip null/undefined */\n      if (child != null) {\n        if (child.write) {\n          child.write(writer);\n        } else if (typeof child === \"string\") {\n          writer(_escape.escapeXMLText(child));\n        } else if (child.toString) {\n          writer(_escape.escapeXMLText(child.toString(10)));\n        }\n      }\n    }\n    writer(\"</\");\n    writer(this.name);\n    writer(\">\");\n  }\n\n  write(writer) {\n    writer(\"<\");\n    writer(this.name);\n    for (const k in this.attrs) {\n      const v = this.attrs[k];\n      // === null || undefined\n      if (v != null) {\n        writer(\" \");\n        writer(k);\n        writer('=\"');\n        writer(_escape.escapeXML(typeof v === \"string\" ? v : v.toString(10)));\n        writer('\"');\n      }\n    }\n    if (this.children.length === 0) {\n      writer(\"/>\");\n    } else {\n      this._addChildren(writer);\n    }\n  }\n}\n\nElement.prototype.tree = Element.prototype.root;\n\nmodule.exports = Element;\n","'use strict';\n\nvar Element = require('./Element.js');\n\nfunction append(el, child) {\n  if (Array.isArray(child)) {\n    for (const c of child) append(el, c);\n    return;\n  }\n\n  if (child === \"\" || child == null || child === true || child === false) {\n    return;\n  }\n\n  el.cnode(child);\n}\n\n/**\n * JSX compatible API, use this function as pragma\n * https://facebook.github.io/jsx/\n *\n * @param  {string} name  name of the element\n * @param  {object} attrs object of attribute key/value pairs\n * @return {Element}      Element\n */\nfunction createElement(name, attrs, ...children) {\n  if (typeof attrs === \"object\" && attrs !== null) {\n    // __self and __source are added by babel in development\n    // https://github.com/facebook/react/pull/4596\n    // https://babeljs.io/docs/en/babel-preset-react#development\n    // https://babeljs.io/docs/en/babel-plugin-transform-react-jsx-source\n    delete attrs.__source;\n    delete attrs.__self;\n\n    for (const [key, value] of Object.entries(attrs)) {\n      if (value == null) delete attrs[key];\n      else attrs[key] = value.toString(10);\n    }\n  }\n\n  const el = new Element(name, attrs);\n\n  for (const child of children) {\n    append(el, child);\n  }\n\n  return el;\n}\n\nmodule.exports = createElement;\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nconst escapeXMLTable = {\n  \"&\": \"&amp;\",\n  \"<\": \"&lt;\",\n  \">\": \"&gt;\",\n  '\"': \"&quot;\",\n  \"'\": \"&apos;\",\n};\n\nfunction escapeXMLReplace(match) {\n  return escapeXMLTable[match];\n}\n\nconst unescapeXMLTable = {\n  \"&amp;\": \"&\",\n  \"&lt;\": \"<\",\n  \"&gt;\": \">\",\n  \"&quot;\": '\"',\n  \"&apos;\": \"'\",\n};\n\nfunction unescapeXMLReplace(match) {\n  if (match[1] === \"#\") {\n    const num =\n      match[2] === \"x\"\n        ? parseInt(match.slice(3), 16)\n        : parseInt(match.slice(2), 10);\n    // https://www.w3.org/TR/xml/#NT-Char defines legal XML characters:\n    // #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]\n    if (\n      num === 0x9 ||\n      num === 0xa ||\n      num === 0xd ||\n      (num >= 0x20 && num <= 0xd7ff) ||\n      (num >= 0xe000 && num <= 0xfffd) ||\n      (num >= 0x10000 && num <= 0x10ffff)\n    ) {\n      return String.fromCodePoint(num);\n    }\n    throw new Error(\"Illegal XML character 0x\" + num.toString(16));\n  }\n  if (unescapeXMLTable[match]) {\n    return unescapeXMLTable[match] || match;\n  }\n  throw new Error(\"Illegal XML entity \" + match);\n}\n\nfunction escapeXML(s) {\n  return s.replace(/[\"&'<>]/g, escapeXMLReplace);\n}\n\nfunction unescapeXML(s) {\n  let result = \"\";\n  let start = -1;\n  let end = -1;\n  let previous = 0;\n  while (\n    (start = s.indexOf(\"&\", previous)) !== -1 &&\n    (end = s.indexOf(\";\", start + 1)) !== -1\n  ) {\n    result =\n      result +\n      s.slice(previous, start) +\n      unescapeXMLReplace(s.slice(start, end + 1));\n    previous = end + 1;\n  }\n\n  // shortcut if loop never entered:\n  // return the original string without creating new objects\n  if (previous === 0) return s;\n\n  // push the remaining characters\n  result = result + s.substring(previous);\n\n  return result;\n}\n\nfunction escapeXMLText(s) {\n  return s.replace(/[&<>]/g, escapeXMLReplace);\n}\n\nfunction unescapeXMLText(s) {\n  return s.replace(/&(amp|#38|lt|#60|gt|#62);/g, unescapeXMLReplace);\n}\n\nexports.escapeXML = escapeXML;\nexports.escapeXMLText = escapeXMLText;\nexports.unescapeXML = unescapeXML;\nexports.unescapeXMLText = unescapeXMLText;\n","'use strict';\n\nvar events = require('events');\nvar _escape = require('../escape.js');\n\nconst STATE_TEXT = 0;\nconst STATE_IGNORE_COMMENT = 1;\nconst STATE_IGNORE_INSTRUCTION = 2;\nconst STATE_TAG_NAME = 3;\nconst STATE_TAG = 4;\nconst STATE_ATTR_NAME = 5;\nconst STATE_ATTR_EQ = 6;\nconst STATE_ATTR_QUOT = 7;\nconst STATE_ATTR_VALUE = 8;\nconst STATE_CDATA = 9;\nconst STATE_IGNORE_CDATA = 10;\n\nclass SaxLtx extends events.EventEmitter {\n  constructor() {\n    super();\n    let state = STATE_TEXT;\n    let remainder;\n    let parseRemainder;\n    let tagName;\n    let attrs;\n    let endTag;\n    let selfClosing;\n    let attrQuote;\n    let attrQuoteChar;\n    let recordStart = 0;\n    let attrName;\n\n    this._handleTagOpening = function _handleTagOpening(\n      endTag,\n      tagName,\n      attrs\n    ) {\n      if (!endTag) {\n        this.emit(\"startElement\", tagName, attrs);\n        if (selfClosing) {\n          this.emit(\"endElement\", tagName);\n        }\n      } else {\n        this.emit(\"endElement\", tagName);\n      }\n    };\n\n    this.write = function write(data) {\n      if (typeof data !== \"string\") {\n        data = data.toString();\n      }\n      let pos = 0;\n\n      /* Anything from previous write()? */\n      if (remainder) {\n        data = remainder + data;\n        pos += !parseRemainder ? remainder.length : 0;\n        parseRemainder = false;\n        remainder = null;\n      }\n\n      function endRecording() {\n        if (typeof recordStart === \"number\") {\n          const recorded = data.slice(recordStart, pos);\n          recordStart = undefined;\n          return recorded;\n        }\n      }\n\n      for (; pos < data.length; pos++) {\n        switch (state) {\n          case STATE_TEXT: {\n            // if we're looping through text, fast-forward using indexOf to\n            // the next '<' character\n            const lt = data.indexOf(\"<\", pos);\n            if (lt !== -1 && pos !== lt) {\n              pos = lt;\n            }\n\n            break;\n          }\n          case STATE_ATTR_VALUE: {\n            // if we're looping through an attribute, fast-forward using\n            // indexOf to the next end quote character\n            const quot = data.indexOf(attrQuoteChar, pos);\n            if (quot !== -1) {\n              pos = quot;\n            }\n\n            break;\n          }\n          case STATE_IGNORE_COMMENT: {\n            // if we're looping through a comment, fast-forward using\n            // indexOf to the first end-comment character\n            const endcomment = data.indexOf(\"-->\", pos);\n            if (endcomment !== -1) {\n              pos = endcomment + 2; // target the '>' character\n            }\n\n            break;\n          }\n          case STATE_IGNORE_CDATA: {\n            // if we're looping through a CDATA, fast-forward using\n            // indexOf to the first end-CDATA character ]]>\n            const endCDATA = data.indexOf(\"]]>\", pos);\n            if (endCDATA !== -1) {\n              pos = endCDATA + 2; // target the '>' character\n            }\n\n            break;\n          }\n          // No default\n        }\n\n        const c = data.charCodeAt(pos);\n        switch (state) {\n          case STATE_TEXT:\n            if (c === 60 /* < */) {\n              const text = endRecording();\n              if (text) {\n                this.emit(\"text\", _escape.unescapeXML(text));\n              }\n              state = STATE_TAG_NAME;\n              recordStart = pos + 1;\n              attrs = {};\n            }\n            break;\n          case STATE_CDATA:\n            if (c === 93 /* ] */) {\n              if (data.substr(pos + 1, 2) === \"]>\") {\n                const cData = endRecording();\n                if (cData) {\n                  this.emit(\"text\", cData);\n                }\n                state = STATE_TEXT;\n              } else if (data.length < pos + 2) {\n                parseRemainder = true;\n                pos = data.length;\n              }\n            }\n            break;\n          case STATE_TAG_NAME:\n            if (c === 47 /* / */ && recordStart === pos) {\n              recordStart = pos + 1;\n              endTag = true;\n            } else if (c === 33 /* ! */) {\n              if (data.substr(pos + 1, 7) === \"[CDATA[\") {\n                recordStart = pos + 8;\n                state = STATE_CDATA;\n              } else if (\n                data.length < pos + 8 &&\n                \"[CDATA[\".startsWith(data.slice(pos + 1))\n              ) {\n                // We potentially have CDATA, but the chunk is ending; stop here and let the next write() decide\n                parseRemainder = true;\n                pos = data.length;\n              } else {\n                recordStart = undefined;\n                state = STATE_IGNORE_COMMENT;\n              }\n            } else if (c === 63 /* ? */) {\n              recordStart = undefined;\n              state = STATE_IGNORE_INSTRUCTION;\n            } else if (c <= 32 || c === 47 /* / */ || c === 62 /* > */) {\n              tagName = endRecording();\n              pos--;\n              state = STATE_TAG;\n            }\n            break;\n          case STATE_IGNORE_COMMENT:\n            if (c === 62 /* > */) {\n              const prevFirst = data.charCodeAt(pos - 1);\n              const prevSecond = data.charCodeAt(pos - 2);\n              if (\n                (prevFirst === 45 /* - */ && prevSecond === 45) /* - */ ||\n                (prevFirst === 93 /* ] */ && prevSecond === 93) /* ] */\n              ) {\n                state = STATE_TEXT;\n              }\n            }\n            break;\n          case STATE_IGNORE_INSTRUCTION:\n            if (c === 62 /* > */) {\n              const prev = data.charCodeAt(pos - 1);\n              if (prev === 63 /* ? */) {\n                state = STATE_TEXT;\n              }\n            }\n            break;\n          case STATE_TAG:\n            if (c === 62 /* > */) {\n              this._handleTagOpening(endTag, tagName, attrs);\n              tagName = undefined;\n              attrs = undefined;\n              endTag = undefined;\n              selfClosing = undefined;\n              state = STATE_TEXT;\n              recordStart = pos + 1;\n            } else if (c === 47 /* / */) {\n              selfClosing = true;\n            } else if (c > 32) {\n              recordStart = pos;\n              state = STATE_ATTR_NAME;\n            }\n            break;\n          case STATE_ATTR_NAME:\n            if (c <= 32 || c === 61 /* = */) {\n              attrName = endRecording();\n              pos--;\n              state = STATE_ATTR_EQ;\n            }\n            break;\n          case STATE_ATTR_EQ:\n            if (c === 61 /* = */) {\n              state = STATE_ATTR_QUOT;\n            }\n            break;\n          case STATE_ATTR_QUOT:\n            if (c === 34 /* \" */ || c === 39 /* ' */) {\n              attrQuote = c;\n              attrQuoteChar = c === 34 ? '\"' : \"'\";\n              state = STATE_ATTR_VALUE;\n              recordStart = pos + 1;\n            }\n            break;\n          case STATE_ATTR_VALUE:\n            if (c === attrQuote) {\n              const value = _escape.unescapeXML(endRecording());\n              attrs[attrName] = value;\n              attrName = undefined;\n              state = STATE_TAG;\n            }\n            break;\n        }\n      }\n\n      if (typeof recordStart === \"number\" && recordStart <= data.length) {\n        remainder = data.slice(recordStart);\n        recordStart = 0;\n      }\n    };\n  }\n\n  end(data) {\n    if (data) {\n      this.write(data);\n    }\n\n    /* Uh, yeah */\n    this.write = function write() {};\n  }\n}\n\nmodule.exports = SaxLtx;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(3453);\n"],"names":["root","factory","exports","module","require","define","amd","self","__WEBPACK_EXTERNAL_MODULE__8849__","__WEBPACK_EXTERNAL_MODULE__6245__","encode","string","g","btoa","decode","atob","Client","xml","jid","Connection","constructor","options","super","this","transports","send","element","args","Transport","prototype","call","sendMany","_findTransport","service","find","undefined","socketParameters","connect","Error","Socket","Parser","header","headerElement","footer","footerElement","NS","EventEmitter","promise","StreamError","parseHost","parseService","timeout","socketListeners","Object","create","parserListeners","status","socket","parser","_reset","_detachSocket","_detachParser","_streamError","condition","children","xmlns","_end","_onData","data","str","toString","emit","write","_onParserError","error","_attachSocket","listeners","bind","close","dirty","event","_status","clean","on","k","getOwnPropertyNames","removeListener","_onElement","isStreamError","is","_onStreamError","isStanza","fromElement","_onSeeOtherHost","protocol","host","getChildText","port","domain","lang","open","err","_attachParser","end","start","_jid","id","el","disconnect","promiseOnline","attrs","to","stop","fragment","p","Promise","all","restart","parent","sendReceive","then","resolve","reject","name","isNonza","Element","version","XMPPError","parseURI","URI","hostname","URL","assign","includes","text","application","second","third","delay","TimeoutError","Deferred","message","ms","setTimeout","EE","rejectEvent","timeoutId","cleanup","clearTimeout","onEvent","onError","reason","value","once","promiseDelay","race","finally","i","Math","random","slice","buildReply","stanza","from","buildReplyError","ctx","child","reply","type","append","buildError","route","ns","handler","next","middleware","entity","use","async","isQuery","getChildElements","length","isValidQuery","buildReplyResult","iqHandler","get","set","xid","StanzaError","timeoutPromise","IQCaller","handlers","Map","_route","isReply","deferred","getChild","delete","request","_childRequest","iqCaller","JID","escaping","parse","equal","a","b","equals","detectEscape","detect","escapeLocal","escape","unescapeLocal","unescape","local","resource","TypeError","setDomain","setLocal","setResource","Symbol","toPrimitive","hint","NaN","s","_domain","_local","getLocal","_resource","bare","other","toLowerCase","getDomain","getResource","defineProperty","replace","search","resourceStart","indexOf","atStart","compose","IncomingContext","OutgoingContext","listener","Context","errorHandler","catch","incoming","outgoing","incomingListener","outgoingListener","hookOutgoing","fn","push","filter","Reconnect","_timeout","scheduleReconnect","reconnect","r","fallbackConnect","uris","uri","shift","params","_connect","test","filterSupportedURIs","result","srv","Set","map","record","fetchURIs","isSecure","startsWith","secure","method","fetch","compareAltConnections","res","getChildren","link","rel","href","split","pop","sort","dns","http","records","endpoints","makeBindElement","streamFeatures","mech","sasl","SASLError","SASLFactory","authenticate","SASL","mechname","credentials","creds","username","password","server","realm","serviceType","serviceName","challenge","resp","response","mechanism","clientFirst","offered","intersection","_mechs","context","feature","ConnectionWebSocket","FramedParser","NS_FRAMING","elements","XMLError","onStartElement","cursor","onEndElement","WS","WebSocket","CODE","url","errno","code","wasClean","addEventListener","removeEventListener","createElement","escapeXML","unescapeXML","escapeXMLText","unescapeXMLText","LtxParser","onText","t","Utils","config","AddressBookService","_createClass2","proxy","_classCallCheck2","key","list","opts","isArray","contacts","force","udid","ajaxParams","getUrl","urls","addressbook","ajax","isCompact","addressbookRegistered","compact","AuthService","webSessionCheckInterval","session","setSession","_this","_this2","arguments","appId","authKey","authSecret","hasOwnProperty","webSession","sessionParams","generateCreateSessionParams","signature","signParams","qr_code","setCurrentUserId","user_id","_this3","dataType","long","createSession","callback","_this4","interval","getSessionTimeInterval","timeoutError","timeleft","getSessionTimeout","_clearWebSessionCheckTimer","clearInterval","setInterval","getSession","webToken","web_token","_this5","login","user","api","chat","muc","hash","chatProtocol","bosh","websocket","active","contactList","subscriptionMode","mutual","streamManagement","enable","ping","timeInterval","videochat","alwaysRelayCalls","answerTimeInterval","dialingTimeInterval","disconnectTimeInterval","statsReportTimeInterval","iceServers","credential","conference","whiteboard","users","blobs","subscriptions","events","meetings","whiteboards","calls","sessionExpired","xmppDataWrite","xmppDataRead","debug","mode","_typeof2","keys","forEach","nextkey","DataService","className","concat","item","index","isObject","permissions","_objectSpread","_id","search_criteria","requestedData","requestedTypeOf","fetchImpl","formDataImpl","_adapter","_mediaDevices","_MediaStream","_MediaStreamTrack","_RTCPeerConnection","_RTCSessionDescription","_RTCIceCandidate","_RTCRtpReceiver","_RTCRtpSender","_navigator","getEnv","browser","FormData","window","adapter","navigator","mediaDevices","MediaStream","MediaStreamTrack","RTCIceCandidate","RTCPeerConnection","RTCSessionDescription","RTCRtpReceiver","RTCRtpSender","node","IS_BROWSER_ENV","document","IS_RN_ENV","product","IS_NS_ENV","global","android","NSObject","IS_NODE_ENV","process","versions","IS_EXPO_ENV","Expo","InternalUtils","nativescript","reactnative","expo","_require","RTCView","isRNWebRTCAvailable","listenerCall","callbackName","argumentsCopy","apply","console","floor","Date","now","base","extension","arr","obj","timestamp","unixTime","increment","ObjectId","substr","machine","pid","loggers","logger","consoleLoggerFunction","log","Array","j","info","errors","ex","arrayTo","arrayFrom","merged","cloneObject","firstLevel","newItem","encodeURIComponent","match","p1","String","fromCharCode","encodeToBase64","Buffer","application_id","auth_key","nonce","randomNonce","guest","email","provider","scope","token","secret","cryptoSessionMsg","sessionMsg","val","val1","join","sha1","sha256","Blob","size","body","JSON","stringify","getSizeOfString","headers","getDateSize","escapeNull","json","jsonObject","ConnectyCube","isWebRTCAvailable","configMap","Proxy","Auth","Users","Storage","PushNotifications","Data","AddressBook","Chat","DialogProxy","MessageProxy","Meeting","Whiteboard","auth","storage","pushnotifications","dialog","meeting","utils","WebRTCClient","ConferenceClient","xmppClient","videochatconference","webrtcSignalingProcessor","signalingProcessor","destroySession","createWebSession","checkWebSessionUntilUpgrade","upgradeWebSession","logout","CB","Config","MEETINGS_API_URL","MeetingService","startTimestamp","ceil","endTimestamp","defaultParams","toLocaleString","year","month","day","hour","minute","start_date","end_date","attendees","HTTPProxy","sdkInstance","currentUserId","requestsNumber","abortControllersMap","userId","requestId","DLog","requestBody","isGetOrHeadType","isPostOrPutType","isInternalRequest","isMultipartFormData","contentType","requestURL","requestObject","buildRequestBody","dataObject","useArrayQuery","fileToCustomObject","serializeQueryParams","prefix","level","parts","propName","propQueryName","isArrayVal","_encodeURIComponent","_x","c","charCodeAt","abortId","controllers","values","controller","abort","abort_id","createdControllersCount","doneRequestsCount","logRequest","requestAndURL","buildRequestAndURL","AbortController","signal","processSuccessfulOrFailedRequest","ok","processAjaxResponse","processAjaxError","responseBody","logResponse","statusCode","errorObject","isExpiredSessionError","handleExpiredSessionResponse","PushNotificationsService","SubscriptionsService","EventsService","base64Encode","toBase64","StorageService","blob","file","isPublic","content_type","createParams","public","_ref","blb","parseUri","blob_object_access","authority","path","queryKey","decodeURIComponent","upload","markUploaded","uid","fileUID","o","m","strictMode","exec","q","$0","$1","$2","strict","loose","UsersService","filters","order","field","DATE_FIELDS","NUMBER_FIELDS","generateFilter","full_name","facebook_id","twitter_id","phone","tags","external","getCurrentUserId","param","WHITEBOARDS_API_URL","WHITEBOARDS_SERVER","WhiteboardService","title","paramsOrId","chat_dialog_id","ChatUtils","ChatHelpers","StreamManagement","ContactListProxy","PrivacyListProxy","MucProxy","XMPP","ChatService","client","stanzasCallbacks","earlyIncomingMessagesQueue","isConnected","_isConnecting","_isLogout","_isReconnect","_checkPingTimer","helpers","xmppClientListeners","connectPromise","privacylist","_sentMessageCallback","messageLost","messageSent","onSentMessageCallback","onChatStatusListener","onConnectionErrorListener","onDisconnectedListener","onReconnectListener","onMessageListener","onSystemMessageListener","onMessageErrorListener","onMessageTypingListener","onMessageUpdateListener","onMessageDeleteListener","onMessageReactionsListener","onDeliveredStatusListener","onReadStatusListener","onLastUserActivityListener","onSubscribeListener","onConfirmSubscribeListener","onRejectSubscribeListener","onContactListListener","onJoinOccupant","onLeaveOccupant","onKickOccupant","callbackConnect","callbackOnline","startPingTimer","_postConnectActions","callbackOffline","callbackDisconnect","safeCallbackCall","stopPingTimer","callbackStatus","callbackStanza","_onPresence","_onIQ","_onSystemMessageListener","_onMessageErrorListener","_onMessage","callbackError","callbackOutput","callTrafficUsageCallback","callbackInput","buildUserJidLocalPart","iqParams","getUniqueId","iqStanza","createIqStanza","getElement","buildErrorFromXMPPErrorStanza","_","validTime","jidOrUserId","stanzaParams","getUserCurrentJid","typeChat","getBsonObjectId","messageStanza","createMessageStanza","up","markable","filledExtraParams","messageId","dialogId","originMessageId","last","_this6","_this6$_onLastActivit","_onLastActivityStanza","seconds","getAttr","getUserIdFromJID","query","joinedRooms","setUserCurrentJid","_removeElementHandler","toISOString","chat_dialog_ids","rawStanza","extraParamsParsed","recipientId","recipient","forwardedStanza","getElementTreePath","delivered","read","replaceSubElement","reactionsSubElement","removeSubElement","composing","paused","invite","extraParams","bodyContent","getElementText","isForwarded","getDialogIdFromJID","getIdFromResource","marker","parseExtraParams","_ChatUtils$parseReact","parseReactions","add","remove","userCurrentJid","autoSendReceiveStatusParams","sendDeliveredStatus","dialog_id","recipient_id","is_forwarded","xXMLNS","x","endsWith","getUserIdFromRoomJid","actorElement","initiatorUserJid","initiatorId","getRoomJidFromRoomFullJid","parseInt","contact","subscription","ask","_sendSubscriptionPresence","createPresenceStanza","stanzaId","moduleIdentifier","presence","sentMessageCallback","_enableCarbons","stanzasCallback","carbonParams","_isEnable","user_jid","_setSubscriptionToUserLastActivity","_userCurrentJid","suffix","isNumeric","getUserJid","getRoomJidFromDialogId","chatType","splice","arrayElements","identifier","ChatInternalUtils","elementName","attrName","getAttribute","attr","elName","querySelector","querySelectorAll","txt","textContent","elementsPath","reduce","prevStanza","elem","msg","_JStoXML","objChildNodes","childNodes","subNode","subNodeChildNodes","subNodeTagName","tagName","subNodeTextContent","_XMLtoJS","attach","attributes","attachments","attrKeys","l","errorStanza","errorElement","uuid","reactionsEl","reactions","reactionEl","reaction","acc","parsedReaction","ContactListService","items","len","isUniqName","userJid","presenceParams","presenceStanza","DIALOGS_API_URL","ChatDialogsService","occupants_ids","idOrIds","admins_ids","push_all","pull_all","subscribe","unsubscribe","enabled","settings","MESSAGES_API_URL","ChatMessagesService","updateReaction","addReaction","removeReaction","GroupChatService","dialogIdOrJid","dialogJid","getDialogJid","getRoomJid","maxstanzas","errorEl","errorMessage","PrivacyListService","userMuc","userAction","mutualBlock","listUserId","listPrivacy","action","iq","createPrivacyItem","jidOrMuc","createPrivacyItemMutal","getUserNickWithMucDomain","isErrorStanza","usersList","stanzaQuery","listWithUpdates","getList","existentList","updatedList","mergeArrays","defaultList","activeList","allLists","defaultName","activeName","allNames","default","names","StreamManagementService","_NS","_isStreamManagementEnabled","_clientProcessedStanzasCounter","_clientSentStanzasCounter","_lastAck","_xmppClient","_originalSend","_unackedQueue","_incomingStanzaHandler","nodeTree","_increaseReceivedStanzasCounter","h","_checkCounterOnIncomeStanza","answerStanza","createNonza","connection","enableParams","_addElementHandler","getAllElements","_sendStanzasRequest","expect","numAcked","_interopRequireDefault","_defineProperty2","_slicedToArray2","_objectWithoutProperties2","_excluded","_reconnect","_websocket","_middleware","_streamFeatures","_iqCaller","_iqCallee","_resolve","_sasl","_resourceBinding","_sessionEstablishment","anonymous","plain","iqCallee","resourceBinding","sessionEstablishment","mechanisms","entries","_ref2","v","Helpers","SessionConnectionState","PeerConnectionState","_init","delegate","userID","sessionID","trace","remoteSDP","state","NEW","remoteStream","ontrack","onAddRemoteMediaCallback","onicecandidate","onIceCandidateCallback","onsignalingstatechange","onSignalingStateCallback","oniceconnectionstatechange","onIceConnectionStateCallback","onStatusClosedChecker","dialingTimer","statsReportTimer","iceCandidates","released","release","_clearDialingTimer","_clearStatsReportTimer","getVersionSafari","updateRemoteSDP","newSDP","getRemoteSDP","setRemoteSessionDescription","desc","sdp","setRemoteDescription","getAndSetLocalSessionDescription","maxBandwidth","offerAnswerOptions","CONNECTING","createOffer","offer","setLocalDescription","setRTCRtpSenderMaxBandwidth","iceRestart","createAnswer","answer","getSenders","sender","track","kind","_params$encodings$","getParameters","encodings","maxBitrate","setParameters","addCandidates","candidate","sdpMLineIndex","sdpMid","addIceCandidate","traceError","signalingState","_processIceCandidates","iceCandidateData","_onRemoteStreamListener","addTrack","callType","getVideoTracks","getAudioTracks","_getStatsWrap","iceConnectionState","_onSessionConnectionStateChangedListener","conState","CHECKING","_clearWaitingReconnectTimer","CONNECTED","COMPLETED","FAILED","_startWaitingReconnectTimer","DISCONNECTED","CLOSED","statsReportInterval","lastResult","isNaN","peer","lastResults","statistic","audio","video","remote","getVersionFirefox","localStream","getLocalStreams","localVideoSettings","getSettings","frameHeight","height","frameWidth","width","getStats","results","bytesReceived","mediaType","bitrate","_getBitratePerSecond","packetsReceived","framerateMean","framesPerSecond","round","bytesSent","packetsSent","candidateType","mozLocalTransport","transport","ip","ipAddress","portNumber","remoteSource","_getFramesPerSecond","_onCallStatsReport","successCallback","isLocal","framesSent","framesReceived","_getStats","waitingReconnectTimeoutCallback","_closeSessionIfAllConnectionsClosed","_startDialingTimer","withOnNotAnswerCallback","_dialingCallback","skipIncrement","_processOnNotAnswer","_processCall","WebRTCSession","WebRTCSignalingProcessor","WebRTCSignalingProvider","cubeWebRTCConstants","SessionState","signalingProvider","CallType","sessions","ondevicechange","_onDevicesChangeListener","onCallListener","onAcceptCallListener","onRejectCallListener","onStopCallListener","onUserNotAnswerListener","onInvalidEventsListener","onRemoteStreamListener","onSessionConnectionStateChangedListener","onSessionCloseListener","onCallStatsReport","onDevicesChangeListener","spec","specDevices","enumerateDevices","devices","device","opponentsIDs","callerID","_createAndStoreSession","initiatorID","opIDs","newSession","currentUserID","ID","sessionId","userInfo","_processOnCall","ACTIVE","traceWarning","_processOnAccept","_processOnReject","_processOnStop","_processOnIceCandidates","_processOnIceRestart","_processOnIceRestartAccept","SignalingConstants","MODULE_ID","SignalingType","CALL","ACCEPT","REJECT","STOP","RESTART","RESTART_ACCEPT","CANDIDATE","UNDEFINED","HUNGUP","REJECTED","VIDEO","AUDIO","WebRTCHelpers","warn","ua","userAgent","ffInfo","sVer","MediaDevicesImpl","d","getTime","peerConnections","mediaParams","answerTimer","startCallTime","acceptCallTime","getDisplayMedia","elementId","stream","_upsertStream","getUserMedia","shouldUpdateCurrentStream","getTracks","removeTrack","_replaceTracks","detachMediaStream","attachMediaStream","peers","every","replaceTrack","peerConnection","getElementById","srcObject","src","createObjectURL","muted","mirror","style","webkitTransform","transform","onloadedmetadata","e","play","pause","deviceIds","deviceId","ext","_prepareExtension","_callInternal","_this7","_createPeer","_this8","_clearAnswerTimer","_acceptInternal","oppIDs","_uniqueOpponentsIDsWithoutInitiator","offerTime","_startWaitingOfferOrAnswerTimer","opID","_this9","localDescription","sendMessage","_this10","_close","_this11","_this12","_muteStream","_this13","_uniqueOpponentsIDs","pConn","_startAnswerTimer","_clearWaitingOfferOrAnswerTimer","_this14","pcKeys","pc","_this15","sendCandidate","stats","connectionState","peerConnectionType","iceServersCopy","pcConfig","iceTransportPolicy","_this16","_closeLocalMediaStream","_this17","isAllConnectionsClosed","peerState","peerCon","audioTrack","videoTrack","_this18","waitingOfferOrAnswerTimer","time","_this19","_this20","opponents","_this21","_getExtension","signalType","_onCallListener","_onAcceptListener","_onRejectListener","_onStopListener","_onIceCandidatesListener","_onIceRestartListener","_onIceRestartAcceptListener","opponent","childrenNodes","extraParamsChildNodes","itemTagName","len2","len3","childName","childValue","len2v","wholeNodeContent","signalingConnection","signalingType","platform","opponentId","Janus","coreConfig","_require3","JANUS_EVENTS","JANUS_MEDIA_TRACKS_REASONS","JanusVideoConferencingWrapper","configParams","configs","engine","videoRoomPlugin","isOnlyAudio","currentRoomId","remoteFeeds","remoteJseps","remoteFeedsAttachingInProgress","bitrateTimers","emitter","callbacks","init","isWebrtcSupported","success","destroyed","timeoutSessionCallback","getSessionId","destroy","isRemote","skipMedia","remoteFeed","displayName","plugin","pluginHandle","listen","room","ptype","feed","display","consentDialog","mediaState","medium","webrtcState","slowLink","uplink","nacks","iceState","onmessage","jsep","feedId","offerParams","media","publishers","f","userDisplayName","PARTICIPANT_JOINED","detachRemoteFeed","PARTICIPANT_LEFT","ERROR","handleRemoteJsep","onlocaltrack","onLocalTrack","onremotetrack","mid","metadata","onRemoteTrack","ondataopen","channelLabel","DATA_CHANNEL_OPEN","ondata","DATA_CHANNEL_MESSAGE","oncleanup","detached","eventType","CREATED","isStreamNoExistedBefore","tracks","REMOTE_STREAM","ENDED","trackToRemove","streamTrack","REMOTE_TRACKS_UPDATED","getId","detach","roomId","joinEvent","leaveEvent","listRequest","participants","isAudioMuted","unmuteAudio","muteAudio","audioTracks","isVideoMuted","unmuteVideo","muteVideo","videoTracks","mediaDeviceId","configureRequest","keyframe","capture","recv","existedStream","createOfferParams","tracksFromStream","getTracksFromStream","tracksFromParams","customizeSdp","publish","getTracksMidsFromStream","getBitrate","resultCallback","getLocalVolume","getRemoteVolume","browserDetails","addListener","removeAllListeners","ConferenceSession","DEVICE_INPUT_TYPES","CALL_TYPES","sessionsStore","onParticipantJoinedListener","onParticipantLeftListener","onSlowLinkListener","onRemoteTracksUpdatedListener","onRemoteConnectionStateChangedListener","onDataChannelOpenedListener","onDataChannelMessageListener","onErrorListener","getCurrentSessionToken","_getMediaDevices","_asyncToGenerator2","_regenerator","mark","_callee","deviceInputType","wrap","_context","prev","_listDevices","sent","abrupt","session_id","LOCAL_STREAM","MUTE","UNMUTE","JanusVideoConferencingClient","janusConfig","_clientConf","_setOnParticipantJoinListener","_setOnParticipantLeftListener","_setOnRemoteStreamListener","_setOnRemoteTracksUpdatedListener","_setOnDataChannelOpenListener","_setOnDataChannelMessageListener","_setOnErrorListener","currentUserDisplayName","webrtcStuff","isResolved","_onError","_join2","_createSession","_createHandler","_join","_x2","_x3","_joinAsListener","_callee2","_context2","_x4","_x5","_x6","sendKeyframeRequest","_createListener2","_callee3","_context3","_x7","attachVideoConferencingPlugin","_onRemoteIceStateChanged","_onLocalIceStateChanged","_onSlowLink","_onParticipantJoined","_onParticipantLeft","_onRemoteStream","_onRemoteTracksUpdated","_onDataChannelOpen","_onDataChannelMessage","isExistingParticipant","_createListener","label","listOnlineParticipants","_leave","_callee4","_context4","_leaveGroup","_detachVideoConferencingPlugin","_destroy","leave","detachVideoConferencingPlugin","currentPublisherPC","constraints","_switchVideo","_switchAudio","_switchMediaTracks","newLocalStream","newStreamTracks","pcSenders","toggleVideoMute","toggleAudioMute","getVolume","getUserBitrate","getUserVolume","_sendData","_callee5","sendParams","_context5","pluginParams","_x8","_x9","mobile","isExtensionEnabled","chromever","maxver","isInstalled","defaultExtension","extensionId","getScreen","pending","cache","postMessage","origin","location","sourceId","gatewayCallbacks","noop","initDone","websockets","ws","wsHandlers","wsKeepaliveTimeoutId","servers","serversIndex","bundlePolicy","withCredentials","maxev","max_poll_events","apisecret","destroyOnUnload","keepAlivePeriod","longPollTimeout","getMaxBitrates","simulcastMaxBitrates","maxBitrates","high","low","connected","pluginHandles","that","retries","transactions","eventHandler","longpoll","httpAPICall","verb","handleEvent","textStatus","errorThrown","skipTimeout","remoteSdp","completed","endOfCandidates","candidates","hangup","ondetached","transaction","reportSuccess","plugindata","vdebug","keepAlive","janus","randomString","onopen","onerror","onclose","eventName","newWebSocket","handleId","e2ee","rid_order","force_relay","sendTrickleCandidate","createDataChannel","dclabel","dcprotocol","pendingData","onDataChannelStateChange","target","dcState","dataChannel","readyState","_step4","_iterator4","_createForOfIteratorHelper","n","done","dcoptions","dataChannelOptions","sendData","dataChanDefaultLabel","sendDtmf","dtmfSender","audioSender","dtmf","ontonechange","tone","tones","duration","gap","insertDTMF","destroyHandle","noRequest","cleanupWebrtc","createPeerconnectionIfNeeded","pc_config","insertableStreams","_step5","_iterator5","transforms","receiver","createEncodedStreams","createEncodedAudioStreams","createEncodedVideoStreams","forceEncodedAudioInsertableStreams","forceEncodedVideoInsertableStreams","encodedInsertableStreams","volume","trickle","iceDone","mySdp","sdpSent","sendSDP","streams","transceiver","_mid","onended","trackMutedTimeoutId","ev","transceivers","getTransceivers","_receiver","_track","onmute","onunmute","prepareWebrtc","_prepareWebrtc","_iterator10","_step10","_offer","webrtcError","mediaToTracks","simulcast","simulcast2","svc","t0","finish","captureDevices","t1","prepareWebrtcPeer","_createOffer","mediaConstraints","_createAnswer","replaceTracks","_replaceTracks2","_iterator11","_step11","_x10","_x11","_captureDevices","openedConsentDialog","groups","_iterator12","_step12","_group","_i","_keys","group","_iterator13","_step13","_loop","_context6","gumGroup","nt","trackId","_stream","otherType","otherTrack","otherConstraints","newDirection","parameters","_maxBitrates","mimeType","codecs","_params","senderStreams","receiverStreams","_mimeType","_codecs","_receiverStreams","rt","_iterator14","_step14","_iterator15","_step15","_t","curdir","newdir","ondatachannel","channel","trackConstraints","direction","setDirection","myStream","webRTCAdapter","addTransceiver","sendEncodings","rid","scaleResolutionDownBy","scalabilityMode","codec","getCapabilities","setCodecPreferences","framerate","maxFramerate","createAudioEncodedStreams","readableStream","writableStream","pipeThrough","pipeTo","readable","writable","dontStop","delegateYield","t2","getLocalTracks","_step6","_iterator6","tr","getRemoteTracks","_step7","_iterator7","audioLevel","isMuted","mute","_step8","_iterator8","_step9","_iterator9","timer","bsnow","bsbefore","tsnow","tsbefore","inStats","googCodecName","timePassed","bitRate","setBitrate","hangupRequest","streamExternal","stopAllTracks","getServer","getInfo","unload","notifyDestroyed","cleanupHandles","sendBeacon","unbindWebSocket","onUnbindMessage","onUnbindError","ordered","opaqueId","loopIndex","handleToken","opaque_id","loop_index","started","getPlugin","setMaxBitrate","sendRequest","createHandle","useDefaultDependencies","deps","socketCls","proto","fetchOptions","Accept","fetching","timerId","parsed","useOldDependencies","jq","jQuery","payload","xhrFields","extend","xhr","keepAudio","audioSend","audioRecv","addAudio","replaceAudio","removeAudio","keepVideo","videoSend","videoRecv","addVideo","replaceVideo","removeVideo","screenshareFrameRate","frameRate","screenshareHeight","screenshareWidth","ideal","_step","_iterator","mst","_step2","_iterator2","usedDependencies","dependencies","listDevices","isGetUserMediaAvailable","safariVp8","_step3","_iterator3","testpc","offerToReceiveVideo","randomPoz","charSet","charAt","CryptoJS","crypto","globalThis","msCrypto","cryptoSecureRandomInt","getRandomValues","Uint32Array","randomBytes","readInt32LE","F","subtype","C","C_lib","lib","Base","overrides","mixIn","$super","instance","properties","propertyName","clone","WordArray","words","sigBytes","encoder","Hex","wordArray","thisWords","thatWords","thisSigBytes","thatSigBytes","clamp","thatByte","nBytes","C_enc","enc","hexChars","bite","hexStr","hexStrLength","Latin1","latin1Chars","latin1Str","latin1StrLength","Utf8","utf8Str","BufferedBlockAlgorithm","reset","_data","_nDataBytes","_append","_process","doFlush","processedWords","dataWords","dataSigBytes","blockSize","nBlocksReady","nWordsReady","max","_minBufferSize","nBytesReady","min","offset","_doProcessBlock","C_algo","Hasher","cfg","_doReset","update","messageUpdate","finalize","_doFinalize","_createHelper","hasher","_createHmacHelper","HMAC","algo","HmacSHA1","HmacSHA256","_hasher","hasherBlockSize","hasherBlockSizeBytes","oKey","_oKey","iKey","_iKey","oKeyWords","iKeyWords","innerHash","W","SHA1","_hash","M","H","nBitsTotal","nBitsLeft","K","isPrime","sqrtN","sqrt","factor","getFractionalBits","nPrime","pow","SHA256","gamma0x","gamma0","gamma1x","gamma1","maj","sigma0","ReflectOwnKeys","R","Reflect","ReflectApply","Function","ownKeys","getOwnPropertySymbols","NumberIsNaN","Number","errorListener","resolver","eventTargetAgnosticAddListener","addErrorHandlerIfEventEmitter","_events","_eventsCount","_maxListeners","defaultMaxListeners","checkListener","_getMaxListeners","_addListener","prepend","existing","warning","newListener","unshift","warned","w","count","onceWrapper","fired","wrapFn","_onceWrap","wrapped","_listeners","unwrap","evlistener","ret","unwrapListeners","arrayClone","listenerCount","copy","flags","wrapListener","arg","enumerable","RangeError","getPrototypeOf","setMaxListeners","getMaxListeners","doError","er","prependListener","prependOnceListener","position","originalListener","spliceOne","off","rawListeners","eventNames","fbemitter","EmitterSubscription","EventSubscriptionVendor","invariant","emptyFunction","BaseEventEmitter","_subscriber","_currentSubscription","_proto","addSubscription","removeCurrentListener","removeAllSubscriptions","removeSubscription","getSubscriptionsForType","thatReturnsTrue","ii","__emitToSubscription","_EventSubscription","subClass","superClass","subscriber","__proto__","EventSubscription","_subscriptionsForType","subscriptionsForType","makeEmptyFunction","thatReturns","thatReturnsFalse","thatReturnsNull","thatReturnsThis","thatReturnsArgument","format","_len","_key","argIndex","framesToPop","dispatch","Mechanism","cred","chal","authzid","Factory","mechs","jlen","entry","__esModule","asyncGeneratorStep","u","_next","_throw","toPropertyKey","_defineProperties","configurable","iterator","objectWithoutPropertiesLoose","propertyIsEnumerable","_typeof","_regeneratorRuntime","asyncIterator","toStringTag","Generator","makeInvokeMethod","tryCatch","y","GeneratorFunction","GeneratorFunctionPrototype","defineIteratorMethods","_invoke","AsyncIterator","invoke","__await","callInvokeWithMethodAndArg","maybeInvokeDelegate","_sent","dispatchException","resultName","nextLoc","pushTryEntry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","isGeneratorFunction","setPrototypeOf","awrap","reverse","rval","handle","complete","arrayWithHoles","iterableToArrayLimit","unsupportedIterableToArray","nonIterableRest","arrayLikeToArray","runtime","regeneratorRuntime","accidentalStrictMode","_escape","setAttrs","getName","getNS","idx","findNS","getXmlns","namespaces","getChildByAttr","recursive","getChildrenByAttr","flat","getChildrenByFilter","getText","cnode","nodes","_addChildren","writer","tree","__source","__self","escapeXMLTable","escapeXMLReplace","unescapeXMLTable","unescapeXMLReplace","num","fromCodePoint","previous","substring","SaxLtx","remainder","parseRemainder","endTag","selfClosing","attrQuote","attrQuoteChar","recordStart","_handleTagOpening","pos","endRecording","recorded","lt","quot","endcomment","endCDATA","cData","prevFirst","prevSecond","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","loaded","__webpack_modules__","nmd","paths"],"sourceRoot":""}