1 | {"version":3,"file":"twitch.js","sources":["../node_modules/tslib/tslib.es6.js","../node_modules/eventemitter3/index.js","../node_modules/delay/index.js","../node_modules/p-cancelable/index.js","../node_modules/p-finally/index.js","../node_modules/p-event/node_modules/p-timeout/index.js","../node_modules/p-event/index.js","../node_modules/p-timeout/index.js","../node_modules/lodash/_freeGlobal.js","../node_modules/lodash/_root.js","../node_modules/lodash/_Symbol.js","../node_modules/lodash/_getRawTag.js","../node_modules/lodash/_objectToString.js","../node_modules/lodash/_baseGetTag.js","../node_modules/lodash/isObject.js","../node_modules/lodash/isFunction.js","../node_modules/lodash/_isMasked.js","../node_modules/lodash/_coreJsData.js","../node_modules/lodash/_toSource.js","../node_modules/lodash/_baseIsNative.js","../node_modules/lodash/_getValue.js","../node_modules/lodash/_getNative.js","../node_modules/lodash/_nativeCreate.js","../node_modules/lodash/_hashClear.js","../node_modules/lodash/_hashDelete.js","../node_modules/lodash/_hashGet.js","../node_modules/lodash/_hashHas.js","../node_modules/lodash/_hashSet.js","../node_modules/lodash/_Hash.js","../node_modules/lodash/_listCacheClear.js","../node_modules/lodash/eq.js","../node_modules/lodash/_assocIndexOf.js","../node_modules/lodash/_listCacheDelete.js","../node_modules/lodash/_listCacheGet.js","../node_modules/lodash/_listCacheHas.js","../node_modules/lodash/_listCacheSet.js","../node_modules/lodash/_ListCache.js","../node_modules/lodash/_Map.js","../node_modules/lodash/_mapCacheClear.js","../node_modules/lodash/_isKeyable.js","../node_modules/lodash/_getMapData.js","../node_modules/lodash/_mapCacheDelete.js","../node_modules/lodash/_mapCacheGet.js","../node_modules/lodash/_mapCacheHas.js","../node_modules/lodash/_mapCacheSet.js","../node_modules/lodash/_MapCache.js","../node_modules/lodash/_setCacheAdd.js","../node_modules/lodash/_setCacheHas.js","../node_modules/lodash/_SetCache.js","../node_modules/lodash/_baseFindIndex.js","../node_modules/lodash/_baseIsNaN.js","../node_modules/lodash/_strictIndexOf.js","../node_modules/lodash/_baseIndexOf.js","../node_modules/lodash/_arrayIncludes.js","../node_modules/lodash/_arrayIncludesWith.js","../node_modules/lodash/_cacheHas.js","../node_modules/lodash/_Set.js","../node_modules/lodash/noop.js","../node_modules/lodash/_setToArray.js","../node_modules/lodash/_createSet.js","../node_modules/lodash/_baseUniq.js","../node_modules/lodash/uniq.js","../src/twitch.ts","../node_modules/quick-format-unescaped/index.js","../node_modules/pino/browser.js","../src/utils/logger/index.ts","../shims/ws.js","../node_modules/p-queue/node_modules/p-timeout/index.js","../node_modules/p-queue/dist/lower-bound.js","../node_modules/p-queue/dist/priority-queue.js","../node_modules/p-queue/dist/index.js","../src/Client/constants.ts","../node_modules/tekko/dist/errors.js","../node_modules/tekko/dist/helpers.js","../node_modules/tekko/dist/parse.js","../node_modules/camelcase-keys/node_modules/map-obj/index.js","../node_modules/camelcase/index.js","../node_modules/quick-lru/index.js","../node_modules/camelcase-keys/index.js","../node_modules/lodash/_isPrototype.js","../node_modules/lodash/_overArg.js","../node_modules/lodash/_nativeKeys.js","../node_modules/lodash/_baseKeys.js","../node_modules/lodash/_DataView.js","../node_modules/lodash/_Promise.js","../node_modules/lodash/_WeakMap.js","../node_modules/lodash/_getTag.js","../node_modules/lodash/isObjectLike.js","../node_modules/lodash/_baseIsArguments.js","../node_modules/lodash/isArguments.js","../node_modules/lodash/isArray.js","../node_modules/lodash/isLength.js","../node_modules/lodash/isArrayLike.js","../node_modules/lodash/stubFalse.js","../node_modules/lodash/isBuffer.js","../node_modules/lodash/_baseIsTypedArray.js","../node_modules/lodash/_baseUnary.js","../node_modules/lodash/_nodeUtil.js","../node_modules/lodash/isTypedArray.js","../node_modules/lodash/isEmpty.js","../node_modules/lodash/_arrayMap.js","../node_modules/lodash/isSymbol.js","../node_modules/lodash/_baseToString.js","../node_modules/lodash/toString.js","../node_modules/lodash/toLower.js","../src/Client/utils/parsers/helpers.ts","../src/Client/utils/parsers/index.ts","../node_modules/invariant/browser.js","../node_modules/lodash/_baseConformsTo.js","../node_modules/lodash/_baseTimes.js","../node_modules/lodash/_isIndex.js","../node_modules/lodash/_arrayLikeKeys.js","../node_modules/lodash/keys.js","../node_modules/lodash/conformsTo.js","../node_modules/lodash/identity.js","../node_modules/lodash/_apply.js","../node_modules/lodash/_overRest.js","../node_modules/lodash/constant.js","../node_modules/lodash/_defineProperty.js","../node_modules/lodash/_baseSetToString.js","../node_modules/lodash/_shortOut.js","../node_modules/lodash/_setToString.js","../node_modules/lodash/_baseRest.js","../node_modules/lodash/_isIterateeCall.js","../node_modules/lodash/_nativeKeysIn.js","../node_modules/lodash/_baseKeysIn.js","../node_modules/lodash/keysIn.js","../node_modules/lodash/defaults.js","../node_modules/lodash/isString.js","../node_modules/lodash/isFinite.js","../node_modules/lodash/isBoolean.js","../node_modules/lodash/isNil.js","../node_modules/lodash/_baseRandom.js","../node_modules/lodash/toNumber.js","../node_modules/lodash/toFinite.js","../node_modules/lodash/random.js","../src/Client/types.ts","../src/Client/utils/sanitizers.ts","../src/Client/Client.ts","../src/Client/utils/validators.ts","../src/Client/utils/utils.ts","../node_modules/ts-custom-error/dist/custom-error.mjs","../src/utils/BaseError.ts","../src/Chat/Errors.ts","../node_modules/lodash/_createRelationalOperation.js","../node_modules/lodash/gt.js","../node_modules/lodash/_baseGt.js","../node_modules/lodash/toUpper.js","../src/Chat/constants.ts","../node_modules/lodash/_baseSlice.js","../node_modules/lodash/_castSlice.js","../node_modules/lodash/_hasUnicode.js","../node_modules/lodash/_asciiToArray.js","../node_modules/lodash/_unicodeToArray.js","../node_modules/lodash/_stringToArray.js","../node_modules/lodash/_createCaseFirst.js","../node_modules/lodash/upperFirst.js","../node_modules/lodash/capitalize.js","../node_modules/lodash/_arrayReduce.js","../node_modules/lodash/_basePropertyOf.js","../node_modules/lodash/_deburrLetter.js","../node_modules/lodash/deburr.js","../node_modules/lodash/_asciiWords.js","../node_modules/lodash/_hasUnicodeWord.js","../node_modules/lodash/_unicodeWords.js","../node_modules/lodash/words.js","../node_modules/lodash/_createCompounder.js","../node_modules/lodash/camelCase.js","../node_modules/lodash/replace.js","../src/Chat/types.ts","../src/Chat/utils/parsers/helpers.ts","../src/Chat/utils/parsers/tags.ts","../src/Chat/utils/parsers/index.ts","../src/Chat/utils/index.ts","../src/Chat/utils/sanitizers.ts","../src/Chat/utils/validators.ts","../src/Chat/Chat.ts","../node_modules/lodash/toInteger.js","../node_modules/lodash/_baseValues.js","../node_modules/lodash/values.js","../node_modules/lodash/includes.js","../node_modules/cross-fetch/dist/browser-ponyfill.js","../shims/form-data.js","../node_modules/qs/lib/utils.js","../node_modules/qs/lib/formats.js","../node_modules/qs/lib/stringify.js","../node_modules/qs/lib/parse.js","../src/utils/fetch/Error.ts","../node_modules/lodash/isUndefined.js","../src/Api/types.ts","../src/Api/utils/validators.ts","../src/Api/Api.ts","../src/utils/fetch/fetch.ts","../src/index.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","'use strict';\n\n// From https://github.com/sindresorhus/random-int/blob/c37741b56f76b9160b0b63dae4e9c64875128146/index.js#L13-L15\nconst randomInteger = (minimum, maximum) => Math.floor((Math.random() * (maximum - minimum + 1)) + minimum);\n\nconst createAbortError = () => {\n\tconst error = new Error('Delay aborted');\n\terror.name = 'AbortError';\n\treturn error;\n};\n\nconst createDelay = ({clearTimeout: defaultClear, setTimeout: set, willResolve}) => (ms, {value, signal} = {}) => {\n\tif (signal && signal.aborted) {\n\t\treturn Promise.reject(createAbortError());\n\t}\n\n\tlet timeoutId;\n\tlet settle;\n\tlet rejectFn;\n\tconst clear = defaultClear || clearTimeout;\n\n\tconst signalListener = () => {\n\t\tclear(timeoutId);\n\t\trejectFn(createAbortError());\n\t};\n\n\tconst cleanup = () => {\n\t\tif (signal) {\n\t\t\tsignal.removeEventListener('abort', signalListener);\n\t\t}\n\t};\n\n\tconst delayPromise = new Promise((resolve, reject) => {\n\t\tsettle = () => {\n\t\t\tcleanup();\n\t\t\tif (willResolve) {\n\t\t\t\tresolve(value);\n\t\t\t} else {\n\t\t\t\treject(value);\n\t\t\t}\n\t\t};\n\n\t\trejectFn = reject;\n\t\ttimeoutId = (set || setTimeout)(settle, ms);\n\t});\n\n\tif (signal) {\n\t\tsignal.addEventListener('abort', signalListener, {once: true});\n\t}\n\n\tdelayPromise.clear = () => {\n\t\tclear(timeoutId);\n\t\ttimeoutId = null;\n\t\tsettle();\n\t};\n\n\treturn delayPromise;\n};\n\nconst delay = createDelay({willResolve: true});\ndelay.reject = createDelay({willResolve: false});\ndelay.range = (minimum, maximum, options) => delay(randomInteger(minimum, maximum), options);\ndelay.createWithTimers = ({clearTimeout, setTimeout}) => {\n\tconst delay = createDelay({clearTimeout, setTimeout, willResolve: true});\n\tdelay.reject = createDelay({clearTimeout, setTimeout, willResolve: false});\n\treturn delay;\n};\n\nmodule.exports = delay;\n// TODO: Remove this for the next major release\nmodule.exports.default = delay;\n","'use strict';\n\nclass CancelError extends Error {\n\tconstructor(reason) {\n\t\tsuper(reason || 'Promise was canceled');\n\t\tthis.name = 'CancelError';\n\t}\n\n\tget isCanceled() {\n\t\treturn true;\n\t}\n}\n\nclass PCancelable {\n\tstatic fn(userFn) {\n\t\treturn (...arguments_) => {\n\t\t\treturn new PCancelable((resolve, reject, onCancel) => {\n\t\t\t\targuments_.push(onCancel);\n\t\t\t\t// eslint-disable-next-line promise/prefer-await-to-then\n\t\t\t\tuserFn(...arguments_).then(resolve, reject);\n\t\t\t});\n\t\t};\n\t}\n\n\tconstructor(executor) {\n\t\tthis._cancelHandlers = [];\n\t\tthis._isPending = true;\n\t\tthis._isCanceled = false;\n\t\tthis._rejectOnCancel = true;\n\n\t\tthis._promise = new Promise((resolve, reject) => {\n\t\t\tthis._reject = reject;\n\n\t\t\tconst onResolve = value => {\n\t\t\t\tthis._isPending = false;\n\t\t\t\tresolve(value);\n\t\t\t};\n\n\t\t\tconst onReject = error => {\n\t\t\t\tthis._isPending = false;\n\t\t\t\treject(error);\n\t\t\t};\n\n\t\t\tconst onCancel = handler => {\n\t\t\t\tif (!this._isPending) {\n\t\t\t\t\tthrow new Error('The `onCancel` handler was attached after the promise settled.');\n\t\t\t\t}\n\n\t\t\t\tthis._cancelHandlers.push(handler);\n\t\t\t};\n\n\t\t\tObject.defineProperties(onCancel, {\n\t\t\t\tshouldReject: {\n\t\t\t\t\tget: () => this._rejectOnCancel,\n\t\t\t\t\tset: boolean => {\n\t\t\t\t\t\tthis._rejectOnCancel = boolean;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn executor(onResolve, onReject, onCancel);\n\t\t});\n\t}\n\n\tthen(onFulfilled, onRejected) {\n\t\t// eslint-disable-next-line promise/prefer-await-to-then\n\t\treturn this._promise.then(onFulfilled, onRejected);\n\t}\n\n\tcatch(onRejected) {\n\t\treturn this._promise.catch(onRejected);\n\t}\n\n\tfinally(onFinally) {\n\t\treturn this._promise.finally(onFinally);\n\t}\n\n\tcancel(reason) {\n\t\tif (!this._isPending || this._isCanceled) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._cancelHandlers.length > 0) {\n\t\t\ttry {\n\t\t\t\tfor (const handler of this._cancelHandlers) {\n\t\t\t\t\thandler();\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis._reject(error);\n\t\t\t}\n\t\t}\n\n\t\tthis._isCanceled = true;\n\t\tif (this._rejectOnCancel) {\n\t\t\tthis._reject(new CancelError(reason));\n\t\t}\n\t}\n\n\tget isCanceled() {\n\t\treturn this._isCanceled;\n\t}\n}\n\nObject.setPrototypeOf(PCancelable.prototype, Promise.prototype);\n\nmodule.exports = PCancelable;\nmodule.exports.CancelError = CancelError;\n","'use strict';\nmodule.exports = (promise, onFinally) => {\n\tonFinally = onFinally || (() => {});\n\n\treturn promise.then(\n\t\tval => new Promise(resolve => {\n\t\t\tresolve(onFinally());\n\t\t}).then(() => val),\n\t\terr => new Promise(resolve => {\n\t\t\tresolve(onFinally());\n\t\t}).then(() => {\n\t\t\tthrow err;\n\t\t})\n\t);\n};\n","'use strict';\n\nconst pFinally = require('p-finally');\n\nclass TimeoutError extends Error {\n\tconstructor(message) {\n\t\tsuper(message);\n\t\tthis.name = 'TimeoutError';\n\t}\n}\n\nconst pTimeout = (promise, milliseconds, fallback) => new Promise((resolve, reject) => {\n\tif (typeof milliseconds !== 'number' || milliseconds < 0) {\n\t\tthrow new TypeError('Expected `milliseconds` to be a positive number');\n\t}\n\n\tif (milliseconds === Infinity) {\n\t\tresolve(promise);\n\t\treturn;\n\t}\n\n\tconst timer = setTimeout(() => {\n\t\tif (typeof fallback === 'function') {\n\t\t\ttry {\n\t\t\t\tresolve(fallback());\n\t\t\t} catch (error) {\n\t\t\t\treject(error);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst message = typeof fallback === 'string' ? fallback : `Promise timed out after ${milliseconds} milliseconds`;\n\t\tconst timeoutError = fallback instanceof Error ? fallback : new TimeoutError(message);\n\n\t\tif (typeof promise.cancel === 'function') {\n\t\t\tpromise.cancel();\n\t\t}\n\n\t\treject(timeoutError);\n\t}, milliseconds);\n\n\t// TODO: Use native `finally` keyword when targeting Node.js 10\n\tpFinally(\n\t\t// eslint-disable-next-line promise/prefer-await-to-then\n\t\tpromise.then(resolve, reject),\n\t\t() => {\n\t\t\tclearTimeout(timer);\n\t\t}\n\t);\n});\n\nmodule.exports = pTimeout;\n// TODO: Remove this for the next major release\nmodule.exports.default = pTimeout;\n\nmodule.exports.TimeoutError = TimeoutError;\n","'use strict';\nconst pTimeout = require('p-timeout');\n\nconst symbolAsyncIterator = Symbol.asyncIterator || '@@asyncIterator';\n\nconst normalizeEmitter = emitter => {\n\tconst addListener = emitter.on || emitter.addListener || emitter.addEventListener;\n\tconst removeListener = emitter.off || emitter.removeListener || emitter.removeEventListener;\n\n\tif (!addListener || !removeListener) {\n\t\tthrow new TypeError('Emitter is not compatible');\n\t}\n\n\treturn {\n\t\taddListener: addListener.bind(emitter),\n\t\tremoveListener: removeListener.bind(emitter)\n\t};\n};\n\nconst toArray = value => Array.isArray(value) ? value : [value];\n\nconst multiple = (emitter, event, options) => {\n\tlet cancel;\n\tconst ret = new Promise((resolve, reject) => {\n\t\toptions = {\n\t\t\trejectionEvents: ['error'],\n\t\t\tmultiArgs: false,\n\t\t\tresolveImmediately: false,\n\t\t\t...options\n\t\t};\n\n\t\tif (!(options.count >= 0 && (options.count === Infinity || Number.isInteger(options.count)))) {\n\t\t\tthrow new TypeError('The `count` option should be at least 0 or more');\n\t\t}\n\n\t\t// Allow multiple events\n\t\tconst events = toArray(event);\n\n\t\tconst items = [];\n\t\tconst {addListener, removeListener} = normalizeEmitter(emitter);\n\n\t\tconst onItem = (...args) => {\n\t\t\tconst value = options.multiArgs ? args : args[0];\n\n\t\t\tif (options.filter && !options.filter(value)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\titems.push(value);\n\n\t\t\tif (options.count === items.length) {\n\t\t\t\tcancel();\n\t\t\t\tresolve(items);\n\t\t\t}\n\t\t};\n\n\t\tconst rejectHandler = error => {\n\t\t\tcancel();\n\t\t\treject(error);\n\t\t};\n\n\t\tcancel = () => {\n\t\t\tfor (const event of events) {\n\t\t\t\tremoveListener(event, onItem);\n\t\t\t}\n\n\t\t\tfor (const rejectionEvent of options.rejectionEvents) {\n\t\t\t\tremoveListener(rejectionEvent, rejectHandler);\n\t\t\t}\n\t\t};\n\n\t\tfor (const event of events) {\n\t\t\taddListener(event, onItem);\n\t\t}\n\n\t\tfor (const rejectionEvent of options.rejectionEvents) {\n\t\t\taddListener(rejectionEvent, rejectHandler);\n\t\t}\n\n\t\tif (options.resolveImmediately) {\n\t\t\tresolve(items);\n\t\t}\n\t});\n\n\tret.cancel = cancel;\n\n\tif (typeof options.timeout === 'number') {\n\t\tconst timeout = pTimeout(ret, options.timeout);\n\t\ttimeout.cancel = cancel;\n\t\treturn timeout;\n\t}\n\n\treturn ret;\n};\n\nconst pEvent = (emitter, event, options) => {\n\tif (typeof options === 'function') {\n\t\toptions = {filter: options};\n\t}\n\n\toptions = {\n\t\t...options,\n\t\tcount: 1,\n\t\tresolveImmediately: false\n\t};\n\n\tconst arrayPromise = multiple(emitter, event, options);\n\tconst promise = arrayPromise.then(array => array[0]); // eslint-disable-line promise/prefer-await-to-then\n\tpromise.cancel = arrayPromise.cancel;\n\n\treturn promise;\n};\n\nmodule.exports = pEvent;\n// TODO: Remove this for the next major release\nmodule.exports.default = pEvent;\n\nmodule.exports.multiple = multiple;\n\nmodule.exports.iterator = (emitter, event, options) => {\n\tif (typeof options === 'function') {\n\t\toptions = {filter: options};\n\t}\n\n\t// Allow multiple events\n\tconst events = toArray(event);\n\n\toptions = {\n\t\trejectionEvents: ['error'],\n\t\tresolutionEvents: [],\n\t\tlimit: Infinity,\n\t\tmultiArgs: false,\n\t\t...options\n\t};\n\n\tconst {limit} = options;\n\tconst isValidLimit = limit >= 0 && (limit === Infinity || Number.isInteger(limit));\n\tif (!isValidLimit) {\n\t\tthrow new TypeError('The `limit` option should be a non-negative integer or Infinity');\n\t}\n\n\tif (limit === 0) {\n\t\t// Return an empty async iterator to avoid any further cost\n\t\treturn {\n\t\t\t[Symbol.asyncIterator]() {\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tasync next() {\n\t\t\t\treturn {\n\t\t\t\t\tdone: true,\n\t\t\t\t\tvalue: undefined\n\t\t\t\t};\n\t\t\t}\n\t\t};\n\t}\n\n\tconst {addListener, removeListener} = normalizeEmitter(emitter);\n\n\tlet isDone = false;\n\tlet error;\n\tlet hasPendingError = false;\n\tconst nextQueue = [];\n\tconst valueQueue = [];\n\tlet eventCount = 0;\n\tlet isLimitReached = false;\n\n\tconst valueHandler = (...args) => {\n\t\teventCount++;\n\t\tisLimitReached = eventCount === limit;\n\n\t\tconst value = options.multiArgs ? args : args[0];\n\n\t\tif (nextQueue.length > 0) {\n\t\t\tconst {resolve} = nextQueue.shift();\n\n\t\t\tresolve({done: false, value});\n\n\t\t\tif (isLimitReached) {\n\t\t\t\tcancel();\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueQueue.push(value);\n\n\t\tif (isLimitReached) {\n\t\t\tcancel();\n\t\t}\n\t};\n\n\tconst cancel = () => {\n\t\tisDone = true;\n\t\tfor (const event of events) {\n\t\t\tremoveListener(event, valueHandler);\n\t\t}\n\n\t\tfor (const rejectionEvent of options.rejectionEvents) {\n\t\t\tremoveListener(rejectionEvent, rejectHandler);\n\t\t}\n\n\t\tfor (const resolutionEvent of options.resolutionEvents) {\n\t\t\tremoveListener(resolutionEvent, resolveHandler);\n\t\t}\n\n\t\twhile (nextQueue.length > 0) {\n\t\t\tconst {resolve} = nextQueue.shift();\n\t\t\tresolve({done: true, value: undefined});\n\t\t}\n\t};\n\n\tconst rejectHandler = (...args) => {\n\t\terror = options.multiArgs ? args : args[0];\n\n\t\tif (nextQueue.length > 0) {\n\t\t\tconst {reject} = nextQueue.shift();\n\t\t\treject(error);\n\t\t} else {\n\t\t\thasPendingError = true;\n\t\t}\n\n\t\tcancel();\n\t};\n\n\tconst resolveHandler = (...args) => {\n\t\tconst value = options.multiArgs ? args : args[0];\n\n\t\tif (options.filter && !options.filter(value)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (nextQueue.length > 0) {\n\t\t\tconst {resolve} = nextQueue.shift();\n\t\t\tresolve({done: true, value});\n\t\t} else {\n\t\t\tvalueQueue.push(value);\n\t\t}\n\n\t\tcancel();\n\t};\n\n\tfor (const event of events) {\n\t\taddListener(event, valueHandler);\n\t}\n\n\tfor (const rejectionEvent of options.rejectionEvents) {\n\t\taddListener(rejectionEvent, rejectHandler);\n\t}\n\n\tfor (const resolutionEvent of options.resolutionEvents) {\n\t\taddListener(resolutionEvent, resolveHandler);\n\t}\n\n\treturn {\n\t\t[symbolAsyncIterator]() {\n\t\t\treturn this;\n\t\t},\n\t\tasync next() {\n\t\t\tif (valueQueue.length > 0) {\n\t\t\t\tconst value = valueQueue.shift();\n\t\t\t\treturn {\n\t\t\t\t\tdone: isDone && valueQueue.length === 0 && !isLimitReached,\n\t\t\t\t\tvalue\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (hasPendingError) {\n\t\t\t\thasPendingError = false;\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\tif (isDone) {\n\t\t\t\treturn {\n\t\t\t\t\tdone: true,\n\t\t\t\t\tvalue: undefined\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn new Promise((resolve, reject) => nextQueue.push({resolve, reject}));\n\t\t},\n\t\tasync return(value) {\n\t\t\tcancel();\n\t\t\treturn {\n\t\t\t\tdone: isDone,\n\t\t\t\tvalue\n\t\t\t};\n\t\t}\n\t};\n};\n\nmodule.exports.TimeoutError = pTimeout.TimeoutError;\n","'use strict';\n\nclass TimeoutError extends Error {\n\tconstructor(message) {\n\t\tsuper(message);\n\t\tthis.name = 'TimeoutError';\n\t}\n}\n\nconst pTimeout = (promise, milliseconds, fallback, options) => {\n\tlet timer;\n\tconst cancelablePromise = new Promise((resolve, reject) => {\n\t\tif (typeof milliseconds !== 'number' || milliseconds < 0) {\n\t\t\tthrow new TypeError('Expected `milliseconds` to be a positive number');\n\t\t}\n\n\t\tif (milliseconds === Infinity) {\n\t\t\tresolve(promise);\n\t\t\treturn;\n\t\t}\n\n\t\toptions = {\n\t\t\tcustomTimers: {setTimeout, clearTimeout},\n\t\t\t...options\n\t\t};\n\n\t\ttimer = options.customTimers.setTimeout.call(undefined, () => {\n\t\t\tif (typeof fallback === 'function') {\n\t\t\t\ttry {\n\t\t\t\t\tresolve(fallback());\n\t\t\t\t} catch (error) {\n\t\t\t\t\treject(error);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst message = typeof fallback === 'string' ? fallback : `Promise timed out after ${milliseconds} milliseconds`;\n\t\t\tconst timeoutError = fallback instanceof Error ? fallback : new TimeoutError(message);\n\n\t\t\tif (typeof promise.cancel === 'function') {\n\t\t\t\tpromise.cancel();\n\t\t\t}\n\n\t\t\treject(timeoutError);\n\t\t}, milliseconds);\n\n\t\t(async () => {\n\t\t\ttry {\n\t\t\t\tresolve(await promise);\n\t\t\t} catch (error) {\n\t\t\t\treject(error);\n\t\t\t} finally {\n\t\t\t\toptions.customTimers.clearTimeout.call(undefined, timer);\n\t\t\t}\n\t\t})();\n\t});\n\n\tcancelablePromise.clear = () => {\n\t\tclearTimeout(timer);\n\t\ttimer = undefined;\n\t};\n\n\treturn cancelablePromise;\n};\n\nmodule.exports = pTimeout;\n// TODO: Remove this for the next major release\nmodule.exports.default = pTimeout;\n\nmodule.exports.TimeoutError = TimeoutError;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n","var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n","var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n","var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var Hash = require('./_Hash'),\n ListCache = require('./_ListCache'),\n Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nmodule.exports = mapCacheClear;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nmodule.exports = getMapData;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n","var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\nmodule.exports = setCacheAdd;\n","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n","var MapCache = require('./_MapCache'),\n setCacheAdd = require('./_setCacheAdd'),\n setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n","/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = baseFindIndex;\n","/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n return value !== value;\n}\n\nmodule.exports = baseIsNaN;\n","/**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction strictIndexOf(array, value, fromIndex) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = strictIndexOf;\n","var baseFindIndex = require('./_baseFindIndex'),\n baseIsNaN = require('./_baseIsNaN'),\n strictIndexOf = require('./_strictIndexOf');\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nmodule.exports = baseIndexOf;\n","var baseIndexOf = require('./_baseIndexOf');\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\nmodule.exports = arrayIncludes;\n","/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arrayIncludesWith;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n","/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n // No operation performed.\n}\n\nmodule.exports = noop;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\nmodule.exports = setToArray;\n","var Set = require('./_Set'),\n noop = require('./noop'),\n setToArray = require('./_setToArray');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n return new Set(values);\n};\n\nmodule.exports = createSet;\n","var SetCache = require('./_SetCache'),\n arrayIncludes = require('./_arrayIncludes'),\n arrayIncludesWith = require('./_arrayIncludesWith'),\n cacheHas = require('./_cacheHas'),\n createSet = require('./_createSet'),\n setToArray = require('./_setToArray');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n length = array.length,\n isCommon = true,\n result = [],\n seen = result;\n\n if (comparator) {\n isCommon = false;\n includes = arrayIncludesWith;\n }\n else if (length >= LARGE_ARRAY_SIZE) {\n var set = iteratee ? null : createSet(array);\n if (set) {\n return setToArray(set);\n }\n isCommon = false;\n includes = cacheHas;\n seen = new SetCache;\n }\n else {\n seen = iteratee ? [] : result;\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n }\n else if (!includes(seen, computed, comparator)) {\n if (seen !== result) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n}\n\nmodule.exports = baseUniq;\n","var baseUniq = require('./_baseUniq');\n\n/**\n * Creates a duplicate-free version of an array, using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons, in which only the first occurrence of each element\n * is kept. The order of result values is determined by the order they occur\n * in the array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniq([2, 1, 2]);\n * // => [2, 1]\n */\nfunction uniq(array) {\n return (array && array.length) ? baseUniq(array) : [];\n}\n\nmodule.exports = uniq;\n","type DistributeKeys<T> = { [P in keyof T]: P }\n\nexport enum ApiVersions {\n Helix = 'helix',\n Kraken = 'kraken',\n}\n\n/**\n * Root URL response\n * @see https://dev.twitch.tv/docs/v5#root-url\n */\nexport type ApiRootResponse = {\n token: {\n authorization: {\n createdAt: Date\n updatedAt: Date\n scopes: string[]\n }\n clientId: string\n userId: string\n userName: string\n valid: boolean\n }\n}\n\n/**\n * @see https://dev.twitch.tv/docs/irc/guide#twitch-irc-capabilities\n */\nexport enum Capabilities {\n 'tags' = 'twitch.tv/tags',\n 'commands' = 'twitch.tv/commands',\n 'membership' = 'twitch.tv/membership',\n}\n\n/**\n * @see https://dev.twitch.tv/docs/irc/membership\n */\nexport enum MembershipCommands {\n JOIN = 'JOIN',\n MODE = 'MODE',\n PART = 'PART',\n NAMES = '353',\n NAMES_END = '366',\n}\n\n/**\n * @see https://dev.twitch.tv/docs/irc/tags\n */\nexport enum TagCommands {\n CLEAR_CHAT = 'CLEARCHAT',\n GLOBALUSERSTATE = 'GLOBALUSERSTATE',\n PRIVATE_MESSAGE = 'PRIVMSG',\n ROOM_STATE = 'ROOMSTATE',\n USER_NOTICE = 'USERNOTICE',\n USER_STATE = 'USERSTATE',\n}\n\nexport enum OtherCommands {\n WELCOME = '001',\n PING = 'PING',\n PONG = 'PONG',\n WHISPER = 'WHISPER',\n}\n\n/**\n * @see https://dev.twitch.tv/docs/irc/commands\n */\nexport enum BaseCommands {\n CLEAR_CHAT = 'CLEARCHAT',\n CLEAR_MESSAGE = 'CLEARMSG',\n HOST_TARGET = 'HOSTTARGET',\n NOTICE = 'NOTICE',\n RECONNECT = 'RECONNECT',\n ROOM_STATE = 'ROOMSTATE',\n USER_NOTICE = 'USERNOTICE',\n USER_STATE = 'USERSTATE',\n}\n\nexport enum Commands {\n WELCOME = '001',\n\n PING = 'PING',\n PONG = 'PONG',\n RECONNECT = 'RECONNECT',\n\n WHISPER = 'PRIVMSG #jtv',\n\n JOIN = 'JOIN',\n MODE = 'MODE',\n PART = 'PART',\n NAMES = '353',\n NAMES_END = '366',\n\n CLEAR_CHAT = 'CLEARCHAT',\n CLEAR_MESSAGE = 'CLEARMSG',\n GLOBALUSERSTATE = 'GLOBALUSERSTATE',\n HOST_TARGET = 'HOSTTARGET',\n NOTICE = 'NOTICE',\n PRIVATE_MESSAGE = 'PRIVMSG',\n ROOM_STATE = 'ROOMSTATE',\n USER_NOTICE = 'USERNOTICE',\n USER_STATE = 'USERSTATE',\n}\n\nexport enum ChatEvents {\n RAW = 'RAW',\n\n ALL = '*',\n CONNECTED = 'CONNECTED',\n DISCONNECTED = 'DISCONNECTED',\n RECONNECT = 'RECONNECT',\n AUTHENTICATED = 'AUTHENTICATED',\n AUTHENTICATION_FAILED = 'AUTHENTICATION_FAILED',\n GLOBALUSERSTATE = 'GLOBALUSERSTATE',\n ERROR_ENCOUNTERED = 'ERROR_ENCOUNTERED',\n PARSE_ERROR_ENCOUNTERED = 'PARSE_ERROR_ENCOUNTERED',\n\n ANON_GIFT_PAID_UPGRADE = 'ANON_GIFT_PAID_UPGRADE',\n GIFT_PAID_UPGRADE = 'GIFT_PAID_UPGRADE',\n RAID = 'RAID',\n RESUBSCRIPTION = 'RESUBSCRIPTION',\n RITUAL = 'RITUAL',\n SUBSCRIPTION = 'SUBSCRIPTION',\n SUBSCRIPTION_GIFT = 'SUBSCRIPTION_GIFT',\n SUBSCRIPTION_GIFT_COMMUNITY = 'SUBSCRIPTION_GIFT_COMMUNITY',\n\n ROOM_MODS = 'ROOM_MODS',\n MOD_GAINED = 'MOD_GAINED',\n MOD_LOST = 'MOD_LOST',\n\n USER_BANNED = 'USER_BANNED',\n\n CHEER = 'CHEER',\n\n HOST_ON = 'HOST_ON',\n HOST_OFF = 'HOST_OFF',\n\n HOSTED = 'HOSTED',\n HOSTED_WITHOUT_VIEWERS = 'HOSTED/WITHOUT_VIEWERS',\n HOSTED_WITH_VIEWERS = 'HOSTED/WITH_VIEWERS',\n HOSTED_AUTO = 'HOSTED/AUTO',\n}\n\n/**\n * @see https://help.twitch.tv/customer/en/portal/articles/659095-chat-moderation-commands\n */\nexport enum ChatCommands {\n BAN = 'ban',\n BLOCK = 'block',\n CLEAR = 'clear',\n COLOR = 'color',\n COMMERCIAL = 'commercial',\n // DISCONNECTED = 'disconnect',\n DELETE = 'delete',\n EMOTE_ONLY = 'emoteonly',\n EMOTE_ONLY_OFF = 'emoteonlyoff',\n FOLLOWERS_ONLY = 'followers',\n FOLLOWERS_ONLY_OFF = 'followersoff',\n HELP = 'help',\n HOST = 'host',\n MARKER = 'marker',\n ME = 'me',\n MOD = 'mod',\n MODS = 'mods',\n // PART = 'part',\n R9K = 'r9kbeta',\n R9K_OFF = 'r9kbetaoff',\n RAID = 'raid',\n SLOW = 'slow',\n SLOW_OFF = 'slowoff',\n SUBSCRIBERS = 'subscribers',\n SUBSCRIBERS_OFF = 'subscribersoff',\n TIMEOUT = 'timeout',\n UNBAN = 'unban',\n UNBLOCK = 'unblock',\n UNHOST = 'unhost',\n UNMOD = 'unmod',\n UNRAID = 'unraid',\n UNVIP = 'unvip',\n VIP = 'vip',\n VIPS = 'vips',\n WHISPER = 'w',\n}\n\nexport enum KnownNoticeMessageIds {\n ALREADY_BANNED = 'already_banned',\n ALREADY_EMOTE_ONLY_OFF = 'already_emote_only_off',\n ALREADY_EMOTE_ONLY_ON = 'already_emote_only_on',\n ALREADY_R9K_OFF = 'already_r9k_off',\n ALREADY_R9K_ON = 'already_r9k_on',\n ALREADY_SUBS_OFF = 'already_subs_off',\n ALREADY_SUBS_ON = 'already_subs_on',\n BAD_HOST_HOSTING = 'bad_host_hosting',\n BAD_MOD_MOD = 'bad_mod_mod',\n BAN_SUCCESS = 'ban_success',\n BAD_UNBAN_NO_BAN = 'bad_unban_no_ban',\n COLOR_CHANGED = 'color_changed',\n CMDS_AVAILABLE = 'cmds_available',\n COMMERCIAL_SUCCESS = 'commercial_success',\n EMOTE_ONLY_OFF = 'emote_only_off',\n EMOTE_ONLY_ON = 'emote_only_on',\n FOLLOWERS_OFF = 'followers_off',\n FOLLOWERS_ON = 'followers_on',\n FOLLOWERS_ONZERO = 'followers_onzero',\n HOST_OFF = 'host_off',\n HOST_ON = 'host_on',\n HOSTS_REMAINING = 'hosts_remaining',\n MSG_CHANNEL_SUSPENDED = 'msg_channel_suspended',\n MOD_SUCCESS = 'mod_success',\n NOT_HOSTING = 'not_hosting',\n R9K_OFF = 'r9k_off',\n R9K_ON = 'r9k_on',\n ROOM_MODS = 'room_mods',\n SLOW_OFF = 'slow_off',\n SLOW_ON = 'slow_on',\n SUBS_OFF = 'subs_off',\n SUBS_ON = 'subs_on',\n TIMEOUT_SUCCESS = 'timeout_success',\n UNBAN_SUCCESS = 'unban_success',\n UNMOD_SUCCESS = 'unmod_success',\n UNRAID_SUCCESS = 'unraid_success',\n UNRECOGNIZED_CMD = 'unrecognized_cmd',\n}\n\nexport const KnownNoticeMessageIdsUpperCase = Object.entries(\n KnownNoticeMessageIds,\n).reduce(\n (uppercase, [key, value]) => ({ ...uppercase, [key]: value.toUpperCase() }),\n {} as Record<keyof typeof KnownNoticeMessageIds, string>,\n)\n\nexport const NoticeEvents = Object.keys(KnownNoticeMessageIds).reduce(\n (events, event) => ({\n ...events,\n [event]: event,\n [`${Commands.NOTICE}/${event.toUpperCase()}`]: event,\n }),\n {} as DistributeKeys<typeof KnownNoticeMessageIds>,\n)\nexport type NoticeEvents = keyof typeof NoticeEvents\n\nexport enum PrivateMessageEvents {\n CHEER = 'CHEER',\n HOSTED_WITHOUT_VIEWERS = 'HOSTED_WITHOUT_VIEWERS',\n HOSTED_WITH_VIEWERS = 'HOSTED_WITH_VIEWERS',\n HOSTED_AUTO = 'HOSTED_AUTO',\n}\n\n/**\n * @see https://dev.twitch.tv/docs/irc/tags#usernotice-twitch-tags\n */\nexport enum KnownUserNoticeMessageIds {\n ANON_GIFT_PAID_UPGRADE = 'anongiftpaidupgrade',\n GIFT_PAID_UPGRADE = 'giftpaidupgrade',\n RAID = 'raid',\n RESUBSCRIPTION = 'resub',\n RITUAL = 'ritual',\n SUBSCRIPTION = 'sub',\n SUBSCRIPTION_GIFT = 'subgift',\n SUBSCRIPTION_GIFT_COMMUNITY = 'submysterygift',\n}\n\nexport const UserNoticeEvents = Object.keys(KnownUserNoticeMessageIds).reduce(\n (events, event) => ({\n ...events,\n [event]: event,\n [`${Commands.USER_NOTICE}/${event}`]: event,\n }),\n {} as DistributeKeys<typeof KnownUserNoticeMessageIds>,\n)\nexport type UserNoticeEvents = keyof typeof UserNoticeEvents\n\nexport const Events = {\n ...MembershipCommands,\n ...TagCommands,\n ...OtherCommands,\n ...BaseCommands,\n ...ChatEvents,\n ...NoticeEvents,\n ...PrivateMessageEvents,\n ...UserNoticeEvents,\n}\n\nexport type Events = keyof DistributeKeys<typeof Events>\n\nexport enum BooleanBadges {\n 'admin',\n 'broadcaster',\n 'globalMod',\n 'moderator',\n 'partner',\n 'premium',\n 'staff',\n 'subGifter',\n 'turbo',\n 'vip',\n}\n\nexport enum NumberBadges {\n 'bits',\n 'bitsLeader',\n 'subscriber',\n}\n\nexport type Badges =\n | {\n // Booleans\n admin: boolean\n broadcaster: boolean\n globalMod: boolean\n moderator: boolean\n partner: boolean\n premium: boolean\n staff: boolean\n subGifter: boolean\n turbo: boolean\n vip: boolean\n // Numbers\n bits: number\n bitsLeader: number\n subscriber: number\n }\n | {\n [key: string]: string\n }\n\nexport type EmoteTag = {\n id: string\n start: number\n end: number\n}\n\n/**\n * Tags\n */\n\nexport interface BaseTags {\n [key: string]: any\n}\n\n/**\n * CLEARCHAT tags\n * @see https://dev.twitch.tv/docs/irc/tags#clearchat-twitch-tags\n */\nexport interface ClearChatTags extends BaseTags {\n banReason?: string\n banDuration?: number\n}\n\n/**\n * CLEARMSG tags\n * @see https://dev.twitch.tv/docs/irc/tags#clearmsg-twitch-tags\n */\nexport interface ClearMessageTags extends BaseTags {\n login: string\n targetMsgId: string\n}\n\n/**\n * GLOBALUSERSTATE tags\n * @see https://dev.twitch.tv/docs/irc/tags#globaluserstate-twitch-tags\n */\nexport interface GlobalUserStateTags extends BaseTags {\n emoteSets: string[]\n userType?: string\n username: string\n}\n\n/**\n * ROOMSTATE Tag\n * @see https://dev.twitch.tv/docs/irc/tags#roomstate-twitch-tags\n */\nexport interface RoomStateTags extends BaseTags {\n followersOnly?: number | boolean\n broadcasterLang?: string\n slow?: number\n emoteOnly?: boolean\n r9k?: boolean\n subsOnly?: boolean\n}\n\nexport interface NoticeTags extends BaseTags {\n msgId: KnownNoticeMessageIds\n}\n\n/**\n * USERSTATE tags\n * @see https://dev.twitch.tv/docs/irc/tags#userstate-twitch-tags\n */\nexport interface UserStateTags extends BaseTags {\n badges: Partial<Badges>\n color: string\n displayName: string\n emotes: EmoteTag[]\n emoteSets: string[]\n mod?: string\n subscriber?: string\n turbo?: string\n userType?: string\n username: string\n isModerator: boolean\n}\n\n/**\n * PRIVMSG tags\n * @see https://dev.twitch.tv/docs/irc/tags#privmsg-twitch-tags\n */\nexport interface PrivateMessageTags extends UserStateTags {\n bits?: string\n}\n\n/**\n * USERNOTICE tags\n * @see https://dev.twitch.tv/docs/irc/tags#usernotice-twitch-tags\n */\nexport interface UserNoticeTags extends UserStateTags {\n id: string\n login: string\n msgId: KnownUserNoticeMessageIds\n roomId: string\n systemMsg: string\n tmiSentTs: string\n}\n\nexport type Tags =\n | ClearChatTags\n | GlobalUserStateTags\n | RoomStateTags\n | UserStateTags\n | PrivateMessageTags\n | NoticeTags\n | UserNoticeTags\n\n/**\n * Messages\n */\n\n/* Base message parsed from Twitch */\nexport interface Message {\n _raw: string\n timestamp: Date\n channel: string\n username: string\n command: string\n event: string\n isSelf: boolean\n message: string\n tags: { [key: string]: any }\n parameters?: { [key: string]: string | number | boolean }\n}\n\nexport interface BaseMessage extends Message {\n _raw: string\n timestamp: Date\n channel: string\n username: string\n command: string\n event: string\n isSelf: boolean\n message: string\n tags: { [key: string]: any }\n}\n\n/**\n * Join a channel.\n * @see https://dev.twitch.tv/docs/irc/membership/#join-twitch-membership\n */\nexport interface JoinMessage extends Omit<BaseMessage, 'message'> {\n command: Commands.JOIN\n event: Commands.JOIN\n}\n\n/**\n * Depart from a channel.\n * @see https://dev.twitch.tv/docs/irc/membership/#part-twitch-membership\n */\nexport interface PartMessage extends Omit<BaseMessage, 'message'> {\n command: Commands.PART\n event: Commands.PART\n}\n\n/**\n * Gain/lose moderator (operator) status in a channel.\n * @see https://dev.twitch.tv/docs/irc/membership/#mode-twitch-membership\n */\nexport interface ModeModGainedMessage extends BaseMessage {\n command: Commands.MODE\n event: ChatEvents.MOD_GAINED\n message: '+o'\n isModerator: true\n}\n\nexport interface ModeModLostMessage extends BaseMessage {\n command: Commands.MODE\n event: ChatEvents.MOD_LOST\n message: '-o'\n isModerator: false\n}\n\nexport type ModeMessages = ModeModGainedMessage | ModeModLostMessage\n\n/**\n * List current chatters in a channel.\n * @see https://dev.twitch.tv/docs/irc/membership/#names-twitch-membership\n */\nexport interface NamesMessage extends Omit<BaseMessage, 'message'> {\n command: Commands.NAMES\n event: Commands.NAMES\n usernames: string[]\n}\n\n/**\n * End of list current chatters in a channel.\n * @see https://dev.twitch.tv/docs/irc/membership/#names-twitch-membership\n */\nexport interface NamesEndMessage extends Omit<BaseMessage, 'message'> {\n command: Commands.NAMES_END\n event: Commands.NAMES_END\n}\n\n/**\n * GLOBALUSERSTATE message\n * @see https://dev.twitch.tv/docs/irc/tags#globaluserstate-twitch-tags\n */\nexport interface GlobalUserStateMessage extends BaseMessage {\n command: Commands.GLOBALUSERSTATE\n event: Commands.GLOBALUSERSTATE\n tags: GlobalUserStateTags\n}\n\n/**\n * Temporary or permanent ban on a channel.\n * @see https://dev.twitch.tv/docs/irc/commands/#clearchat-twitch-commands\n * @see https://dev.twitch.tv/docs/irc/tags/#clearchat-twitch-tags\n */\nexport interface ClearChatUserBannedMessage\n extends Omit<BaseMessage, 'message'> {\n command: Commands.CLEAR_CHAT\n event: ChatEvents.USER_BANNED\n tags: ClearChatTags\n}\n\n/**\n * All chat is cleared (deleted).\n * @see https://dev.twitch.tv/docs/irc/commands/#clearchat-twitch-commands\n * @see https://dev.twitch.tv/docs/irc/tags/#clearchat-twitch-tags\n */\nexport interface ClearChatMessage\n extends Omit<BaseMessage, 'tags' | 'username' | 'message'> {\n command: Commands.CLEAR_CHAT\n event: Commands.CLEAR_CHAT\n}\n\nexport type ClearChatMessages = ClearChatMessage | ClearChatUserBannedMessage\n\n/**\n * Single message removal on a channel.\n * @see https://dev.twitch.tv/docs/irc/commands#clearmsg-twitch-commands\n * @see https://dev.twitch.tv/docs/irc/tags#clearmsg-twitch-tags\n */\nexport interface ClearMessageMessage extends Omit<BaseMessage, 'message'> {\n command: Commands.CLEAR_MESSAGE\n event: Commands.CLEAR_MESSAGE\n tags: ClearMessageTags\n targetMessageId: string\n}\n\n/**\n * Host starts or stops a message.\n * @see https://dev.twitch.tv/docs/irc/commands/#hosttarget-twitch-commands\n */\nexport interface HostTargetMessage extends Omit<BaseMessage, 'message'> {\n command: Commands.HOST_TARGET\n event: ChatEvents.HOST_ON | ChatEvents.HOST_OFF\n numberOfViewers?: number\n}\n\n/**\n * When a user joins a channel or a room setting is changed.\n * @see https://dev.twitch.tv/docs/irc/tags#roomstate-twitch-tags\n */\nexport interface RoomStateMessage extends BaseMessage {\n command: Commands.ROOM_STATE\n event: Commands.ROOM_STATE\n tags: RoomStateTags\n}\n\n/**\n * Base NOTICE message\n */\nexport interface NoticeMessage extends Omit<BaseMessage, 'event'> {\n command: Commands.NOTICE\n event: Exclude<NoticeEvents, typeof NoticeEvents.ROOM_MODS>\n tags: NoticeTags\n username: 'tmi.twitch.tv' | string\n}\n\n/**\n * NOTICE/ROOM_MODS message\n */\nexport interface NoticeRoomModsMessage extends Omit<NoticeMessage, 'event'> {\n event: typeof NoticeEvents.ROOM_MODS\n /** The moderators of this channel. */\n mods: string[]\n}\n\n/**\n * NOTICE message\n * @see https://dev.twitch.tv/docs/irc/commands/#msg-id-tags-for-the-notice-commands-capability\n */\nexport type NoticeMessages = NoticeMessage | NoticeRoomModsMessage\n\n/**\n * USERSTATE message\n */\nexport interface UserStateMessage extends BaseMessage {\n command: Commands.USER_STATE\n event: Commands.USER_STATE\n tags: UserStateTags\n}\n\n/**\n * PRIVMSG messages\n */\n\ninterface BasePrivateMessage\n extends Omit<UserStateMessage, 'command' | 'event'> {\n command: Commands.PRIVATE_MESSAGE\n}\n\n/**\n * When a user joins a channel or sends a PRIVMSG to a channel.\n */\nexport interface PrivateMessage extends BasePrivateMessage {\n event: Commands.PRIVATE_MESSAGE\n}\n\nexport interface PrivateMessageWithBits extends BasePrivateMessage {\n event: ChatEvents.CHEER\n bits: number\n}\n\ninterface BaseHostingPrivateMessage extends Omit<BasePrivateMessage, 'tags'> {}\n\n/**\n * When a user hosts your channel while connected as broadcaster.\n */\nexport interface HostingPrivateMessage extends BaseHostingPrivateMessage {\n event: ChatEvents.HOSTED_WITHOUT_VIEWERS\n tags: { displayName: string }\n}\n\nexport interface HostingWithViewersPrivateMessage\n extends BaseHostingPrivateMessage {\n event: ChatEvents.HOSTED_WITH_VIEWERS\n tags: { displayName: string }\n numberOfViewers?: number\n}\n\nexport interface HostingAutoPrivateMessage extends BaseHostingPrivateMessage {\n event: ChatEvents.HOSTED_AUTO\n tags: { displayName: string }\n numberOfViewers?: number\n}\n\nexport type PrivateMessages =\n | PrivateMessage\n | PrivateMessageWithBits\n | HostingPrivateMessage\n | HostingWithViewersPrivateMessage\n | HostingAutoPrivateMessage\n\nexport interface MessageParameters {\n [key: string]: string | number | boolean | Date | undefined\n}\n\nexport interface AnonymousGiftPaidUpgradeParameters extends MessageParameters {}\n\nexport interface GiftPaidUpgradeParameters extends MessageParameters {\n promoGiftTotal: number\n promoName: string\n senderLogin: string\n senderName: string\n}\n\nexport interface RaidParameters extends MessageParameters {\n displayName: string\n login: string\n viewerCount: number\n}\n\nexport interface ResubscriptionParameters extends MessageParameters {\n months: number\n subPlan: string\n subPlanName: string\n}\n\nexport interface RitualParameters extends MessageParameters {\n ritualName: string\n}\n\nexport interface SubscriptionGiftCommunityParameters extends MessageParameters {\n massGiftCount: number\n senderCount: number\n subPlan: number\n}\n\nexport interface SubscriptionGiftParameters extends MessageParameters {\n months: number\n subPlan: string\n subPlanName: string\n recipientDisplayName: string\n recipientId: string\n recipientName: string\n}\n\nexport interface SubscriptionParameters extends MessageParameters {\n months: 1\n subPlan: string\n subPlanName: string\n}\n\nexport type UserNoticeMessageParameters =\n | AnonymousGiftPaidUpgradeParameters\n | GiftPaidUpgradeParameters\n | RaidParameters\n | ResubscriptionParameters\n | RitualParameters\n | SubscriptionGiftCommunityParameters\n | SubscriptionGiftParameters\n | SubscriptionParameters\n\nexport interface UserNoticeMessage\n extends Omit<BaseMessage, 'event' | 'parameters'> {\n command: Commands.USER_NOTICE\n event: UserNoticeEvents\n tags: UserNoticeTags\n parameters: MessageParameters\n systemMessage: string\n}\n\n/**\n * On anonymous gifted subscription paid upgrade to a channel.\n */\nexport interface UserNoticeAnonymousGiftPaidUpgradeMessage\n extends UserNoticeMessage {\n command: Commands.USER_NOTICE\n event: typeof UserNoticeEvents.ANON_GIFT_PAID_UPGRADE\n parameters: AnonymousGiftPaidUpgradeParameters\n}\n\n/**\n * On gifted subscription paid upgrade to a channel.\n */\nexport interface UserNoticeGiftPaidUpgradeMessage\n extends Omit<UserNoticeMessage, 'parameters'> {\n event: typeof UserNoticeEvents.GIFT_PAID_UPGRADE\n parameters: {\n promoGiftTotal: number\n promoName: string\n senderLogin: string\n senderName: string\n }\n}\n\n/**\n * On channel raid.\n */\nexport interface UserNoticeRaidMessage\n extends Omit<UserNoticeMessage, 'parameters'> {\n event: typeof UserNoticeEvents.RAID\n parameters: {\n displayName: string\n login: string\n viewerCount: number\n }\n}\n\n/**\n * On resubscription (subsequent months) to a channel.\n */\nexport interface UserNoticeResubscriptionMessage\n extends Omit<UserNoticeMessage, 'parameters'> {\n event: typeof UserNoticeEvents.RESUBSCRIPTION\n parameters: {\n months: number\n subPlan: string\n subPlanName: string\n }\n}\n\n/**\n * On channel ritual.\n */\nexport interface UserNoticeRitualMessage\n extends Omit<UserNoticeMessage, 'parameters'> {\n event: typeof UserNoticeEvents.RITUAL\n parameters: {\n ritualName: string\n }\n}\n\n/**\n * On subscription gift to a channel community.\n */\nexport interface UserNoticeSubscriptionGiftCommunityMessage\n extends Omit<UserNoticeMessage, 'parameters'> {\n event: typeof UserNoticeEvents.SUBSCRIPTION_GIFT_COMMUNITY\n parameters: {\n massGiftCount: number\n senderCount: number\n subPlan: number\n }\n}\n\n/**\n * On subscription gift to a channel.\n */\nexport interface UserNoticeSubscriptionGiftMessage\n extends Omit<UserNoticeMessage, 'parameters'> {\n event: typeof UserNoticeEvents.SUBSCRIPTION_GIFT\n parameters: {\n months: number\n subPlan: string\n subPlanName: string\n recipientDisplayName: string\n recipientId: string\n recipientName: string\n }\n}\n\n/**\n * On subscription (first month) to a channel.\n */\nexport interface UserNoticeSubscriptionMessage\n extends Omit<UserNoticeMessage, 'event' | 'parameters'> {\n event: typeof UserNoticeEvents.SUBSCRIPTION\n parameters: {\n months: 1\n subPlan: string\n subPlanName: string\n }\n}\n\nexport type UserNoticeMessages =\n | UserNoticeAnonymousGiftPaidUpgradeMessage\n | UserNoticeGiftPaidUpgradeMessage\n | UserNoticeRaidMessage\n | UserNoticeResubscriptionMessage\n | UserNoticeRitualMessage\n | UserNoticeSubscriptionGiftCommunityMessage\n | UserNoticeSubscriptionGiftMessage\n | UserNoticeSubscriptionMessage\n\nexport type Messages =\n | BaseMessage\n | JoinMessage\n | PartMessage\n | ModeMessages\n | NamesMessage\n | NamesEndMessage\n | GlobalUserStateMessage\n | ClearChatMessages\n | ClearMessageMessage\n | HostTargetMessage\n | RoomStateMessage\n | NoticeMessages\n | UserStateMessage\n | PrivateMessages\n | UserNoticeMessages\n","'use strict'\nfunction tryStringify (o) {\n try { return JSON.stringify(o) } catch(e) { return '\"[Circular]\"' }\n}\n\nmodule.exports = format\n\nfunction format(f, args, opts) {\n var ss = (opts && opts.stringify) || tryStringify\n var offset = 1\n if (typeof f === 'object' && f !== null) {\n var len = args.length + offset\n if (len === 1) return f\n var objects = new Array(len)\n objects[0] = ss(f)\n for (var index = 1; index < len; index++) {\n objects[index] = ss(args[index])\n }\n return objects.join(' ')\n }\n if (typeof f !== 'string') {\n return f\n }\n var argLen = args.length\n if (argLen === 0) return f\n var x = ''\n var str = ''\n var a = 1 - offset\n var lastPos = -1\n var flen = (f && f.length) || 0\n for (var i = 0; i < flen;) {\n if (f.charCodeAt(i) === 37 && i + 1 < flen) {\n lastPos = lastPos > -1 ? lastPos : 0\n switch (f.charCodeAt(i + 1)) {\n case 100: // 'd'\n if (a >= argLen)\n break\n if (lastPos < i)\n str += f.slice(lastPos, i)\n if (args[a] == null) break\n str += Number(args[a])\n lastPos = i = i + 2\n break\n case 79: // 'O'\n case 111: // 'o'\n case 106: // 'j'\n if (a >= argLen)\n break\n if (lastPos < i)\n str += f.slice(lastPos, i)\n if (args[a] === undefined) break\n var type = typeof args[a]\n if (type === 'string') {\n str += '\\'' + args[a] + '\\''\n lastPos = i + 2\n i++\n break\n }\n if (type === 'function') {\n str += args[a].name || '<anonymous>'\n lastPos = i + 2\n i++\n break\n }\n str += ss(args[a])\n lastPos = i + 2\n i++\n break\n case 115: // 's'\n if (a >= argLen)\n break\n if (lastPos < i)\n str += f.slice(lastPos, i)\n str += String(args[a])\n lastPos = i + 2\n i++\n break\n case 37: // '%'\n if (lastPos < i)\n str += f.slice(lastPos, i)\n str += '%'\n lastPos = i + 2\n i++\n break\n }\n ++a\n }\n ++i\n }\n if (lastPos === -1)\n return f\n else if (lastPos < flen) {\n str += f.slice(lastPos)\n }\n\n return str\n}\n","'use strict'\n\nvar format = require('quick-format-unescaped')\n\nmodule.exports = pino\n\nvar _console = pfGlobalThisOrFallback().console || {}\nvar stdSerializers = {\n mapHttpRequest: mock,\n mapHttpResponse: mock,\n wrapRequestSerializer: passthrough,\n wrapResponseSerializer: passthrough,\n wrapErrorSerializer: passthrough,\n req: mock,\n res: mock,\n err: asErrValue\n}\n\nfunction pino (opts) {\n opts = opts || {}\n opts.browser = opts.browser || {}\n\n var transmit = opts.browser.transmit\n if (transmit && typeof transmit.send !== 'function') { throw Error('pino: transmit option must have a send function') }\n\n var proto = opts.browser.write || _console\n if (opts.browser.write) opts.browser.asObject = true\n var serializers = opts.serializers || {}\n var serialize = Array.isArray(opts.browser.serialize)\n ? opts.browser.serialize.filter(function (k) {\n return k !== '!stdSerializers.err'\n })\n : opts.browser.serialize === true ? Object.keys(serializers) : false\n var stdErrSerialize = opts.browser.serialize\n\n if (\n Array.isArray(opts.browser.serialize) &&\n opts.browser.serialize.indexOf('!stdSerializers.err') > -1\n ) stdErrSerialize = false\n\n var levels = ['error', 'fatal', 'warn', 'info', 'debug', 'trace']\n\n if (typeof proto === 'function') {\n proto.error = proto.fatal = proto.warn =\n proto.info = proto.debug = proto.trace = proto\n }\n if (opts.enabled === false) opts.level = 'silent'\n var level = opts.level || 'info'\n var logger = Object.create(proto)\n if (!logger.log) logger.log = noop\n\n Object.defineProperty(logger, 'levelVal', {\n get: getLevelVal\n })\n Object.defineProperty(logger, 'level', {\n get: getLevel,\n set: setLevel\n })\n\n var setOpts = {\n transmit,\n serialize,\n asObject: opts.browser.asObject,\n levels,\n timestamp: getTimeFunction(opts)\n }\n logger.levels = pino.levels\n logger.level = level\n\n logger.setMaxListeners = logger.getMaxListeners =\n logger.emit = logger.addListener = logger.on =\n logger.prependListener = logger.once =\n logger.prependOnceListener = logger.removeListener =\n logger.removeAllListeners = logger.listeners =\n logger.listenerCount = logger.eventNames =\n logger.write = logger.flush = noop\n logger.serializers = serializers\n logger._serialize = serialize\n logger._stdErrSerialize = stdErrSerialize\n logger.child = child\n\n if (transmit) logger._logEvent = createLogEventShape()\n\n function getLevelVal () {\n return this.level === 'silent'\n ? Infinity\n : this.levels.values[this.level]\n }\n\n function getLevel () {\n return this._level\n }\n function setLevel (level) {\n if (level !== 'silent' && !this.levels.values[level]) {\n throw Error('unknown level ' + level)\n }\n this._level = level\n\n set(setOpts, logger, 'error', 'log') // <-- must stay first\n set(setOpts, logger, 'fatal', 'error')\n set(setOpts, logger, 'warn', 'error')\n set(setOpts, logger, 'info', 'log')\n set(setOpts, logger, 'debug', 'log')\n set(setOpts, logger, 'trace', 'log')\n }\n\n function child (bindings) {\n if (!bindings) {\n throw new Error('missing bindings for child Pino')\n }\n var bindingsSerializers = bindings.serializers\n if (serialize && bindingsSerializers) {\n var childSerializers = Object.assign({}, serializers, bindingsSerializers)\n var childSerialize = opts.browser.serialize === true\n ? Object.keys(childSerializers)\n : serialize\n delete bindings.serializers\n applySerializers([bindings], childSerialize, childSerializers, this._stdErrSerialize)\n }\n function Child (parent) {\n this._childLevel = (parent._childLevel | 0) + 1\n this.error = bind(parent, bindings, 'error')\n this.fatal = bind(parent, bindings, 'fatal')\n this.warn = bind(parent, bindings, 'warn')\n this.info = bind(parent, bindings, 'info')\n this.debug = bind(parent, bindings, 'debug')\n this.trace = bind(parent, bindings, 'trace')\n if (childSerializers) {\n this.serializers = childSerializers\n this._serialize = childSerialize\n }\n if (transmit) {\n this._logEvent = createLogEventShape(\n [].concat(parent._logEvent.bindings, bindings)\n )\n }\n }\n Child.prototype = this\n return new Child(this)\n }\n return logger\n}\n\npino.levels = {\n values: {\n fatal: 60,\n error: 50,\n warn: 40,\n info: 30,\n debug: 20,\n trace: 10\n },\n labels: {\n 10: 'trace',\n 20: 'debug',\n 30: 'info',\n 40: 'warn',\n 50: 'error',\n 60: 'fatal'\n }\n}\n\npino.stdSerializers = stdSerializers\npino.stdTimeFunctions = Object.assign({}, { nullTime, epochTime, unixTime, isoTime })\n\nfunction set (opts, logger, level, fallback) {\n var proto = Object.getPrototypeOf(logger)\n logger[level] = logger.levelVal > logger.levels.values[level] ? noop\n : (proto[level] ? proto[level] : (_console[level] || _console[fallback] || noop))\n\n wrap(opts, logger, level)\n}\n\nfunction wrap (opts, logger, level) {\n if (!opts.transmit && logger[level] === noop) return\n\n logger[level] = (function (write) {\n return function LOG () {\n var ts = opts.timestamp()\n var args = new Array(arguments.length)\n var proto = (Object.getPrototypeOf && Object.getPrototypeOf(this) === _console) ? _console : this\n for (var i = 0; i < args.length; i++) args[i] = arguments[i]\n\n if (opts.serialize && !opts.asObject) {\n applySerializers(args, this._serialize, this.serializers, this._stdErrSerialize)\n }\n if (opts.asObject) write.call(proto, asObject(this, level, args, ts))\n else write.apply(proto, args)\n\n if (opts.transmit) {\n var transmitLevel = opts.transmit.level || logger.level\n var transmitValue = pino.levels.values[transmitLevel]\n var methodValue = pino.levels.values[level]\n if (methodValue < transmitValue) return\n transmit(this, {\n ts,\n methodLevel: level,\n methodValue,\n transmitLevel,\n transmitValue: pino.levels.values[opts.transmit.level || logger.level],\n send: opts.transmit.send,\n val: logger.levelVal\n }, args)\n }\n }\n })(logger[level])\n}\n\nfunction asObject (logger, level, args, ts) {\n if (logger._serialize) applySerializers(args, logger._serialize, logger.serializers, logger._stdErrSerialize)\n var argsCloned = args.slice()\n var msg = argsCloned[0]\n var o = {}\n if (ts) {\n o.time = ts\n }\n o.level = pino.levels.values[level]\n var lvl = (logger._childLevel | 0) + 1\n if (lvl < 1) lvl = 1\n // deliberate, catching objects, arrays\n if (msg !== null && typeof msg === 'object') {\n while (lvl-- && typeof argsCloned[0] === 'object') {\n Object.assign(o, argsCloned.shift())\n }\n msg = argsCloned.length ? format(argsCloned.shift(), argsCloned) : undefined\n } else if (typeof msg === 'string') msg = format(argsCloned.shift(), argsCloned)\n if (msg !== undefined) o.msg = msg\n return o\n}\n\nfunction applySerializers (args, serialize, serializers, stdErrSerialize) {\n for (var i in args) {\n if (stdErrSerialize && args[i] instanceof Error) {\n args[i] = pino.stdSerializers.err(args[i])\n } else if (typeof args[i] === 'object' && !Array.isArray(args[i])) {\n for (var k in args[i]) {\n if (serialize && serialize.indexOf(k) > -1 && k in serializers) {\n args[i][k] = serializers[k](args[i][k])\n }\n }\n }\n }\n}\n\nfunction bind (parent, bindings, level) {\n return function () {\n var args = new Array(1 + arguments.length)\n args[0] = bindings\n for (var i = 1; i < args.length; i++) {\n args[i] = arguments[i - 1]\n }\n return parent[level].apply(this, args)\n }\n}\n\nfunction transmit (logger, opts, args) {\n var send = opts.send\n var ts = opts.ts\n var methodLevel = opts.methodLevel\n var methodValue = opts.methodValue\n var val = opts.val\n var bindings = logger._logEvent.bindings\n\n applySerializers(\n args,\n logger._serialize || Object.keys(logger.serializers),\n logger.serializers,\n logger._stdErrSerialize === undefined ? true : logger._stdErrSerialize\n )\n logger._logEvent.ts = ts\n logger._logEvent.messages = args.filter(function (arg) {\n // bindings can only be objects, so reference equality check via indexOf is fine\n return bindings.indexOf(arg) === -1\n })\n\n logger._logEvent.level.label = methodLevel\n logger._logEvent.level.value = methodValue\n\n send(methodLevel, logger._logEvent, val)\n\n logger._logEvent = createLogEventShape(bindings)\n}\n\nfunction createLogEventShape (bindings) {\n return {\n ts: 0,\n messages: [],\n bindings: bindings || [],\n level: { label: '', value: 0 }\n }\n}\n\nfunction asErrValue (err) {\n var obj = {\n type: err.constructor.name,\n msg: err.message,\n stack: err.stack\n }\n for (var key in err) {\n if (obj[key] === undefined) {\n obj[key] = err[key]\n }\n }\n return obj\n}\n\nfunction getTimeFunction (opts) {\n if (typeof opts.timestamp === 'function') {\n return opts.timestamp\n }\n if (opts.timestamp === false) {\n return nullTime\n }\n return epochTime\n}\n\nfunction mock () { return {} }\nfunction passthrough (a) { return a }\nfunction noop () {}\n\nfunction nullTime () { return false }\nfunction epochTime () { return Date.now() }\nfunction unixTime () { return Math.round(Date.now() / 1000.0) }\nfunction isoTime () { return new Date(Date.now()).toISOString() } // using Date.now() for testability\n\n/* eslint-disable */\n/* istanbul ignore next */\nfunction pfGlobalThisOrFallback () {\n function defd (o) { return typeof o !== 'undefined' && o }\n try {\n if (typeof globalThis !== 'undefined') return globalThis\n Object.defineProperty(Object.prototype, 'globalThis', {\n get: function () {\n delete Object.prototype.globalThis\n return (this.globalThis = this)\n },\n configurable: true\n })\n return globalThis\n } catch (e) {\n return defd(self) || defd(window) || defd(this) || {}\n }\n}\n/* eslint-enable */\n","import pino, {\n Logger as PinoLogger,\n LoggerOptions as PinoLoggerOptions,\n} from 'pino'\n\n/**\n * @see https://github.com/pinojs/pino/blob/v6.3.1/docs/api.md#options\n */\nexport type LoggerOptions = PinoLoggerOptions\n\nconst createLogger = (options: LoggerOptions = {}) => {\n const { name, ...other } = options\n\n const scope = ['TwitchJS'].concat(name || []).join('/')\n\n const logger = pino({\n name: scope,\n prettyPrint: true,\n level: 'info',\n ...other,\n })\n\n const profile = (startMessage?: string) => {\n const now = Date.now()\n\n if (startMessage) {\n logger.info(startMessage)\n }\n\n return {\n done: (endMessage: string, error?: any) => {\n const elapsed = Date.now() - now\n const message = `${endMessage} (${elapsed}ms)`\n\n if (error) {\n logger.error(message, error)\n } else {\n logger.info(message)\n }\n },\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n logger.profile = profile\n\n return logger as PinoLogger & { profile: typeof profile }\n}\n\nexport type Logger = ReturnType<typeof createLogger>\n\nexport default createLogger\n","/* global MozWebSocket */\n// https://github.com/maxogden/websocket-stream/blob/48dc3ddf943e5ada668c31ccd94e9186f02fafbd/ws-fallback.js\n\nlet ws;\n\nif (typeof WebSocket !== 'undefined') {\n ws = WebSocket;\n} else if (typeof MozWebSocket !== 'undefined') {\n ws = MozWebSocket;\n} else if (typeof global !== 'undefined') {\n ws = global.WebSocket || global.MozWebSocket;\n} else if (typeof window !== 'undefined') {\n ws = window.WebSocket || window.MozWebSocket;\n} else if (typeof self !== 'undefined') {\n ws = self.WebSocket || self.MozWebSocket;\n}\n\nmodule.exports = ws;\n","'use strict';\n\nconst pFinally = require('p-finally');\n\nclass TimeoutError extends Error {\n\tconstructor(message) {\n\t\tsuper(message);\n\t\tthis.name = 'TimeoutError';\n\t}\n}\n\nconst pTimeout = (promise, milliseconds, fallback) => new Promise((resolve, reject) => {\n\tif (typeof milliseconds !== 'number' || milliseconds < 0) {\n\t\tthrow new TypeError('Expected `milliseconds` to be a positive number');\n\t}\n\n\tif (milliseconds === Infinity) {\n\t\tresolve(promise);\n\t\treturn;\n\t}\n\n\tconst timer = setTimeout(() => {\n\t\tif (typeof fallback === 'function') {\n\t\t\ttry {\n\t\t\t\tresolve(fallback());\n\t\t\t} catch (error) {\n\t\t\t\treject(error);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst message = typeof fallback === 'string' ? fallback : `Promise timed out after ${milliseconds} milliseconds`;\n\t\tconst timeoutError = fallback instanceof Error ? fallback : new TimeoutError(message);\n\n\t\tif (typeof promise.cancel === 'function') {\n\t\t\tpromise.cancel();\n\t\t}\n\n\t\treject(timeoutError);\n\t}, milliseconds);\n\n\t// TODO: Use native `finally` keyword when targeting Node.js 10\n\tpFinally(\n\t\t// eslint-disable-next-line promise/prefer-await-to-then\n\t\tpromise.then(resolve, reject),\n\t\t() => {\n\t\t\tclearTimeout(timer);\n\t\t}\n\t);\n});\n\nmodule.exports = pTimeout;\n// TODO: Remove this for the next major release\nmodule.exports.default = pTimeout;\n\nmodule.exports.TimeoutError = TimeoutError;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// Port of lower_bound from https://en.cppreference.com/w/cpp/algorithm/lower_bound\n// Used to compute insertion index to keep queue sorted after insertion\nfunction lowerBound(array, value, comparator) {\n let first = 0;\n let count = array.length;\n while (count > 0) {\n const step = (count / 2) | 0;\n let it = first + step;\n if (comparator(array[it], value) <= 0) {\n first = ++it;\n count -= step + 1;\n }\n else {\n count = step;\n }\n }\n return first;\n}\nexports.default = lowerBound;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst lower_bound_1 = require(\"./lower-bound\");\nclass PriorityQueue {\n constructor() {\n this._queue = [];\n }\n enqueue(run, options) {\n options = Object.assign({ priority: 0 }, options);\n const element = {\n priority: options.priority,\n run\n };\n if (this.size && this._queue[this.size - 1].priority >= options.priority) {\n this._queue.push(element);\n return;\n }\n const index = lower_bound_1.default(this._queue, element, (a, b) => b.priority - a.priority);\n this._queue.splice(index, 0, element);\n }\n dequeue() {\n const item = this._queue.shift();\n return item === null || item === void 0 ? void 0 : item.run;\n }\n filter(options) {\n return this._queue.filter((element) => element.priority === options.priority).map((element) => element.run);\n }\n get size() {\n return this._queue.length;\n }\n}\nexports.default = PriorityQueue;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst EventEmitter = require(\"eventemitter3\");\nconst p_timeout_1 = require(\"p-timeout\");\nconst priority_queue_1 = require(\"./priority-queue\");\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nconst empty = () => { };\nconst timeoutError = new p_timeout_1.TimeoutError();\n/**\nPromise queue with concurrency control.\n*/\nclass PQueue extends EventEmitter {\n constructor(options) {\n var _a, _b, _c, _d;\n super();\n this._intervalCount = 0;\n this._intervalEnd = 0;\n this._pendingCount = 0;\n this._resolveEmpty = empty;\n this._resolveIdle = empty;\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n options = Object.assign({ carryoverConcurrencyCount: false, intervalCap: Infinity, interval: 0, concurrency: Infinity, autoStart: true, queueClass: priority_queue_1.default }, options);\n if (!(typeof options.intervalCap === 'number' && options.intervalCap >= 1)) {\n throw new TypeError(`Expected \\`intervalCap\\` to be a number from 1 and up, got \\`${(_b = (_a = options.intervalCap) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : ''}\\` (${typeof options.intervalCap})`);\n }\n if (options.interval === undefined || !(Number.isFinite(options.interval) && options.interval >= 0)) {\n throw new TypeError(`Expected \\`interval\\` to be a finite number >= 0, got \\`${(_d = (_c = options.interval) === null || _c === void 0 ? void 0 : _c.toString()) !== null && _d !== void 0 ? _d : ''}\\` (${typeof options.interval})`);\n }\n this._carryoverConcurrencyCount = options.carryoverConcurrencyCount;\n this._isIntervalIgnored = options.intervalCap === Infinity || options.interval === 0;\n this._intervalCap = options.intervalCap;\n this._interval = options.interval;\n this._queue = new options.queueClass();\n this._queueClass = options.queueClass;\n this.concurrency = options.concurrency;\n this._timeout = options.timeout;\n this._throwOnTimeout = options.throwOnTimeout === true;\n this._isPaused = options.autoStart === false;\n }\n get _doesIntervalAllowAnother() {\n return this._isIntervalIgnored || this._intervalCount < this._intervalCap;\n }\n get _doesConcurrentAllowAnother() {\n return this._pendingCount < this._concurrency;\n }\n _next() {\n this._pendingCount--;\n this._tryToStartAnother();\n this.emit('next');\n }\n _resolvePromises() {\n this._resolveEmpty();\n this._resolveEmpty = empty;\n if (this._pendingCount === 0) {\n this._resolveIdle();\n this._resolveIdle = empty;\n this.emit('idle');\n }\n }\n _onResumeInterval() {\n this._onInterval();\n this._initializeIntervalIfNeeded();\n this._timeoutId = undefined;\n }\n _isIntervalPaused() {\n const now = Date.now();\n if (this._intervalId === undefined) {\n const delay = this._intervalEnd - now;\n if (delay < 0) {\n // Act as the interval was done\n // We don't need to resume it here because it will be resumed on line 160\n this._intervalCount = (this._carryoverConcurrencyCount) ? this._pendingCount : 0;\n }\n else {\n // Act as the interval is pending\n if (this._timeoutId === undefined) {\n this._timeoutId = setTimeout(() => {\n this._onResumeInterval();\n }, delay);\n }\n return true;\n }\n }\n return false;\n }\n _tryToStartAnother() {\n if (this._queue.size === 0) {\n // We can clear the interval (\"pause\")\n // Because we can redo it later (\"resume\")\n if (this._intervalId) {\n clearInterval(this._intervalId);\n }\n this._intervalId = undefined;\n this._resolvePromises();\n return false;\n }\n if (!this._isPaused) {\n const canInitializeInterval = !this._isIntervalPaused();\n if (this._doesIntervalAllowAnother && this._doesConcurrentAllowAnother) {\n this.emit('active');\n this._queue.dequeue()();\n if (canInitializeInterval) {\n this._initializeIntervalIfNeeded();\n }\n return true;\n }\n }\n return false;\n }\n _initializeIntervalIfNeeded() {\n if (this._isIntervalIgnored || this._intervalId !== undefined) {\n return;\n }\n this._intervalId = setInterval(() => {\n this._onInterval();\n }, this._interval);\n this._intervalEnd = Date.now() + this._interval;\n }\n _onInterval() {\n if (this._intervalCount === 0 && this._pendingCount === 0 && this._intervalId) {\n clearInterval(this._intervalId);\n this._intervalId = undefined;\n }\n this._intervalCount = this._carryoverConcurrencyCount ? this._pendingCount : 0;\n this._processQueue();\n }\n /**\n Executes all queued functions until it reaches the limit.\n */\n _processQueue() {\n // eslint-disable-next-line no-empty\n while (this._tryToStartAnother()) { }\n }\n get concurrency() {\n return this._concurrency;\n }\n set concurrency(newConcurrency) {\n if (!(typeof newConcurrency === 'number' && newConcurrency >= 1)) {\n throw new TypeError(`Expected \\`concurrency\\` to be a number from 1 and up, got \\`${newConcurrency}\\` (${typeof newConcurrency})`);\n }\n this._concurrency = newConcurrency;\n this._processQueue();\n }\n /**\n Adds a sync or async task to the queue. Always returns a promise.\n */\n async add(fn, options = {}) {\n return new Promise((resolve, reject) => {\n const run = async () => {\n this._pendingCount++;\n this._intervalCount++;\n try {\n const operation = (this._timeout === undefined && options.timeout === undefined) ? fn() : p_timeout_1.default(Promise.resolve(fn()), (options.timeout === undefined ? this._timeout : options.timeout), () => {\n if (options.throwOnTimeout === undefined ? this._throwOnTimeout : options.throwOnTimeout) {\n reject(timeoutError);\n }\n return undefined;\n });\n resolve(await operation);\n }\n catch (error) {\n reject(error);\n }\n this._next();\n };\n this._queue.enqueue(run, options);\n this._tryToStartAnother();\n this.emit('add');\n });\n }\n /**\n Same as `.add()`, but accepts an array of sync or async functions.\n\n @returns A promise that resolves when all functions are resolved.\n */\n async addAll(functions, options) {\n return Promise.all(functions.map(async (function_) => this.add(function_, options)));\n }\n /**\n Start (or resume) executing enqueued tasks within concurrency limit. No need to call this if queue is not paused (via `options.autoStart = false` or by `.pause()` method.)\n */\n start() {\n if (!this._isPaused) {\n return this;\n }\n this._isPaused = false;\n this._processQueue();\n return this;\n }\n /**\n Put queue execution on hold.\n */\n pause() {\n this._isPaused = true;\n }\n /**\n Clear the queue.\n */\n clear() {\n this._queue = new this._queueClass();\n }\n /**\n Can be called multiple times. Useful if you for example add additional items at a later time.\n\n @returns A promise that settles when the queue becomes empty.\n */\n async onEmpty() {\n // Instantly resolve if the queue is empty\n if (this._queue.size === 0) {\n return;\n }\n return new Promise(resolve => {\n const existingResolve = this._resolveEmpty;\n this._resolveEmpty = () => {\n existingResolve();\n resolve();\n };\n });\n }\n /**\n The difference with `.onEmpty` is that `.onIdle` guarantees that all work from the queue has finished. `.onEmpty` merely signals that the queue is empty, but it could mean that some promises haven't completed yet.\n\n @returns A promise that settles when the queue becomes empty, and all promises have completed; `queue.size === 0 && queue.pending === 0`.\n */\n async onIdle() {\n // Instantly resolve if none pending and if nothing else is queued\n if (this._pendingCount === 0 && this._queue.size === 0) {\n return;\n }\n return new Promise(resolve => {\n const existingResolve = this._resolveIdle;\n this._resolveIdle = () => {\n existingResolve();\n resolve();\n };\n });\n }\n /**\n Size of the queue.\n */\n get size() {\n return this._queue.size;\n }\n /**\n Size of the queue, filtered by the given options.\n\n For example, this can be used to find the number of items remaining in the queue with a specific priority level.\n */\n sizeBy(options) {\n // eslint-disable-next-line unicorn/no-fn-reference-in-iterator\n return this._queue.filter(options).length;\n }\n /**\n Number of pending promises.\n */\n get pending() {\n return this._pendingCount;\n }\n /**\n Whether the queue is currently paused.\n */\n get isPaused() {\n return this._isPaused;\n }\n get timeout() {\n return this._timeout;\n }\n /**\n Set the timeout for future operations.\n */\n set timeout(milliseconds) {\n this._timeout = milliseconds;\n }\n}\nexports.default = PQueue;\n","export const CHAT_SERVER = 'irc-ws.chat.twitch.tv'\nexport const CHAT_SERVER_PORT = 6667\nexport const CHAT_SERVER_SSL_PORT = 443\n\nexport const CONNECTION_TIMEOUT = 5000\nexport const KEEP_ALIVE_PING_TIMEOUT = 150000\nexport const KEEP_ALIVE_RECONNECT_TIMEOUT = 200000\n\nexport const JOIN_TIMEOUT = 1000 // milliseconds.\nexport const COMMAND_TIMEOUT = 1000 // milliseconds.\n\nexport const CLIENT_PRIORITY = 100\n\n// See https://dev.twitch.tv/docs/irc/guide/#command--message-limits.\nexport const RATE_LIMIT_USER = 20 // per period.\nexport const RATE_LIMIT_MODERATOR = 100 // per period.\nexport const RATE_LIMIT_KNOWN_BOT = 50 // per period.\nexport const RATE_LIMIT_VERIFIED_BOT = 7500 // per period.\n\nexport const ERROR_CONNECT_TIMED_OUT = 'ERROR: connect timed out'\nexport const ERROR_CONNECTION_IN_PROGRESS = 'ERROR: connection in progress'\nexport const ERROR_JOIN_TIMED_OUT = 'ERROR: join timed out'\nexport const ERROR_SAY_TIMED_OUT = 'ERROR: say timed out'\nexport const ERROR_COMMAND_TIMED_OUT = 'ERROR: command timed out'\nexport const ERROR_COMMAND_UNRECOGNIZED = 'ERROR: command unrecognized'\nexport const ERROR_PART_TIMED_OUT = 'ERROR: part timed out'\n\nexport const MESSAGE_PARAMETER_PREFIX = 'msgParam'\nexport const MESSAGE_PARAMETER_PREFIX_RE = new RegExp(\n `^${MESSAGE_PARAMETER_PREFIX}(\\\\w+)`,\n)\nexport const PRIVATE_MESSAGE_HOSTED_RE = /:.+@jtv\\.tmi\\.twitch\\.tv PRIVMSG #?(\\w+) :(\\w+) is now (?:(auto) )?hosting[A-z ]+(\\d+)?/\n\nexport const ANONYMOUS_USERNAME = 'justinfan'\nexport const ANONYMOUS_USERNAME_RE = new RegExp(`^${ANONYMOUS_USERNAME}(\\\\d+)$`)\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * A base error.\n * @param message the message\n */\nclass BaseError extends Error {\n constructor(message) {\n super(message);\n /* istanbul ignore next */\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n Object.defineProperty(this, \"name\", {\n value: this.constructor.name,\n });\n }\n}\n/**\n * A parsing error.\n */\nclass ParseError extends BaseError {\n}\nexports.ParseError = ParseError;\n/**\n * A formatting error.\n */\nclass FormatError extends BaseError {\n}\nexports.FormatError = FormatError;\n//# sourceMappingURL=errors.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Indicates if a string should be escaped.\n * @param input the string to validate\n */\nfunction shouldEscapeString(input) {\n console.log(input);\n for (let i = 0; i < input.length; i += 1) {\n const charCode = input.charCodeAt(i);\n switch (charCode) {\n case 10:\n case 13:\n case 32:\n case 59:\n case 92:\n return true;\n }\n }\n return false;\n}\nexports.shouldEscapeString = shouldEscapeString;\n/**\n * Escapes a string.\n * @param input the string to escape\n * @return the escaped string.\n */\nfunction escapeString(input) {\n if (!input) {\n return \"\";\n }\n let output = \"\";\n for (let i = 0; i < input.length; i += 1) {\n let charCode = input.charCodeAt(i);\n switch (charCode) {\n case 10:\n output += \"\\\\n\";\n break;\n case 13:\n output += \"\\\\r\";\n break;\n case 32:\n output += \"\\\\s\";\n break;\n case 59:\n output += \"\\\\:\";\n break;\n case 92:\n output += \"\\\\\\\\\";\n break;\n default:\n output += String.fromCharCode(charCode);\n }\n }\n return output;\n}\nexports.escapeString = escapeString;\n/**\n * Unescapes a string.\n * @param input the string to unescape\n * @return the unescaped string.\n */\nfunction unescapeString(input) {\n if (!input) {\n return \"\";\n }\n let nextBackslash;\n if ((nextBackslash = input.indexOf(\"\\\\\")) === -1) {\n return input;\n }\n const end = input.length - 1;\n let cursor = 0;\n let output = \"\";\n do {\n if (cursor < nextBackslash) {\n output += input.slice(cursor, nextBackslash);\n }\n if ((cursor = nextBackslash + 1) >= end) {\n break;\n }\n let charCode = input.charCodeAt(cursor);\n switch (charCode) {\n case 58:\n charCode = 59;\n break;\n case 110:\n charCode = 10;\n break;\n case 114:\n charCode = 13;\n break;\n case 115:\n charCode = 32;\n break;\n }\n cursor += 1;\n output += String.fromCharCode(charCode);\n } while ((nextBackslash = input.indexOf(\"\\\\\", cursor)) !== -1);\n if (cursor <= end) {\n output += input.slice(cursor);\n }\n return output;\n}\nexports.unescapeString = unescapeString;\n//# sourceMappingURL=helpers.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst errors_1 = require(\"./errors\");\nconst helpers_1 = require(\"./helpers\");\n/**\n * Parses message tags.\n * @param input the message tags input\n * @return the parsed message tags.\n */\nfunction parseTags(input) {\n const result = {};\n const tags = input.split(\";\");\n const tagsLength = tags.length;\n for (let i = 0; i < tagsLength; i += 1) {\n const [key, value] = tags[i].split(\"=\");\n result[key] = value === undefined || helpers_1.unescapeString(value);\n }\n return result;\n}\nexports.parseTags = parseTags;\n/**\n * Parses a message prefix.\n * @param input the message prefix input\n * @return the parsed message prefix.\n */\nfunction parsePrefix(input) {\n if (!input) {\n return null;\n }\n let userIndex;\n let hostIndex;\n if ((userIndex = input.indexOf(\"!\")) === 0) {\n return null;\n }\n if ((hostIndex = input.indexOf(\"@\", userIndex + 1)) === 0) {\n return null;\n }\n const prefix = {};\n if (userIndex > -1 && hostIndex > -1) {\n prefix.name = input.slice(0, userIndex);\n prefix.user = input.slice(userIndex + 1, hostIndex);\n prefix.host = input.slice(hostIndex + 1);\n }\n else if (userIndex > -1) {\n prefix.name = input.slice(0, userIndex);\n prefix.user = input.slice(userIndex + 1);\n }\n else if (hostIndex > -1) {\n prefix.name = input.slice(0, hostIndex);\n prefix.host = input.slice(hostIndex + 1);\n }\n else {\n prefix.name = input;\n }\n return prefix;\n}\nexports.parsePrefix = parsePrefix;\n/**\n * Parses a message.\n * @throws {ParseError}\n * @param input the message input\n * @return the parsed message.\n */\nfunction parse(input) {\n const message = {};\n Object.defineProperties(message, {\n middle: {\n writable: true,\n value: [],\n },\n trailing: {\n writable: true,\n value: undefined,\n },\n params: {\n enumerable: true,\n get() {\n return this.middle.concat(this.trailing || []);\n },\n },\n });\n let cursor = 0;\n let nextWhitespace = 0;\n if (input.charCodeAt(cursor) === 64) {\n if ((nextWhitespace = input.indexOf(\" \")) === -1) {\n throw new errors_1.ParseError(\"Invalid Message\");\n }\n message.tags = parseTags(input.slice(cursor + 1, nextWhitespace));\n cursor = nextWhitespace + 1;\n }\n while (input.charCodeAt(cursor) === 32) {\n cursor += 1;\n }\n if (input.charCodeAt(cursor) === 58) {\n if ((nextWhitespace = input.indexOf(\" \", cursor)) === -1) {\n throw new errors_1.ParseError(\"Invalid Message\");\n }\n const prefix = parsePrefix(input.slice(cursor + 1, nextWhitespace));\n if (prefix) {\n message.prefix = prefix;\n }\n cursor = nextWhitespace + 1;\n while (input.charCodeAt(cursor) === 32) {\n cursor += 1;\n }\n }\n if ((nextWhitespace = input.indexOf(\" \", cursor)) === -1) {\n if (input.length > cursor) {\n message.command = input.slice(cursor);\n return message;\n }\n throw new errors_1.ParseError(\"Invalid Message\");\n }\n message.command = input.slice(cursor, nextWhitespace);\n cursor = nextWhitespace + 1;\n while (input.charCodeAt(cursor) === 32) {\n cursor += 1;\n }\n while (cursor < input.length) {\n if (input.charCodeAt(cursor) === 58) {\n message.trailing = input.slice(cursor + 1);\n break;\n }\n if ((nextWhitespace = input.indexOf(\" \", cursor)) === -1) {\n message.middle.push(input.slice(cursor));\n break;\n }\n message.middle.push(input.slice(cursor, nextWhitespace));\n cursor = nextWhitespace + 1;\n while (input.charCodeAt(cursor) === 32) {\n cursor += 1;\n }\n }\n return message;\n}\nexports.parse = parse;\n//# sourceMappingURL=parse.js.map","'use strict';\n\nconst isObject = value => typeof value === 'object' && value !== null;\n\n// Customized for this use-case\nconst isObjectCustom = value =>\n\tisObject(value) &&\n\t!(value instanceof RegExp) &&\n\t!(value instanceof Error) &&\n\t!(value instanceof Date);\n\nconst mapObject = (object, mapper, options, isSeen = new WeakMap()) => {\n\toptions = {\n\t\tdeep: false,\n\t\ttarget: {},\n\t\t...options\n\t};\n\n\tif (isSeen.has(object)) {\n\t\treturn isSeen.get(object);\n\t}\n\n\tisSeen.set(object, options.target);\n\n\tconst {target} = options;\n\tdelete options.target;\n\n\tconst mapArray = array => array.map(element => isObjectCustom(element) ? mapObject(element, mapper, options, isSeen) : element);\n\tif (Array.isArray(object)) {\n\t\treturn mapArray(object);\n\t}\n\n\tfor (const [key, value] of Object.entries(object)) {\n\t\tlet [newKey, newValue] = mapper(key, value, object);\n\n\t\tif (options.deep && isObjectCustom(newValue)) {\n\t\t\tnewValue = Array.isArray(newValue) ?\n\t\t\t\tmapArray(newValue) :\n\t\t\t\tmapObject(newValue, mapper, options, isSeen);\n\t\t}\n\n\t\ttarget[newKey] = newValue;\n\t}\n\n\treturn target;\n};\n\nmodule.exports = (object, mapper, options) => {\n\tif (!isObject(object)) {\n\t\tthrow new TypeError(`Expected an object, got \\`${object}\\` (${typeof object})`);\n\t}\n\n\treturn mapObject(object, mapper, options);\n};\n","'use strict';\n\nconst preserveCamelCase = string => {\n\tlet isLastCharLower = false;\n\tlet isLastCharUpper = false;\n\tlet isLastLastCharUpper = false;\n\n\tfor (let i = 0; i < string.length; i++) {\n\t\tconst character = string[i];\n\n\t\tif (isLastCharLower && /[a-zA-Z]/.test(character) && character.toUpperCase() === character) {\n\t\t\tstring = string.slice(0, i) + '-' + string.slice(i);\n\t\t\tisLastCharLower = false;\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = true;\n\t\t\ti++;\n\t\t} else if (isLastCharUpper && isLastLastCharUpper && /[a-zA-Z]/.test(character) && character.toLowerCase() === character) {\n\t\t\tstring = string.slice(0, i - 1) + '-' + string.slice(i - 1);\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = false;\n\t\t\tisLastCharLower = true;\n\t\t} else {\n\t\t\tisLastCharLower = character.toLowerCase() === character && character.toUpperCase() !== character;\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = character.toUpperCase() === character && character.toLowerCase() !== character;\n\t\t}\n\t}\n\n\treturn string;\n};\n\nconst camelCase = (input, options) => {\n\tif (!(typeof input === 'string' || Array.isArray(input))) {\n\t\tthrow new TypeError('Expected the input to be `string | string[]`');\n\t}\n\n\toptions = Object.assign({\n\t\tpascalCase: false\n\t}, options);\n\n\tconst postProcess = x => options.pascalCase ? x.charAt(0).toUpperCase() + x.slice(1) : x;\n\n\tif (Array.isArray(input)) {\n\t\tinput = input.map(x => x.trim())\n\t\t\t.filter(x => x.length)\n\t\t\t.join('-');\n\t} else {\n\t\tinput = input.trim();\n\t}\n\n\tif (input.length === 0) {\n\t\treturn '';\n\t}\n\n\tif (input.length === 1) {\n\t\treturn options.pascalCase ? input.toUpperCase() : input.toLowerCase();\n\t}\n\n\tconst hasUpperCase = input !== input.toLowerCase();\n\n\tif (hasUpperCase) {\n\t\tinput = preserveCamelCase(input);\n\t}\n\n\tinput = input\n\t\t.replace(/^[_.\\- ]+/, '')\n\t\t.toLowerCase()\n\t\t.replace(/[_.\\- ]+(\\w|$)/g, (_, p1) => p1.toUpperCase())\n\t\t.replace(/\\d+(\\w|$)/g, m => m.toUpperCase());\n\n\treturn postProcess(input);\n};\n\nmodule.exports = camelCase;\n// TODO: Remove this for the next major release\nmodule.exports.default = camelCase;\n","'use strict';\n\nclass QuickLRU {\n\tconstructor(options = {}) {\n\t\tif (!(options.maxSize && options.maxSize > 0)) {\n\t\t\tthrow new TypeError('`maxSize` must be a number greater than 0');\n\t\t}\n\n\t\tthis.maxSize = options.maxSize;\n\t\tthis.cache = new Map();\n\t\tthis.oldCache = new Map();\n\t\tthis._size = 0;\n\t}\n\n\t_set(key, value) {\n\t\tthis.cache.set(key, value);\n\t\tthis._size++;\n\n\t\tif (this._size >= this.maxSize) {\n\t\t\tthis._size = 0;\n\t\t\tthis.oldCache = this.cache;\n\t\t\tthis.cache = new Map();\n\t\t}\n\t}\n\n\tget(key) {\n\t\tif (this.cache.has(key)) {\n\t\t\treturn this.cache.get(key);\n\t\t}\n\n\t\tif (this.oldCache.has(key)) {\n\t\t\tconst value = this.oldCache.get(key);\n\t\t\tthis.oldCache.delete(key);\n\t\t\tthis._set(key, value);\n\t\t\treturn value;\n\t\t}\n\t}\n\n\tset(key, value) {\n\t\tif (this.cache.has(key)) {\n\t\t\tthis.cache.set(key, value);\n\t\t} else {\n\t\t\tthis._set(key, value);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\thas(key) {\n\t\treturn this.cache.has(key) || this.oldCache.has(key);\n\t}\n\n\tpeek(key) {\n\t\tif (this.cache.has(key)) {\n\t\t\treturn this.cache.get(key);\n\t\t}\n\n\t\tif (this.oldCache.has(key)) {\n\t\t\treturn this.oldCache.get(key);\n\t\t}\n\t}\n\n\tdelete(key) {\n\t\tconst deleted = this.cache.delete(key);\n\t\tif (deleted) {\n\t\t\tthis._size--;\n\t\t}\n\n\t\treturn this.oldCache.delete(key) || deleted;\n\t}\n\n\tclear() {\n\t\tthis.cache.clear();\n\t\tthis.oldCache.clear();\n\t\tthis._size = 0;\n\t}\n\n\t* keys() {\n\t\tfor (const [key] of this) {\n\t\t\tyield key;\n\t\t}\n\t}\n\n\t* values() {\n\t\tfor (const [, value] of this) {\n\t\t\tyield value;\n\t\t}\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tfor (const item of this.cache) {\n\t\t\tyield item;\n\t\t}\n\n\t\tfor (const item of this.oldCache) {\n\t\t\tconst [key] = item;\n\t\t\tif (!this.cache.has(key)) {\n\t\t\t\tyield item;\n\t\t\t}\n\t\t}\n\t}\n\n\tget size() {\n\t\tlet oldCacheSize = 0;\n\t\tfor (const key of this.oldCache.keys()) {\n\t\t\tif (!this.cache.has(key)) {\n\t\t\t\toldCacheSize++;\n\t\t\t}\n\t\t}\n\n\t\treturn this._size + oldCacheSize;\n\t}\n}\n\nmodule.exports = QuickLRU;\n","'use strict';\nconst mapObj = require('map-obj');\nconst camelCase = require('camelcase');\nconst QuickLru = require('quick-lru');\n\nconst has = (array, key) => array.some(x => {\n\tif (typeof x === 'string') {\n\t\treturn x === key;\n\t}\n\n\tx.lastIndex = 0;\n\treturn x.test(key);\n});\n\nconst cache = new QuickLru({maxSize: 100000});\n\n// Reproduces behavior from `map-obj`\nconst isObject = value =>\n\ttypeof value === 'object' &&\n\tvalue !== null &&\n\t!(value instanceof RegExp) &&\n\t!(value instanceof Error) &&\n\t!(value instanceof Date);\n\nconst camelCaseConvert = (input, options) => {\n\tif (!isObject(input)) {\n\t\treturn input;\n\t}\n\n\toptions = {\n\t\tdeep: false,\n\t\tpascalCase: false,\n\t\t...options\n\t};\n\n\tconst {exclude, pascalCase, stopPaths, deep} = options;\n\n\tconst stopPathsSet = new Set(stopPaths);\n\n\tconst makeMapper = parentPath => (key, value) => {\n\t\tif (deep && isObject(value)) {\n\t\t\tconst path = parentPath === undefined ? key : `${parentPath}.${key}`;\n\n\t\t\tif (!stopPathsSet.has(path)) {\n\t\t\t\tvalue = mapObj(value, makeMapper(path));\n\t\t\t}\n\t\t}\n\n\t\tif (!(exclude && has(exclude, key))) {\n\t\t\tconst cacheKey = pascalCase ? `${key}_` : key;\n\n\t\t\tif (cache.has(cacheKey)) {\n\t\t\t\tkey = cache.get(cacheKey);\n\t\t\t} else {\n\t\t\t\tconst ret = camelCase(key, {pascalCase});\n\n\t\t\t\tif (key.length < 100) { // Prevent abuse\n\t\t\t\t\tcache.set(cacheKey, ret);\n\t\t\t\t}\n\n\t\t\t\tkey = ret;\n\t\t\t}\n\t\t}\n\n\t\treturn [key, value];\n\t};\n\n\treturn mapObj(input, makeMapper(undefined));\n};\n\nmodule.exports = (input, options) => {\n\tif (Array.isArray(input)) {\n\t\treturn Object.keys(input).map(key => camelCaseConvert(input[key], options));\n\t}\n\n\treturn camelCaseConvert(input, options);\n};\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nmodule.exports = isPrototype;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nmodule.exports = overArg;\n","var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n","var isPrototype = require('./_isPrototype'),\n nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeys;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n","var DataView = require('./_DataView'),\n Map = require('./_Map'),\n Promise = require('./_Promise'),\n Set = require('./_Set'),\n WeakMap = require('./_WeakMap'),\n baseGetTag = require('./_baseGetTag'),\n toSource = require('./_toSource');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nmodule.exports = getTag;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n","var baseIsArguments = require('./_baseIsArguments'),\n isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n","var isFunction = require('./isFunction'),\n isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n","var root = require('./_root'),\n stubFalse = require('./stubFalse');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n","var baseGetTag = require('./_baseGetTag'),\n isLength = require('./isLength'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n","var baseIsTypedArray = require('./_baseIsTypedArray'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n","var baseKeys = require('./_baseKeys'),\n getTag = require('./_getTag'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isArrayLike = require('./isArrayLike'),\n isBuffer = require('./isBuffer'),\n isPrototype = require('./_isPrototype'),\n isTypedArray = require('./isTypedArray');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n setTag = '[object Set]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * jQuery-like collections are considered empty if they have a `length` of `0`.\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n * @example\n *\n * _.isEmpty(null);\n * // => true\n *\n * _.isEmpty(true);\n * // => true\n *\n * _.isEmpty(1);\n * // => true\n *\n * _.isEmpty([1, 2, 3]);\n * // => false\n *\n * _.isEmpty({ 'a': 1 });\n * // => false\n */\nfunction isEmpty(value) {\n if (value == null) {\n return true;\n }\n if (isArrayLike(value) &&\n (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n return !value.length;\n }\n var tag = getTag(value);\n if (tag == mapTag || tag == setTag) {\n return !value.size;\n }\n if (isPrototype(value)) {\n return !baseKeys(value).length;\n }\n for (var key in value) {\n if (hasOwnProperty.call(value, key)) {\n return false;\n }\n }\n return true;\n}\n\nmodule.exports = isEmpty;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var toString = require('./toString');\n\n/**\n * Converts `string`, as a whole, to lower case just like\n * [String#toLowerCase](https://mdn.io/toLowerCase).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the lower cased string.\n * @example\n *\n * _.toLower('--Foo-Bar--');\n * // => '--foo-bar--'\n *\n * _.toLower('fooBar');\n * // => 'foobar'\n *\n * _.toLower('__FOO_BAR__');\n * // => '__foo_bar__'\n */\nfunction toLower(value) {\n return toString(value).toLowerCase();\n}\n\nmodule.exports = toLower;\n","import toLower from 'lodash/toLower'\n\nexport const generalTimestamp = (maybeTimestamp: string) => {\n const timestamp = new Date(parseInt(maybeTimestamp, 10))\n return timestamp.toString() !== 'Invalid Date' ? timestamp : new Date()\n}\n\nexport const username = (...maybeUsernames: any[]): string =>\n maybeUsernames.reduce((maybeUsername, name) => {\n if (typeof name !== 'string') {\n return maybeUsername\n }\n\n if (name === 'tmi.twitch.tv') {\n return 'tmi.twitch.tv'\n }\n\n return toLower(name).split('.')[0]\n }, undefined)\n","import { parse } from 'tekko/dist/parse'\nimport camelcaseKeys from 'camelcase-keys'\n\nimport isEmpty from 'lodash/isEmpty'\nimport toLower from 'lodash/toLower'\n\nimport { BaseMessage, Commands, Events } from '../../../twitch'\n\nimport * as helpers from './helpers'\n\nconst baseParser = (rawMessages: string, username = ''): BaseMessage[] => {\n const rawMessagesArray = rawMessages.split(/\\r?\\n/g)\n\n return rawMessagesArray.reduce((messages, rawMessage) => {\n if (!rawMessage.length) {\n return messages\n }\n\n const {\n command,\n tags = {},\n prefix: { name, user, host } = {\n name: undefined,\n user: undefined,\n host: undefined,\n },\n params: [channel, message],\n } = parse(rawMessage)\n\n const timestamp = String(tags['tmi-sent-ts']) || Date.now().toString()\n\n const messageTags = isEmpty(tags)\n ? {}\n : (camelcaseKeys(tags) as { [key: string]: string })\n\n const messageUsername = helpers.username(\n host,\n name,\n user,\n messageTags.login,\n messageTags.username,\n messageTags.displayName,\n )\n\n const nextMessage = {\n _raw: rawMessage,\n timestamp: helpers.generalTimestamp(timestamp),\n command: command as Commands,\n event: command as Events,\n channel: channel !== '*' ? channel : '',\n username: messageUsername,\n isSelf:\n typeof messageUsername === 'string' &&\n toLower(username) === messageUsername,\n tags: messageTags,\n message,\n }\n\n return [...messages, nextMessage]\n }, [] as BaseMessage[])\n}\n\nexport default baseParser\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'use strict';\n\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\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar invariant = function(condition, format, a, b, c, d, e, f) {\n if (process.env.NODE_ENV !== 'production') {\n if (format === undefined) {\n throw new Error('invariant requires an error message argument');\n }\n }\n\n if (!condition) {\n var error;\n if (format === undefined) {\n error = new Error(\n 'Minified exception occurred; use the non-minified dev environment ' +\n 'for the full error message and additional helpful warnings.'\n );\n } else {\n var args = [a, b, c, d, e, f];\n var argIndex = 0;\n error = new Error(\n format.replace(/%s/g, function() { return args[argIndex++]; })\n );\n error.name = 'Invariant Violation';\n }\n\n error.framesToPop = 1; // we don't care about invariant's own frame\n throw error;\n }\n};\n\nmodule.exports = invariant;\n","/**\n * The base implementation of `_.conformsTo` which accepts `props` to check.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property predicates to conform to.\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n */\nfunction baseConformsTo(object, source, props) {\n var length = props.length;\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (length--) {\n var key = props[length],\n predicate = source[key],\n value = object[key];\n\n if ((value === undefined && !(key in object)) || !predicate(value)) {\n return false;\n }\n }\n return true;\n}\n\nmodule.exports = baseConformsTo;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nmodule.exports = baseTimes;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n","var baseTimes = require('./_baseTimes'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isIndex = require('./_isIndex'),\n isTypedArray = require('./isTypedArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = arrayLikeKeys;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeys = require('./_baseKeys'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n","var baseConformsTo = require('./_baseConformsTo'),\n keys = require('./keys');\n\n/**\n * Checks if `object` conforms to `source` by invoking the predicate\n * properties of `source` with the corresponding property values of `object`.\n *\n * **Note:** This method is equivalent to `_.conforms` when `source` is\n * partially applied.\n *\n * @static\n * @memberOf _\n * @since 4.14.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property predicates to conform to.\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n *\n * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\n * // => true\n *\n * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\n * // => false\n */\nfunction conformsTo(object, source) {\n return source == null || baseConformsTo(object, source, keys(source));\n}\n\nmodule.exports = conformsTo;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n","var apply = require('./_apply');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nmodule.exports = overRest;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nmodule.exports = constant;\n","var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n","var constant = require('./constant'),\n defineProperty = require('./_defineProperty'),\n identity = require('./identity');\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nmodule.exports = baseSetToString;\n","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nmodule.exports = shortOut;\n","var baseSetToString = require('./_baseSetToString'),\n shortOut = require('./_shortOut');\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n","var identity = require('./identity'),\n overRest = require('./_overRest'),\n setToString = require('./_setToString');\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n","var eq = require('./eq'),\n isArrayLike = require('./isArrayLike'),\n isIndex = require('./_isIndex'),\n isObject = require('./isObject');\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nmodule.exports = isIterateeCall;\n","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = nativeKeysIn;\n","var isObject = require('./isObject'),\n isPrototype = require('./_isPrototype'),\n nativeKeysIn = require('./_nativeKeysIn');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeysIn;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeysIn = require('./_baseKeysIn'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = keysIn;\n","var baseRest = require('./_baseRest'),\n eq = require('./eq'),\n isIterateeCall = require('./_isIterateeCall'),\n keysIn = require('./keysIn');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar defaults = baseRest(function(object, sources) {\n object = Object(object);\n\n var index = -1;\n var length = sources.length;\n var guard = length > 2 ? sources[2] : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n length = 1;\n }\n\n while (++index < length) {\n var source = sources[index];\n var props = keysIn(source);\n var propsIndex = -1;\n var propsLength = props.length;\n\n while (++propsIndex < propsLength) {\n var key = props[propsIndex];\n var value = object[key];\n\n if (value === undefined ||\n (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n object[key] = source[key];\n }\n }\n }\n\n return object;\n});\n\nmodule.exports = defaults;\n","var baseGetTag = require('./_baseGetTag'),\n isArray = require('./isArray'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar stringTag = '[object String]';\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n}\n\nmodule.exports = isString;\n","var root = require('./_root');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsFinite = root.isFinite;\n\n/**\n * Checks if `value` is a finite primitive number.\n *\n * **Note:** This method is based on\n * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n * @example\n *\n * _.isFinite(3);\n * // => true\n *\n * _.isFinite(Number.MIN_VALUE);\n * // => true\n *\n * _.isFinite(Infinity);\n * // => false\n *\n * _.isFinite('3');\n * // => false\n */\nfunction isFinite(value) {\n return typeof value == 'number' && nativeIsFinite(value);\n}\n\nmodule.exports = isFinite;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]';\n\n/**\n * Checks if `value` is classified as a boolean primitive or object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n * @example\n *\n * _.isBoolean(false);\n * // => true\n *\n * _.isBoolean(null);\n * // => false\n */\nfunction isBoolean(value) {\n return value === true || value === false ||\n (isObjectLike(value) && baseGetTag(value) == boolTag);\n}\n\nmodule.exports = isBoolean;\n","/**\n * Checks if `value` is `null` or `undefined`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n * @example\n *\n * _.isNil(null);\n * // => true\n *\n * _.isNil(void 0);\n * // => true\n *\n * _.isNil(NaN);\n * // => false\n */\nfunction isNil(value) {\n return value == null;\n}\n\nmodule.exports = isNil;\n","/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeFloor = Math.floor,\n nativeRandom = Math.random;\n\n/**\n * The base implementation of `_.random` without support for returning\n * floating-point numbers.\n *\n * @private\n * @param {number} lower The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the random number.\n */\nfunction baseRandom(lower, upper) {\n return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\n}\n\nmodule.exports = baseRandom;\n","var isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n","var toNumber = require('./toNumber');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\nmodule.exports = toFinite;\n","var baseRandom = require('./_baseRandom'),\n isIterateeCall = require('./_isIterateeCall'),\n toFinite = require('./toFinite');\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseFloat = parseFloat;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMin = Math.min,\n nativeRandom = Math.random;\n\n/**\n * Produces a random number between the inclusive `lower` and `upper` bounds.\n * If only one argument is provided a number between `0` and the given number\n * is returned. If `floating` is `true`, or either `lower` or `upper` are\n * floats, a floating-point number is returned instead of an integer.\n *\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\n * floating-point values which can produce unexpected results.\n *\n * @static\n * @memberOf _\n * @since 0.7.0\n * @category Number\n * @param {number} [lower=0] The lower bound.\n * @param {number} [upper=1] The upper bound.\n * @param {boolean} [floating] Specify returning a floating-point number.\n * @returns {number} Returns the random number.\n * @example\n *\n * _.random(0, 5);\n * // => an integer between 0 and 5\n *\n * _.random(5);\n * // => also an integer between 0 and 5\n *\n * _.random(5, true);\n * // => a floating-point number between 0 and 5\n *\n * _.random(1.2, 5.2);\n * // => a floating-point number between 1.2 and 5.2\n */\nfunction random(lower, upper, floating) {\n if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\n upper = floating = undefined;\n }\n if (floating === undefined) {\n if (typeof upper == 'boolean') {\n floating = upper;\n upper = undefined;\n }\n else if (typeof lower == 'boolean') {\n floating = lower;\n lower = undefined;\n }\n }\n if (lower === undefined && upper === undefined) {\n lower = 0;\n upper = 1;\n }\n else {\n lower = toFinite(lower);\n if (upper === undefined) {\n upper = lower;\n lower = 0;\n } else {\n upper = toFinite(upper);\n }\n }\n if (lower > upper) {\n var temp = lower;\n lower = upper;\n upper = temp;\n }\n if (floating || lower % 1 || upper % 1) {\n var rand = nativeRandom();\n return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\n }\n return baseRandom(lower, upper);\n}\n\nmodule.exports = random;\n","import { BaseMessage, Commands } from '../twitch'\nimport { LoggerOptions } from '../utils/logger'\n\nexport type ClientOptions = {\n username?: string\n token?: string\n isKnown: boolean\n isVerified: boolean\n server: string\n port: number\n ssl: boolean\n log?: LoggerOptions\n}\n\nexport enum BaseClientEvents {\n RAW = 'RAW',\n\n ALL = '*',\n CONNECTED = 'CONNECTED',\n DISCONNECTED = 'DISCONNECTED',\n RECONNECT = 'RECONNECT',\n AUTHENTICATED = 'AUTHENTICATED',\n AUTHENTICATION_FAILED = 'AUTHENTICATION_FAILED',\n\n ERROR_ENCOUNTERED = 'ERROR_ENCOUNTERED',\n}\n\nexport const ClientEvents = { ...Commands, ...BaseClientEvents }\nexport type ClientEvents = Commands | BaseClientEvents\n\nexport type ClientEventTypes = {\n [ClientEvents.RAW]: [string]\n [ClientEvents.ALL]: [BaseMessage]\n [ClientEvents.CONNECTED]: [BaseMessage]\n [ClientEvents.DISCONNECTED]: []\n [ClientEvents.RECONNECT]: []\n [ClientEvents.AUTHENTICATED]: [BaseMessage]\n [ClientEvents.AUTHENTICATION_FAILED]: [BaseMessage]\n [ClientEvents.ERROR_ENCOUNTERED]: [Error]\n}\n","import isEmpty from 'lodash/isEmpty'\nimport random from 'lodash/random'\n\nimport { ANONYMOUS_USERNAME } from '../constants'\n\nexport const token = (value: any): string => {\n if (value == null) {\n return 'TWITCHJS'\n }\n\n if (value.startsWith('oauth:')) {\n return value\n }\n\n return `oauth:${value}`\n}\n\nexport const username = (value: any): string => {\n if (isEmpty(value) || value === 'justinfan') {\n return `${ANONYMOUS_USERNAME}${random(80000, 81000)}`\n }\n\n return value\n}\n","import EventEmitter from 'eventemitter3'\nimport WebSocket from 'ws'\nimport Queue from 'p-queue'\n\nimport { stringify } from 'qs'\n\nimport { Commands, Capabilities, BaseMessage } from '../twitch'\n\nimport createLogger, { Logger } from '../utils/logger'\n\nimport * as constants from './constants'\nimport baseParser from './utils/parsers'\nimport * as validators from './utils/validators'\nimport * as utils from './utils'\n\nimport * as Errors from './Errors'\n\nimport { ClientOptions, ClientEvents, ClientEventTypes } from './types'\n\nclass Client extends EventEmitter<\n ClientEventTypes & {\n [eventName: string]: [BaseMessage]\n }\n> {\n private _options: ClientOptions\n private _log: Logger\n\n private _ws: WebSocket\n\n private _queueJoin: Queue\n private _queueAuthenticate: Queue\n private _queue: Queue\n private _moderatorQueue?: Queue\n\n private _heartbeatTimeoutId?: NodeJS.Timeout\n private _reconnectTimeoutId?: NodeJS.Timeout\n\n private _clientPriority = 100\n\n constructor(options: Partial<ClientOptions>) {\n super()\n\n // Validate options.\n this._options = validators.clientOptions(options)\n const { ssl, server, port, log } = this._options\n\n this._log = createLogger({ name: 'Chat/Client', ...log })\n\n // Instantiate WebSocket.\n const protocol = ssl ? 'wss' : 'ws'\n this._ws = new WebSocket(`${protocol}://${server}:${port}`)\n\n this._ws.onopen = this._handleOpen.bind(this)\n this._ws.onmessage = this._handleMessage.bind(this)\n this._ws.onerror = this._handleError.bind(this)\n this._ws.onclose = this._handleClose.bind(this)\n\n // Instantiate Queues.\n // See https://dev.twitch.tv/docs/irc/guide#command--message-limits\n this._queueAuthenticate = this._options.isVerified\n ? new Queue({ intervalCap: 200, interval: 10000 })\n : new Queue({ intervalCap: 20, interval: 10000 })\n this._queueJoin = this._options.isVerified\n ? new Queue({ intervalCap: 2000, interval: 10000 })\n : new Queue({ intervalCap: 20, interval: 10000 })\n this._queue = new Queue({ intervalCap: 20, interval: 30000 })\n this._moderatorQueue = new Queue({ intervalCap: 100, interval: 30000 })\n }\n\n isReady() {\n return this._ws.readyState === 1\n }\n\n /**\n * Send message to Twitch\n */\n async send(\n message: string,\n options?: Partial<{\n priority: number\n isModerator: boolean\n }>,\n ) {\n try {\n const { priority, isModerator } = {\n priority: 0,\n isModerator: false,\n ...options,\n }\n\n const queue = message.startsWith('JOIN')\n ? this._queueJoin\n : message.startsWith('PASS')\n ? this._queueAuthenticate\n : isModerator && this._moderatorQueue\n ? this._moderatorQueue\n : this._queue\n\n await queue.add(() => this._ws.send(message), { priority })\n this._log.trace(`< ${message}`)\n } catch (error) {\n this._log.error(`< ${message}`)\n }\n }\n\n disconnect() {\n this._queueAuthenticate.pause()\n this._queueJoin.pause()\n this._queue.pause()\n this._moderatorQueue?.pause()\n // @ts-expect-error clean up p-queue\n clearTimeout(this._queueAuthenticate._timeoutId)\n // @ts-expect-error clean up p-queue\n clearTimeout(this._queueJoin._timeoutId)\n // @ts-expect-error clean up p-queue\n clearTimeout(this._queue._timeoutId)\n // @ts-expect-error clean up p-queue\n clearTimeout(this._moderatorQueue?._timeoutId)\n\n this._handleHeartbeatReset()\n this._ws.close()\n }\n\n private _handleOpen() {\n const priority = this._clientPriority\n\n // Register for Twitch-specific capabilities.\n this.send(`CAP REQ :${Object.values(Capabilities).join(' ')}`, { priority })\n\n // Authenticate.\n const { token, username } = this._options\n if (token && username) {\n this.send(`PASS ${token}`, { priority })\n }\n this.send(`NICK ${username}`, { priority })\n\n this._handleHeartbeat()\n }\n\n private _handleMessage(messageEvent: WebSocket.MessageEvent) {\n const rawMessage = messageEvent.data.toString()\n this._log.trace(`> ${rawMessage.trim()}`)\n\n const { token, username } = this._options\n const priority = this._clientPriority\n\n this._handleHeartbeat()\n\n let messages: BaseMessage[] = []\n\n try {\n messages = baseParser(rawMessage, this._options.username)\n } catch (error) {\n /**\n * Catch errors while parsing raw messages into base messages.\n */\n this._log.error(\n '\\n' +\n 'An error occurred while attempting to parse a message from ' +\n 'Twitch. Please use the following stack trace and raw message to ' +\n 'resolve the bug in the TwitchJS source code, and then issue a ' +\n 'pull request at https://github.com/twitch-js/twitch-js/compare\\n' +\n '\\n' +\n 'Stack trace:\\n' +\n `${error}\\n` +\n '\\n' +\n 'Raw message:\\n' +\n rawMessage,\n )\n this.emit(ClientEvents.ERROR_ENCOUNTERED, error)\n }\n\n messages.forEach((message) => {\n const event = message.command || ''\n\n this._log.debug({ ...message, _raw: undefined }, '> %s', event)\n\n // Handle authentication failure.\n if (utils.isAuthenticationFailedMessage(message)) {\n this._multiEmit(\n [ClientEvents.ALL, ClientEvents.AUTHENTICATION_FAILED],\n {\n ...message,\n event: ClientEvents.AUTHENTICATION_FAILED,\n },\n )\n\n this.disconnect()\n } else {\n if (message.command === Commands.PING) {\n // Handle PING/PONG.\n this.send('PONG :tmi.twitch.tv', { priority })\n } else if (!token && message.command === Commands.WELCOME) {\n // Handle successful connections without authentications.\n this._multiEmit([ClientEvents.ALL, ClientEvents.CONNECTED], {\n ...message,\n event: ClientEvents.CONNECTED,\n })\n } else if (message.command === Commands.GLOBALUSERSTATE) {\n // Handle successful authentications.\n this._multiEmit([ClientEvents.ALL, ClientEvents.GLOBALUSERSTATE], {\n ...message,\n event: ClientEvents.GLOBALUSERSTATE,\n })\n if (token && username) {\n this._multiEmit([ClientEvents.ALL, ClientEvents.CONNECTED], {\n ...message,\n event: ClientEvents.CONNECTED,\n })\n }\n } else if (message.command === Commands.RECONNECT) {\n // Handle RECONNECT.\n this._multiEmit([ClientEvents.ALL, ClientEvents.RECONNECT], {\n ...message,\n event: ClientEvents.RECONNECT,\n })\n } else {\n this.emit(ClientEvents.ALL, message)\n }\n }\n })\n\n this.emit(ClientEvents.RAW, rawMessage)\n }\n\n private _handleError(errorEvent: WebSocket.ErrorEvent) {\n this._log.error(errorEvent)\n }\n\n private _handleClose(_closeEvent: WebSocket.CloseEvent) {\n this.emit(ClientEvents.DISCONNECTED)\n }\n\n private _handleHeartbeat() {\n this._handleHeartbeatReset()\n\n const priority = this._clientPriority\n\n // Send PING ...\n this._heartbeatTimeoutId = setTimeout(() => {\n this.send(Commands.PING, { priority })\n }, constants.KEEP_ALIVE_PING_TIMEOUT)\n\n // ... and if the heart beat fails, emit RECONNECT event.\n this._reconnectTimeoutId = setTimeout(() => {\n this.emit(ClientEvents.RECONNECT)\n }, constants.KEEP_ALIVE_PING_TIMEOUT + 1000)\n }\n\n private _handleHeartbeatReset() {\n if (this._heartbeatTimeoutId) {\n clearTimeout(this._heartbeatTimeoutId)\n }\n if (this._reconnectTimeoutId) {\n clearTimeout(this._reconnectTimeoutId)\n }\n }\n\n private _multiEmit(\n event: ClientEvents | ClientEvents[],\n message: BaseMessage,\n ) {\n if (Array.isArray(event)) {\n event.forEach((eventName) => this.emit(eventName, message))\n } else {\n this.emit(event, message)\n }\n }\n}\n\nexport default Client\n","import invariant from 'invariant'\n\nimport conformsTo from 'lodash/conformsTo'\nimport defaults from 'lodash/defaults'\nimport isString from 'lodash/isString'\nimport isFinite from 'lodash/isFinite'\nimport isBoolean from 'lodash/isBoolean'\nimport isNil from 'lodash/isNil'\n\nimport * as types from '../types'\n\nimport * as constants from '../constants'\nimport * as sanitizers from './sanitizers'\n\nexport const clientOptions = (\n options: Partial<types.ClientOptions>,\n): types.ClientOptions => {\n const shape = {\n username: (value: any) => isNil(value) || isString(value),\n token: (value: any) => isNil(value) || isString(value),\n server: isString,\n port: isFinite,\n ssl: isBoolean,\n isKnown: isBoolean,\n isVerified: isBoolean,\n }\n\n const optionsWithDefaults: types.ClientOptions = defaults(\n {\n ...options,\n username: sanitizers.username(options.username),\n token: options.token ? sanitizers.token(options.token) : undefined,\n },\n {\n server: constants.CHAT_SERVER,\n port: constants.CHAT_SERVER_SSL_PORT,\n ssl: true,\n isKnown: false,\n isVerified: false,\n },\n )\n\n invariant(\n conformsTo(optionsWithDefaults, shape),\n '[twitch-js/Chat/Client] options: Expected valid options',\n )\n\n return optionsWithDefaults\n}\n","import { BaseMessage, Commands } from '../../twitch'\n\nexport const isAuthenticationFailedMessage = (message?: BaseMessage) =>\n typeof message !== 'undefined' &&\n message.command === Commands.NOTICE &&\n message.channel === '' &&\n message.message === 'Login authentication failed'\n","function fixProto(target, prototype) {\n var setPrototypeOf = Object.setPrototypeOf;\n setPrototypeOf ? setPrototypeOf(target, prototype) : target.__proto__ = prototype;\n}\nfunction fixStack(target, fn) {\n if (fn === void 0) {\n fn = target.constructor;\n }\n\n var captureStackTrace = Error.captureStackTrace;\n captureStackTrace && captureStackTrace(target, fn);\n}\n\nvar __extends = undefined && undefined.__extends || function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) { if (b.hasOwnProperty(p)) { d[p] = b[p]; } }\n };\n\n return extendStatics(d, b);\n };\n\n return function (d, b) {\n extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n\nvar CustomError = function (_super) {\n __extends(CustomError, _super);\n\n function CustomError(message) {\n var _newTarget = this.constructor;\n\n var _this = _super.call(this, message) || this;\n\n Object.defineProperty(_this, 'name', {\n value: _newTarget.name,\n enumerable: false,\n configurable: true\n });\n fixProto(_this, _newTarget.prototype);\n fixStack(_this);\n return _this;\n }\n\n return CustomError;\n}(Error);\n\nvar __spreadArrays = undefined && undefined.__spreadArrays || function () {\n var arguments$1 = arguments;\n\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) { s += arguments$1[i].length; }\n\n for (var r = Array(s), k = 0, i = 0; i < il; i++) { for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) { r[k] = a[j]; } }\n\n return r;\n};\nfunction customErrorFactory(fn, parent) {\n if (parent === void 0) {\n parent = Error;\n }\n\n function CustomError() {\n var arguments$1 = arguments;\n\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments$1[_i];\n }\n\n if (!(this instanceof CustomError)) { return new (CustomError.bind.apply(CustomError, __spreadArrays([void 0], args)))(); }\n parent.apply(this, args);\n Object.defineProperty(this, 'name', {\n value: fn.name || parent.name,\n enumerable: false,\n configurable: true\n });\n fn.apply(this, args);\n fixStack(this, CustomError);\n }\n\n return Object.defineProperties(CustomError, {\n prototype: {\n value: Object.create(parent.prototype, {\n constructor: {\n value: CustomError,\n writable: true,\n configurable: true\n }\n })\n }\n });\n}\n\nexport { CustomError, customErrorFactory };\n//# sourceMappingURL=custom-error.mjs.map\n","import { CustomError } from 'ts-custom-error'\n\nclass BaseError extends CustomError {\n timestamp: Date = new Date()\n\n constructor(message: string) {\n super(message)\n this.message = `[TwitchJS] ${message}`\n }\n}\n\nexport default BaseError\n","import { BaseMessage, ChatEvents } from '../twitch'\n\nimport BaseError from '../utils/BaseError'\n\nexport class ChatError extends BaseError {\n command?: string\n\n constructor(error: Error | string, message?: BaseMessage | string) {\n super(`${error instanceof Error ? error.message : error} [Chat]`)\n Object.setPrototypeOf(this, ChatError.prototype)\n\n if (typeof message !== 'undefined' && typeof message !== 'string') {\n this.command = message.command\n }\n }\n}\n\nexport class AuthenticationError extends ChatError {\n constructor(error: Error, message?: BaseMessage) {\n super('Authentication error encountered', message)\n Object.setPrototypeOf(this, AuthenticationError.prototype)\n\n Object.assign(this, error)\n Object.assign(this, message)\n }\n}\n\nexport class ParseError extends ChatError {\n _raw: string\n\n constructor(error: Error, rawMessage: string) {\n super('Parse error encountered')\n Object.setPrototypeOf(this, ParseError.prototype)\n\n Object.assign(this, error)\n\n this._raw = rawMessage\n this.command = ChatEvents.PARSE_ERROR_ENCOUNTERED\n }\n}\n\nexport class JoinError extends ChatError {\n constructor(message = 'Error: join') {\n super(message)\n Object.setPrototypeOf(this, JoinError.prototype)\n }\n}\n\nexport class TimeoutError extends ChatError {\n constructor(message = 'Error: timeout') {\n super(message)\n Object.setPrototypeOf(this, TimeoutError.prototype)\n }\n}\n","var toNumber = require('./toNumber');\n\n/**\n * Creates a function that performs a relational operation on two values.\n *\n * @private\n * @param {Function} operator The function to perform the operation.\n * @returns {Function} Returns the new relational operation function.\n */\nfunction createRelationalOperation(operator) {\n return function(value, other) {\n if (!(typeof value == 'string' && typeof other == 'string')) {\n value = toNumber(value);\n other = toNumber(other);\n }\n return operator(value, other);\n };\n}\n\nmodule.exports = createRelationalOperation;\n","var baseGt = require('./_baseGt'),\n createRelationalOperation = require('./_createRelationalOperation');\n\n/**\n * Checks if `value` is greater than `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n * else `false`.\n * @see _.lt\n * @example\n *\n * _.gt(3, 1);\n * // => true\n *\n * _.gt(3, 3);\n * // => false\n *\n * _.gt(1, 3);\n * // => false\n */\nvar gt = createRelationalOperation(baseGt);\n\nmodule.exports = gt;\n","/**\n * The base implementation of `_.gt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n * else `false`.\n */\nfunction baseGt(value, other) {\n return value > other;\n}\n\nmodule.exports = baseGt;\n","var toString = require('./toString');\n\n/**\n * Converts `string`, as a whole, to upper case just like\n * [String#toUpperCase](https://mdn.io/toUpperCase).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the upper cased string.\n * @example\n *\n * _.toUpper('--foo-bar--');\n * // => '--FOO-BAR--'\n *\n * _.toUpper('fooBar');\n * // => 'FOOBAR'\n *\n * _.toUpper('__foo_bar__');\n * // => '__FOO_BAR__'\n */\nfunction toUpper(value) {\n return toString(value).toUpperCase();\n}\n\nmodule.exports = toUpper;\n","export const CHAT_SERVER = 'irc-ws.chat.twitch.tv'\nexport const CHAT_SERVER_PORT = 6667\nexport const CHAT_SERVER_SSL_PORT = 443\n\nexport const CONNECTION_TIMEOUT = 5000\nexport const KEEP_ALIVE_PING_TIMEOUT = 150000\nexport const KEEP_ALIVE_RECONNECT_TIMEOUT = 200000\n\nexport const JOIN_TIMEOUT = 1000 // milliseconds.\nexport const COMMAND_TIMEOUT = 1000 // milliseconds.\n\nexport const CLIENT_PRIORITY = 100\n\n// See https://dev.twitch.tv/docs/irc/guide/#command--message-limits.\nexport const RATE_LIMIT_USER = 20 // per period.\nexport const RATE_LIMIT_MODERATOR = 100 // per period.\nexport const RATE_LIMIT_KNOWN_BOT = 50 // per period.\nexport const RATE_LIMIT_VERIFIED_BOT = 7500 // per period.\n\nexport const ERROR_CONNECT_TIMED_OUT = 'ERROR: connect timed out'\nexport const ERROR_CONNECTION_IN_PROGRESS = 'ERROR: connection in progress'\nexport const ERROR_JOIN_TIMED_OUT = 'ERROR: join timed out'\nexport const ERROR_SAY_TIMED_OUT = 'ERROR: say timed out'\nexport const ERROR_COMMAND_TIMED_OUT = 'ERROR: command timed out'\nexport const ERROR_COMMAND_UNRECOGNIZED = 'ERROR: command unrecognized'\nexport const ERROR_PART_TIMED_OUT = 'ERROR: part timed out'\n\nexport const MESSAGE_PARAMETER_PREFIX = 'msgParam'\nexport const MESSAGE_PARAMETER_PREFIX_RE = new RegExp(\n `^${MESSAGE_PARAMETER_PREFIX}(\\\\w+)`,\n)\nexport const PRIVATE_MESSAGE_HOSTED_RE = /:.+@jtv\\.tmi\\.twitch\\.tv PRIVMSG #?(\\w+) :(\\w+) is now (?:(auto) )?hosting[A-z ]+(\\d+)?/\n\nexport const ANONYMOUS_USERNAME = 'justinfan'\nexport const ANONYMOUS_USERNAME_RE = new RegExp(`^${ANONYMOUS_USERNAME}(\\\\d+)$`)\n","/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n}\n\nmodule.exports = baseSlice;\n","var baseSlice = require('./_baseSlice');\n\n/**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\nfunction castSlice(array, start, end) {\n var length = array.length;\n end = end === undefined ? length : end;\n return (!start && end >= length) ? array : baseSlice(array, start, end);\n}\n\nmodule.exports = castSlice;\n","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsZWJ = '\\\\u200d';\n\n/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\nvar reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');\n\n/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\nfunction hasUnicode(string) {\n return reHasUnicode.test(string);\n}\n\nmodule.exports = hasUnicode;\n","/**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction asciiToArray(string) {\n return string.split('');\n}\n\nmodule.exports = asciiToArray;\n","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsAstral = '[' + rsAstralRange + ']',\n rsCombo = '[' + rsComboRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\nvar reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n/**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction unicodeToArray(string) {\n return string.match(reUnicode) || [];\n}\n\nmodule.exports = unicodeToArray;\n","var asciiToArray = require('./_asciiToArray'),\n hasUnicode = require('./_hasUnicode'),\n unicodeToArray = require('./_unicodeToArray');\n\n/**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction stringToArray(string) {\n return hasUnicode(string)\n ? unicodeToArray(string)\n : asciiToArray(string);\n}\n\nmodule.exports = stringToArray;\n","var castSlice = require('./_castSlice'),\n hasUnicode = require('./_hasUnicode'),\n stringToArray = require('./_stringToArray'),\n toString = require('./toString');\n\n/**\n * Creates a function like `_.lowerFirst`.\n *\n * @private\n * @param {string} methodName The name of the `String` case method to use.\n * @returns {Function} Returns the new case function.\n */\nfunction createCaseFirst(methodName) {\n return function(string) {\n string = toString(string);\n\n var strSymbols = hasUnicode(string)\n ? stringToArray(string)\n : undefined;\n\n var chr = strSymbols\n ? strSymbols[0]\n : string.charAt(0);\n\n var trailing = strSymbols\n ? castSlice(strSymbols, 1).join('')\n : string.slice(1);\n\n return chr[methodName]() + trailing;\n };\n}\n\nmodule.exports = createCaseFirst;\n","var createCaseFirst = require('./_createCaseFirst');\n\n/**\n * Converts the first character of `string` to upper case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.upperFirst('fred');\n * // => 'Fred'\n *\n * _.upperFirst('FRED');\n * // => 'FRED'\n */\nvar upperFirst = createCaseFirst('toUpperCase');\n\nmodule.exports = upperFirst;\n","var toString = require('./toString'),\n upperFirst = require('./upperFirst');\n\n/**\n * Converts the first character of `string` to upper case and the remaining\n * to lower case.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to capitalize.\n * @returns {string} Returns the capitalized string.\n * @example\n *\n * _.capitalize('FRED');\n * // => 'Fred'\n */\nfunction capitalize(string) {\n return upperFirst(toString(string).toLowerCase());\n}\n\nmodule.exports = capitalize;\n","/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n}\n\nmodule.exports = arrayReduce;\n","/**\n * The base implementation of `_.propertyOf` without support for deep paths.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyOf(object) {\n return function(key) {\n return object == null ? undefined : object[key];\n };\n}\n\nmodule.exports = basePropertyOf;\n","var basePropertyOf = require('./_basePropertyOf');\n\n/** Used to map Latin Unicode letters to basic Latin letters. */\nvar deburredLetters = {\n // Latin-1 Supplement block.\n '\\xc0': 'A', '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n '\\xe0': 'a', '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n '\\xc7': 'C', '\\xe7': 'c',\n '\\xd0': 'D', '\\xf0': 'd',\n '\\xc8': 'E', '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n '\\xe8': 'e', '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n '\\xcc': 'I', '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n '\\xec': 'i', '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n '\\xd1': 'N', '\\xf1': 'n',\n '\\xd2': 'O', '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n '\\xf2': 'o', '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n '\\xd9': 'U', '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n '\\xf9': 'u', '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n '\\xdd': 'Y', '\\xfd': 'y', '\\xff': 'y',\n '\\xc6': 'Ae', '\\xe6': 'ae',\n '\\xde': 'Th', '\\xfe': 'th',\n '\\xdf': 'ss',\n // Latin Extended-A block.\n '\\u0100': 'A', '\\u0102': 'A', '\\u0104': 'A',\n '\\u0101': 'a', '\\u0103': 'a', '\\u0105': 'a',\n '\\u0106': 'C', '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n '\\u0107': 'c', '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n '\\u010e': 'D', '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n '\\u0112': 'E', '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n '\\u0113': 'e', '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n '\\u011c': 'G', '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n '\\u011d': 'g', '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n '\\u0124': 'H', '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n '\\u0128': 'I', '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n '\\u0129': 'i', '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n '\\u0134': 'J', '\\u0135': 'j',\n '\\u0136': 'K', '\\u0137': 'k', '\\u0138': 'k',\n '\\u0139': 'L', '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n '\\u013a': 'l', '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n '\\u0143': 'N', '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n '\\u0144': 'n', '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n '\\u014c': 'O', '\\u014e': 'O', '\\u0150': 'O',\n '\\u014d': 'o', '\\u014f': 'o', '\\u0151': 'o',\n '\\u0154': 'R', '\\u0156': 'R', '\\u0158': 'R',\n '\\u0155': 'r', '\\u0157': 'r', '\\u0159': 'r',\n '\\u015a': 'S', '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n '\\u015b': 's', '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n '\\u0162': 'T', '\\u0164': 'T', '\\u0166': 'T',\n '\\u0163': 't', '\\u0165': 't', '\\u0167': 't',\n '\\u0168': 'U', '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n '\\u0169': 'u', '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n '\\u0174': 'W', '\\u0175': 'w',\n '\\u0176': 'Y', '\\u0177': 'y', '\\u0178': 'Y',\n '\\u0179': 'Z', '\\u017b': 'Z', '\\u017d': 'Z',\n '\\u017a': 'z', '\\u017c': 'z', '\\u017e': 'z',\n '\\u0132': 'IJ', '\\u0133': 'ij',\n '\\u0152': 'Oe', '\\u0153': 'oe',\n '\\u0149': \"'n\", '\\u017f': 's'\n};\n\n/**\n * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n * letters to basic Latin letters.\n *\n * @private\n * @param {string} letter The matched letter to deburr.\n * @returns {string} Returns the deburred letter.\n */\nvar deburrLetter = basePropertyOf(deburredLetters);\n\nmodule.exports = deburrLetter;\n","var deburrLetter = require('./_deburrLetter'),\n toString = require('./toString');\n\n/** Used to match Latin Unicode letters (excluding mathematical operators). */\nvar reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n/** Used to compose unicode character classes. */\nvar rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange;\n\n/** Used to compose unicode capture groups. */\nvar rsCombo = '[' + rsComboRange + ']';\n\n/**\n * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n */\nvar reComboMark = RegExp(rsCombo, 'g');\n\n/**\n * Deburrs `string` by converting\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n * letters to basic Latin letters and removing\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to deburr.\n * @returns {string} Returns the deburred string.\n * @example\n *\n * _.deburr('déjà vu');\n * // => 'deja vu'\n */\nfunction deburr(string) {\n string = toString(string);\n return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n}\n\nmodule.exports = deburr;\n","/** Used to match words composed of alphanumeric characters. */\nvar reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n/**\n * Splits an ASCII `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\nfunction asciiWords(string) {\n return string.match(reAsciiWord) || [];\n}\n\nmodule.exports = asciiWords;\n","/** Used to detect strings that need a more robust regexp to match words. */\nvar reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n/**\n * Checks if `string` contains a word composed of Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a word is found, else `false`.\n */\nfunction hasUnicodeWord(string) {\n return reHasUnicodeWord.test(string);\n}\n\nmodule.exports = hasUnicodeWord;\n","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsDingbatRange = '\\\\u2700-\\\\u27bf',\n rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n rsPunctuationRange = '\\\\u2000-\\\\u206f',\n rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n rsVarRange = '\\\\ufe0e\\\\ufe0f',\n rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n/** Used to compose unicode capture groups. */\nvar rsApos = \"['\\u2019]\",\n rsBreak = '[' + rsBreakRange + ']',\n rsCombo = '[' + rsComboRange + ']',\n rsDigits = '\\\\d+',\n rsDingbat = '[' + rsDingbatRange + ']',\n rsLower = '[' + rsLowerRange + ']',\n rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsUpper = '[' + rsUpperRange + ']',\n rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\n rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\n rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',\n rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq;\n\n/** Used to match complex or compound words. */\nvar reUnicodeWord = RegExp([\n rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\n rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\n rsUpper + '+' + rsOptContrUpper,\n rsOrdUpper,\n rsOrdLower,\n rsDigits,\n rsEmoji\n].join('|'), 'g');\n\n/**\n * Splits a Unicode `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\nfunction unicodeWords(string) {\n return string.match(reUnicodeWord) || [];\n}\n\nmodule.exports = unicodeWords;\n","var asciiWords = require('./_asciiWords'),\n hasUnicodeWord = require('./_hasUnicodeWord'),\n toString = require('./toString'),\n unicodeWords = require('./_unicodeWords');\n\n/**\n * Splits `string` into an array of its words.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {RegExp|string} [pattern] The pattern to match words.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the words of `string`.\n * @example\n *\n * _.words('fred, barney, & pebbles');\n * // => ['fred', 'barney', 'pebbles']\n *\n * _.words('fred, barney, & pebbles', /[^, ]+/g);\n * // => ['fred', 'barney', '&', 'pebbles']\n */\nfunction words(string, pattern, guard) {\n string = toString(string);\n pattern = guard ? undefined : pattern;\n\n if (pattern === undefined) {\n return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n }\n return string.match(pattern) || [];\n}\n\nmodule.exports = words;\n","var arrayReduce = require('./_arrayReduce'),\n deburr = require('./deburr'),\n words = require('./words');\n\n/** Used to compose unicode capture groups. */\nvar rsApos = \"['\\u2019]\";\n\n/** Used to match apostrophes. */\nvar reApos = RegExp(rsApos, 'g');\n\n/**\n * Creates a function like `_.camelCase`.\n *\n * @private\n * @param {Function} callback The function to combine each word.\n * @returns {Function} Returns the new compounder function.\n */\nfunction createCompounder(callback) {\n return function(string) {\n return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n };\n}\n\nmodule.exports = createCompounder;\n","var capitalize = require('./capitalize'),\n createCompounder = require('./_createCompounder');\n\n/**\n * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the camel cased string.\n * @example\n *\n * _.camelCase('Foo Bar');\n * // => 'fooBar'\n *\n * _.camelCase('--foo-bar--');\n * // => 'fooBar'\n *\n * _.camelCase('__FOO_BAR__');\n * // => 'fooBar'\n */\nvar camelCase = createCompounder(function(result, word, index) {\n word = word.toLowerCase();\n return result + (index ? capitalize(word) : word);\n});\n\nmodule.exports = camelCase;\n","var toString = require('./toString');\n\n/**\n * Replaces matches for `pattern` in `string` with `replacement`.\n *\n * **Note:** This method is based on\n * [`String#replace`](https://mdn.io/String/replace).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to modify.\n * @param {RegExp|string} pattern The pattern to replace.\n * @param {Function|string} replacement The match replacement.\n * @returns {string} Returns the modified string.\n * @example\n *\n * _.replace('Hi Fred', 'Fred', 'Barney');\n * // => 'Hi Barney'\n */\nfunction replace() {\n var args = arguments,\n string = toString(args[0]);\n\n return args.length < 3 ? string : string.replace(args[1], args[2]);\n}\n\nmodule.exports = replace;\n","import {\n ClearChatMessages,\n Events,\n HostingAutoPrivateMessage,\n HostingPrivateMessage,\n HostingWithViewersPrivateMessage,\n HostTargetMessage,\n JoinMessage,\n Messages,\n ModeMessages,\n NamesEndMessage,\n NamesMessage,\n NoticeMessage,\n NoticeMessages,\n NoticeRoomModsMessage,\n PartMessage,\n PrivateMessages,\n PrivateMessageWithBits,\n RoomStateMessage,\n RoomStateTags,\n UserNoticeAnonymousGiftPaidUpgradeMessage,\n UserNoticeGiftPaidUpgradeMessage,\n UserNoticeMessages,\n UserNoticeRaidMessage,\n UserNoticeResubscriptionMessage,\n UserNoticeRitualMessage,\n UserNoticeSubscriptionGiftCommunityMessage,\n UserNoticeSubscriptionGiftMessage,\n UserNoticeSubscriptionMessage,\n UserStateMessage,\n UserStateTags,\n} from '../twitch'\n\nimport { LoggerOptions } from '../utils/logger'\n\nimport { ClientEventTypes, BaseClientEvents } from '../Client/types'\n\nexport type ChatOptions = {\n username?: string\n /**\n * OAuth token\n * @see https://twitchtokengenerator.com/ to generate a token\n */\n token?: string\n /**\n * Bot is known\n * @see https://dev.twitch.tv/docs/irc/guide/#known-and-verified-bots\n */\n isKnown?: boolean\n /**\n * Bot is verified\n * @see https://dev.twitch.tv/docs/irc/guide/#known-and-verified-bots\n */\n isVerified?: boolean\n connectionTimeout: number\n joinTimeout: number\n log?: LoggerOptions\n onAuthenticationFailure?: () => Promise<string>\n}\n\nexport type ClientOptions = {\n username?: string\n token?: string\n isKnown: boolean\n isVerified: boolean\n server: string\n port: number\n ssl: boolean\n log?: LoggerOptions\n}\n\nexport enum ChatReadyStates {\n 'WAITING',\n 'CONNECTING',\n 'RECONNECTING',\n 'CONNECTED',\n 'DISCONNECTING',\n 'DISCONNECTED',\n}\n\nexport type ChannelState = {\n roomState: RoomStateTags\n userState?: UserStateTags\n}\n\nexport type ChannelStates = Record<string, ChannelState>\n\nexport enum NoticeCompounds {\n ALREADY_BANNED = 'NOTICE/ALREADY_BANNED',\n ALREADY_EMOTE_ONLY_OFF = 'NOTICE/ALREADY_EMOTE_ONLY_OFF',\n ALREADY_EMOTE_ONLY_ON = 'NOTICE/ALREADY_EMOTE_ONLY_ON',\n ALREADY_R9K_OFF = 'NOTICE/ALREADY_R9K_OFF',\n ALREADY_R9K_ON = 'NOTICE/ALREADY_R9K_ON',\n ALREADY_SUBS_OFF = 'NOTICE/ALREADY_SUBS_OFF',\n ALREADY_SUBS_ON = 'NOTICE/ALREADY_SUBS_ON',\n BAD_HOST_HOSTING = 'NOTICE/BAD_HOST_HOSTING',\n BAD_MOD_MOD = 'NOTICE/BAD_MOD_MOD',\n BAN_SUCCESS = 'NOTICE/BAN_SUCCESS',\n BAD_UNBAN_NO_BAN = 'NOTICE/BAD_UNBAN_NO_BAN',\n COLOR_CHANGED = 'NOTICE/COLOR_CHANGED',\n CMDS_AVAILABLE = 'NOTICE/CMDS_AVAILABLE',\n COMMERCIAL_SUCCESS = 'NOTICE/COMMERCIAL_SUCCESS',\n EMOTE_ONLY_OFF = 'NOTICE/EMOTE_ONLY_OFF',\n EMOTE_ONLY_ON = 'NOTICE/EMOTE_ONLY_ON',\n FOLLOWERS_OFF = 'NOTICE/FOLLOWERS_OFF',\n FOLLOWERS_ON = 'NOTICE/FOLLOWERS_ON',\n FOLLOWERS_ONZERO = 'NOTICE/FOLLOWERS_ONZERO',\n HOST_OFF = 'NOTICE/HOST_OFF',\n HOST_ON = 'NOTICE/HOST_ON',\n HOSTS_REMAINING = 'NOTICE/HOSTS_REMAINING',\n MSG_CHANNEL_SUSPENDED = 'NOTICE/MSG_CHANNEL_SUSPENDED',\n MOD_SUCCESS = 'NOTICE/MOD_SUCCESS',\n NOT_HOSTING = 'NOTICE/NOT_HOSTING',\n R9K_OFF = 'NOTICE/R9K_OFF',\n R9K_ON = 'NOTICE/R9K_ON',\n ROOM_MODS = 'NOTICE/ROOM_MODS',\n SLOW_OFF = 'NOTICE/SLOW_OFF',\n SLOW_ON = 'NOTICE/SLOW_ON',\n SUBS_OFF = 'NOTICE/SUBS_OFF',\n SUBS_ON = 'NOTICE/SUBS_ON',\n TIMEOUT_SUCCESS = 'NOTICE/TIMEOUT_SUCCESS',\n UNBAN_SUCCESS = 'NOTICE/UNBAN_SUCCESS',\n UNMOD_SUCCESS = 'NOTICE/UNMOD_SUCCESS',\n UNRAID_SUCCESS = 'NOTICE/UNRAID_SUCCESS',\n UNRECOGNIZED_CMD = 'NOTICE/UNRECOGNIZED_CMD',\n}\n\nexport enum PrivateMessageCompounds {\n CHEER = 'PRIVMSG/CHEER',\n HOSTED_WITHOUT_VIEWERS = 'PRIVMSG/HOSTED_WITHOUT_VIEWERS',\n HOSTED_WITH_VIEWERS = 'PRIVMSG/HOSTED_WITH_VIEWERS',\n HOSTED_AUTO = 'PRIVMSG/HOSTED_AUTO',\n}\n\nexport enum UserNoticeCompounds {\n ANON_GIFT_PAID_UPGRADE = 'USERNOTICE/ANON_GIFT_PAID_UPGRADE',\n GIFT_PAID_UPGRADE = 'USERNOTICE/GIFT_PAID_UPGRADE',\n RAID = 'USERNOTICE/RAID',\n RESUBSCRIPTION = 'USERNOTICE/RESUBSCRIPTION',\n RITUAL = 'USERNOTICE/RITUAL',\n SUBSCRIPTION = 'USERNOTICE/SUBSCRIPTION',\n SUBSCRIPTION_GIFT = 'USERNOTICE/SUBSCRIPTION_GIFT',\n SUBSCRIPTION_GIFT_COMMUNITY = 'USERNOTICE/SUBSCRIPTION_GIFT_COMMUNITY',\n}\n\nexport type EventTypes = Omit<ClientEventTypes, BaseClientEvents.ALL> & {\n [Events.ALL]: [Messages]\n\n [Events.JOIN]: [JoinMessage]\n [Events.PART]: [PartMessage]\n [Events.ROOM_STATE]: [RoomStateMessage]\n [Events.USER_STATE]: [UserStateMessage]\n [Events.CLEAR_CHAT]: [ClearChatMessages]\n [Events.HOST_TARGET]: [HostTargetMessage]\n [Events.MODE]: [ModeMessages]\n [Events.NAMES]: [NamesMessage]\n [Events.NAMES_END]: [NamesEndMessage]\n\n /**\n * NOTICE messages\n */\n\n [Events.NOTICE]: [NoticeMessages]\n\n [Events.ALREADY_BANNED]: [NoticeMessage]\n [Events.ALREADY_EMOTE_ONLY_OFF]: [NoticeMessage]\n [Events.ALREADY_EMOTE_ONLY_ON]: [NoticeMessage]\n [Events.ALREADY_R9K_OFF]: [NoticeMessage]\n [Events.ALREADY_R9K_ON]: [NoticeMessage]\n [Events.ALREADY_SUBS_OFF]: [NoticeMessage]\n [Events.ALREADY_SUBS_ON]: [NoticeMessage]\n [Events.BAD_HOST_HOSTING]: [NoticeMessage]\n [Events.BAD_MOD_MOD]: [NoticeMessage]\n [Events.BAN_SUCCESS]: [NoticeMessage]\n [Events.BAD_UNBAN_NO_BAN]: [NoticeMessage]\n [Events.COLOR_CHANGED]: [NoticeMessage]\n [Events.CMDS_AVAILABLE]: [NoticeMessage]\n [Events.COMMERCIAL_SUCCESS]: [NoticeMessage]\n [Events.EMOTE_ONLY_OFF]: [NoticeMessage]\n [Events.EMOTE_ONLY_ON]: [NoticeMessage]\n [Events.FOLLOWERS_OFF]: [NoticeMessage]\n [Events.FOLLOWERS_ON]: [NoticeMessage]\n [Events.FOLLOWERS_ONZERO]: [NoticeMessage]\n [Events.HOST_OFF]: [NoticeMessage]\n [Events.HOST_ON]: [NoticeMessage]\n [Events.HOSTS_REMAINING]: [NoticeMessage]\n [Events.MSG_CHANNEL_SUSPENDED]: [NoticeMessage]\n [Events.MOD_SUCCESS]: [NoticeMessage]\n [Events.R9K_OFF]: [NoticeMessage]\n [Events.R9K_ON]: [NoticeMessage]\n [Events.ROOM_MODS]: [NoticeRoomModsMessage]\n [Events.SLOW_OFF]: [NoticeMessage]\n [Events.SLOW_ON]: [NoticeMessage]\n [Events.SUBS_OFF]: [NoticeMessage]\n [Events.SUBS_ON]: [NoticeMessage]\n [Events.TIMEOUT_SUCCESS]: [NoticeMessage]\n [Events.UNBAN_SUCCESS]: [NoticeMessage]\n [Events.UNRAID_SUCCESS]: [NoticeMessage]\n [Events.UNRECOGNIZED_CMD]: [NoticeMessage]\n\n [NoticeCompounds.ALREADY_BANNED]: [NoticeMessage]\n [NoticeCompounds.ALREADY_EMOTE_ONLY_OFF]: [NoticeMessage]\n [NoticeCompounds.ALREADY_EMOTE_ONLY_ON]: [NoticeMessage]\n [NoticeCompounds.ALREADY_R9K_OFF]: [NoticeMessage]\n [NoticeCompounds.ALREADY_R9K_ON]: [NoticeMessage]\n [NoticeCompounds.ALREADY_SUBS_OFF]: [NoticeMessage]\n [NoticeCompounds.ALREADY_SUBS_ON]: [NoticeMessage]\n [NoticeCompounds.BAD_HOST_HOSTING]: [NoticeMessage]\n [NoticeCompounds.BAD_MOD_MOD]: [NoticeMessage]\n [NoticeCompounds.BAN_SUCCESS]: [NoticeMessage]\n [NoticeCompounds.BAD_UNBAN_NO_BAN]: [NoticeMessage]\n [NoticeCompounds.COLOR_CHANGED]: [NoticeMessage]\n [NoticeCompounds.CMDS_AVAILABLE]: [NoticeMessage]\n [NoticeCompounds.COMMERCIAL_SUCCESS]: [NoticeMessage]\n [NoticeCompounds.EMOTE_ONLY_OFF]: [NoticeMessage]\n [NoticeCompounds.EMOTE_ONLY_ON]: [NoticeMessage]\n [NoticeCompounds.FOLLOWERS_OFF]: [NoticeMessage]\n [NoticeCompounds.FOLLOWERS_ON]: [NoticeMessage]\n [NoticeCompounds.FOLLOWERS_ONZERO]: [NoticeMessage]\n [NoticeCompounds.HOST_OFF]: [NoticeMessage]\n [NoticeCompounds.HOST_ON]: [NoticeMessage]\n [NoticeCompounds.HOSTS_REMAINING]: [NoticeMessage]\n [NoticeCompounds.MSG_CHANNEL_SUSPENDED]: [NoticeMessage]\n [NoticeCompounds.MOD_SUCCESS]: [NoticeMessage]\n [NoticeCompounds.R9K_OFF]: [NoticeMessage]\n [NoticeCompounds.R9K_ON]: [NoticeMessage]\n [NoticeCompounds.ROOM_MODS]: [NoticeRoomModsMessage]\n [NoticeCompounds.SLOW_OFF]: [NoticeMessage]\n [NoticeCompounds.SLOW_ON]: [NoticeMessage]\n [NoticeCompounds.SUBS_OFF]: [NoticeMessage]\n [NoticeCompounds.SUBS_ON]: [NoticeMessage]\n [NoticeCompounds.TIMEOUT_SUCCESS]: [NoticeMessage]\n [NoticeCompounds.UNBAN_SUCCESS]: [NoticeMessage]\n [NoticeCompounds.UNRAID_SUCCESS]: [NoticeMessage]\n [NoticeCompounds.UNRECOGNIZED_CMD]: [NoticeMessage]\n\n /**\n * PRIVMSG messages\n */\n\n [Events.PRIVATE_MESSAGE]: [PrivateMessages]\n\n [Events.CHEER]: [PrivateMessageWithBits]\n [Events.HOSTED_WITHOUT_VIEWERS]: [HostingPrivateMessage]\n [Events.HOSTED_WITH_VIEWERS]: [HostingWithViewersPrivateMessage]\n [Events.HOSTED_AUTO]: [HostingAutoPrivateMessage]\n\n [PrivateMessageCompounds.CHEER]: [PrivateMessageWithBits]\n [PrivateMessageCompounds.HOSTED_WITHOUT_VIEWERS]: [HostingPrivateMessage]\n [PrivateMessageCompounds.HOSTED_WITH_VIEWERS]: [\n HostingWithViewersPrivateMessage,\n ]\n [PrivateMessageCompounds.HOSTED_AUTO]: [HostingAutoPrivateMessage]\n\n /**\n * USERNOTICE messages\n */\n\n [Events.USER_NOTICE]: [UserNoticeMessages]\n\n [Events.ANON_GIFT_PAID_UPGRADE]: [UserNoticeAnonymousGiftPaidUpgradeMessage]\n [Events.GIFT_PAID_UPGRADE]: [UserNoticeGiftPaidUpgradeMessage]\n [Events.RAID]: [UserNoticeRaidMessage]\n [Events.RESUBSCRIPTION]: [UserNoticeResubscriptionMessage]\n [Events.RITUAL]: [UserNoticeRitualMessage]\n [Events.SUBSCRIPTION]: [UserNoticeSubscriptionMessage]\n [Events.SUBSCRIPTION_GIFT]: [UserNoticeSubscriptionGiftMessage]\n [Events.SUBSCRIPTION_GIFT_COMMUNITY]: [\n UserNoticeSubscriptionGiftCommunityMessage,\n ]\n\n [UserNoticeCompounds.ANON_GIFT_PAID_UPGRADE]: [\n UserNoticeAnonymousGiftPaidUpgradeMessage,\n ]\n [UserNoticeCompounds.GIFT_PAID_UPGRADE]: [UserNoticeGiftPaidUpgradeMessage]\n [UserNoticeCompounds.RAID]: [UserNoticeRaidMessage]\n [UserNoticeCompounds.RESUBSCRIPTION]: [UserNoticeResubscriptionMessage]\n [UserNoticeCompounds.RITUAL]: [UserNoticeRitualMessage]\n [UserNoticeCompounds.SUBSCRIPTION]: [UserNoticeSubscriptionMessage]\n [UserNoticeCompounds.SUBSCRIPTION_GIFT]: [UserNoticeSubscriptionGiftMessage]\n [UserNoticeCompounds.SUBSCRIPTION_GIFT_COMMUNITY]: [\n UserNoticeSubscriptionGiftCommunityMessage,\n ]\n\n [eventName: string]: [Messages] // This break p-event typing.\n}\n","import camelCase from 'lodash/camelCase'\nimport isFinite from 'lodash/isFinite'\nimport replace from 'lodash/replace'\nimport toLower from 'lodash/toLower'\n\nimport { Badges, BooleanBadges, NumberBadges, EmoteTag } from '../../../twitch'\n\nexport const generalString = (maybeMessage: string) => {\n return typeof maybeMessage === 'string'\n ? replace(maybeMessage, /\\\\[sn]/g, ' ')\n : undefined\n}\n\nexport const generalNumber = (maybeNumber: string) => {\n const number = parseInt(maybeNumber, 10)\n return isFinite(number) ? number : undefined\n}\n\nexport const generalBoolean = (maybeBoolean: string) => maybeBoolean === '1'\n\nexport const generalTimestamp = (maybeTimestamp: string) => {\n const timestamp = new Date(parseInt(maybeTimestamp, 10))\n return timestamp.toString() !== 'Invalid Date' ? timestamp : new Date()\n}\n\nexport const userType = (maybeUserType: string) => {\n return typeof maybeUserType === 'string' ? maybeUserType : undefined\n}\n\nexport const broadcasterLanguage = (maybeLanguage: string) => {\n return typeof maybeLanguage === 'string' ? maybeLanguage : undefined\n}\n\nexport const followersOnly = (maybeFollowersOnly: string) => {\n const followersOnlyAsNumber = parseInt(maybeFollowersOnly, 10)\n\n if (followersOnlyAsNumber === 0) {\n return true\n } else if (followersOnlyAsNumber > 0) {\n return followersOnlyAsNumber\n }\n\n return false\n}\n\n/**\n * Badges tag\n * @see https://dev.twitch.tv/docs/irc/tags/#privmsg-twitch-tags\n */\nexport const badges = (maybeBadges: string): Partial<Badges> => {\n return typeof maybeBadges === 'string'\n ? maybeBadges.split(',').reduce((parsed, badge) => {\n const [rawKey, value] = badge.split('/')\n\n if (typeof value === 'undefined') {\n return parsed\n }\n\n const key = camelCase(rawKey)\n\n if (key in BooleanBadges) {\n return { ...parsed, [key]: generalBoolean(value) }\n }\n\n if (key in NumberBadges) {\n return { ...parsed, [key]: parseInt(value, 10) }\n }\n\n return { ...parsed, [key]: value }\n }, {} as Partial<Badges>)\n : {}\n}\n\n/**\n * Emote tag\n * @see https://dev.twitch.tv/docs/irc/tags/#privmsg-twitch-tags\n */\nexport const emotes = (maybeEmotes: string) => {\n if (typeof maybeEmotes !== 'string') {\n return []\n }\n\n return maybeEmotes.split('/').reduce((emoteTag, emoteIndices) => {\n const [id, indices] = emoteIndices.split(':')\n\n if (!id) {\n return emoteTag\n }\n\n return [\n ...emoteTag,\n ...indices.split(',').map((index) => {\n const [start, end] = index.split('-')\n return { id, start: parseInt(start, 10), end: parseInt(end, 10) }\n }),\n ]\n }, [] as EmoteTag[])\n}\n\nexport const emoteSets = (maybeEmoteSets: string) => {\n return typeof maybeEmoteSets === 'string' ? maybeEmoteSets.split(',') : []\n}\n\nexport const mods = (message: string) => {\n const [, modList] = message.split(': ')\n return modList.split(', ')\n}\n\nexport const username = (...maybeUsernames: any[]): string =>\n maybeUsernames.reduce((maybeUsername, name) => {\n if (typeof name !== 'string') {\n return maybeUsername\n }\n\n if (name === 'tmi.twitch.tv') {\n return 'tmi.twitch.tv'\n }\n\n return toLower(name).split('.')[0]\n }, undefined)\n","import camelCase from 'lodash/camelCase'\nimport gt from 'lodash/gt'\nimport toLower from 'lodash/toLower'\n\nimport {\n BaseTags,\n ClearChatTags,\n GlobalUserStateTags,\n ChatEvents,\n Commands,\n RoomStateTags,\n UserStateTags,\n MessageParameters,\n} from '../../../twitch'\n\nimport * as constants from '../../constants'\nimport * as helpers from './helpers'\n\nexport const clearChat = (tags: BaseTags): ClearChatTags => ({\n ...tags,\n banReason: helpers.generalString(tags.banReason),\n banDuration: helpers.generalNumber(tags.banDuration),\n})\n\nexport const privateMessageCheerEvent = (tags: BaseTags) => {\n return gt(tags.bits, 0)\n ? { event: ChatEvents.CHEER, bits: parseInt(tags.bits, 10) }\n : { event: Commands.PRIVATE_MESSAGE }\n}\n\nexport const roomState = (roomStateTags: BaseTags): RoomStateTags =>\n Object.entries(roomStateTags).reduce((tags, [tag, value]) => {\n switch (tag) {\n case 'followersOnly':\n return { ...tags, [tag]: helpers.followersOnly(value) }\n // Strings\n case 'broadcasterLang':\n return { ...tags, [tag]: helpers.generalString(value) }\n // Numbers\n case 'slow':\n return { ...tags, [tag]: helpers.generalNumber(value) }\n // Booleans\n case 'emoteOnly':\n case 'r9k':\n case 'subsOnly':\n return { ...tags, [tag]: helpers.generalBoolean(value) }\n default:\n return { ...tags, [tag]: value }\n }\n }, {})\n\nexport const userNoticeMessageParameters = (tags: BaseTags) =>\n Object.entries(tags).reduce((parameters, [tag, value]) => {\n const [, param] = constants.MESSAGE_PARAMETER_PREFIX_RE.exec(tag) || []\n\n switch (param) {\n // Numbers.\n case 'Months':\n case 'MassGiftCount':\n case 'PromoGiftTotal':\n case 'SenderCount':\n case 'ViewerCount':\n return {\n ...parameters,\n [camelCase(param)]: helpers.generalNumber(value),\n }\n // Not a msgParam.\n case undefined:\n return parameters\n // Strings\n default:\n return {\n ...parameters,\n [camelCase(param)]: helpers.generalString(value),\n }\n }\n }, {} as MessageParameters)\n\nexport const userState = (tags: BaseTags): UserStateTags => ({\n ...tags,\n badges: helpers.badges(tags.badges),\n bits: helpers.generalNumber(tags.bits),\n color: tags.color,\n displayName: tags.displayName,\n emotes: helpers.emotes(tags.emotes),\n emoteSets: helpers.emoteSets(tags.emoteSets),\n userType: helpers.userType(tags.userType),\n username: tags.displayName ? toLower(tags.displayName) : tags.username,\n isModerator: tags.mod === '1',\n})\n\nexport const globalUserState = (tags: BaseTags): GlobalUserStateTags => ({\n ...tags,\n ...userState(tags),\n})\n\nexport const privateMessage = userState\n\nexport const userNotice = userState\n","import { parse } from 'tekko/dist/parse'\nimport camelcaseKeys from 'camelcase-keys'\n\nimport gt from 'lodash/gt'\nimport isEmpty from 'lodash/isEmpty'\nimport isFinite from 'lodash/isFinite'\nimport toLower from 'lodash/toLower'\nimport toNumber from 'lodash/toNumber'\nimport toUpper from 'lodash/toUpper'\n\nimport {\n BaseMessage,\n ChatEvents,\n ClearChatMessages,\n ClearMessageMessage,\n Commands,\n Events,\n GiftPaidUpgradeParameters,\n GlobalUserStateMessage,\n HostTargetMessage,\n JoinMessage,\n KnownNoticeMessageIds,\n KnownUserNoticeMessageIds,\n ModeMessages,\n NamesEndMessage,\n NamesMessage,\n NoticeEvents,\n NoticeMessage,\n NoticeMessages,\n NoticeTags,\n PartMessage,\n PrivateMessages,\n RaidParameters,\n ResubscriptionParameters,\n RitualParameters,\n RoomStateMessage,\n SubscriptionGiftCommunityParameters,\n SubscriptionGiftParameters,\n SubscriptionParameters,\n UserNoticeMessages,\n UserNoticeTags,\n UserStateMessage,\n} from '../../../twitch'\n\nimport * as constants from '../../constants'\nimport * as utils from '../'\nimport * as helpers from './helpers'\nimport * as tagParsers from './tags'\n\nexport const base = (rawMessages: string, username = ''): BaseMessage[] => {\n const rawMessagesV = rawMessages.split(/\\r?\\n/g)\n\n return rawMessagesV.reduce((messages, rawMessage) => {\n if (!rawMessage.length) {\n return messages\n }\n\n const {\n command,\n tags = {},\n prefix: { name, user, host } = {\n name: undefined,\n user: undefined,\n host: undefined,\n },\n params: [channel, message],\n } = parse(rawMessage)\n\n const timestamp = String(tags['tmi-sent-ts']) || Date.now().toString()\n\n const messageTags = isEmpty(tags)\n ? {}\n : (camelcaseKeys(tags) as { [key: string]: string })\n\n const messageUsername = helpers.username(\n host,\n name,\n user,\n messageTags.login,\n messageTags.username,\n messageTags.displayName,\n )\n\n const baseMessage = {\n _raw: rawMessage,\n timestamp: helpers.generalTimestamp(timestamp),\n command: command as Commands,\n event: command as Events,\n channel: channel !== '*' ? channel : '',\n username: messageUsername,\n isSelf:\n typeof messageUsername === 'string' &&\n toLower(username) === messageUsername,\n tags: messageTags,\n message,\n }\n\n return [...messages, baseMessage]\n }, [] as BaseMessage[])\n}\n\n/**\n * Join a channel.\n * @see https://dev.twitch.tv/docs/irc/membership/#join-twitch-membership\n */\nexport const joinMessage = (baseMessage: BaseMessage): JoinMessage => {\n const [\n ,\n username,\n ,\n ,\n channel,\n ] = /:(.+)!(.+)@(.+).tmi.twitch.tv JOIN (#.+)/g.exec(baseMessage._raw)\n\n return {\n ...baseMessage,\n channel,\n command: Commands.JOIN,\n event: Commands.JOIN,\n username,\n }\n}\n\n/**\n * Join or depart from a channel.\n * @see https://dev.twitch.tv/docs/irc/membership/#join-twitch-membership\n * @see https://dev.twitch.tv/docs/irc/membership/#part-twitch-membership\n */\nexport const partMessage = (baseMessage: BaseMessage): PartMessage => {\n const [\n ,\n username,\n ,\n ,\n channel,\n ] = /:(.+)!(.+)@(.+).tmi.twitch.tv PART (#.+)/g.exec(baseMessage._raw)\n\n return {\n ...baseMessage,\n channel,\n command: Commands.PART,\n event: Commands.PART,\n username,\n }\n}\n\n/**\n * Gain/lose moderator (operator) status in a channel.\n * @see https://dev.twitch.tv/docs/irc/membership/#mode-twitch-membership\n */\nexport const modeMessage = (baseMessage: BaseMessage): ModeMessages => {\n const [\n ,\n channel,\n mode,\n username,\n ] = /:[^\\s]+ MODE (#[^\\s]+) (-|\\+)o ([^\\s]+)/g.exec(baseMessage._raw)\n\n const isModerator = mode === '+'\n\n const baseModeMessage = {\n ...baseMessage,\n command: Commands.MODE as Commands.MODE,\n channel,\n username,\n }\n\n return isModerator\n ? {\n ...baseModeMessage,\n event: ChatEvents.MOD_GAINED,\n message: `+o`,\n isModerator: true,\n }\n : {\n ...baseModeMessage,\n event: ChatEvents.MOD_LOST,\n message: '-o',\n isModerator: false,\n }\n}\n\n/**\n * List current chatters in a channel.\n * @see https://dev.twitch.tv/docs/irc/membership/#names-twitch-membership\n */\nexport const namesMessage = (baseMessage: BaseMessage): NamesMessage => {\n const [\n ,\n ,\n ,\n channel,\n names,\n ] = /:(.+).tmi.twitch.tv 353 (.+) = (#.+) :(.+)/g.exec(baseMessage._raw)\n\n const namesV = names.split(' ')\n\n return {\n ...baseMessage,\n channel,\n command: Commands.NAMES,\n event: Commands.NAMES,\n usernames: namesV,\n }\n}\n\n/**\n * End of list current chatters in a channel.\n * @see https://dev.twitch.tv/docs/irc/membership/#names-twitch-membership\n */\nexport const namesEndMessage = (baseMessage: BaseMessage): NamesEndMessage => {\n const [\n ,\n username,\n ,\n channel,\n // message,\n ] = /:(.+).tmi.twitch.tv 366 (.+) (#.+) :(.+)/g.exec(baseMessage._raw)\n\n return {\n ...baseMessage,\n channel,\n command: Commands.NAMES_END,\n event: Commands.NAMES_END,\n username,\n }\n}\n\n/**\n * GLOBALUSERSTATE message\n */\nexport const globalUserStateMessage = (\n baseMessage: BaseMessage,\n): GlobalUserStateMessage => {\n const { tags, ...other } = baseMessage\n\n return {\n ...other,\n command: Commands.GLOBALUSERSTATE,\n event: Commands.GLOBALUSERSTATE,\n tags: tagParsers.globalUserState(tags),\n }\n}\n\n/**\n * Temporary or permanent ban on a channel.\n * @see https://dev.twitch.tv/docs/irc/commands/#clearchat-twitch-commands\n *\n * All chat is cleared (deleted).\n * @see https://dev.twitch.tv/docs/irc/tags/#clearchat-twitch-tags\n */\nexport const clearChatMessage = (\n baseMessage: BaseMessage,\n): ClearChatMessages => {\n const { tags, message: username, ...other } = baseMessage\n\n if (typeof username !== 'undefined') {\n return {\n ...other,\n tags: {\n ...tags,\n banReason: helpers.generalString(tags.banReason),\n banDuration: helpers.generalNumber(tags.banDuration),\n },\n command: Commands.CLEAR_CHAT,\n event: ChatEvents.USER_BANNED,\n username,\n }\n }\n\n return {\n ...other,\n command: Commands.CLEAR_CHAT,\n event: Commands.CLEAR_CHAT,\n }\n}\n\n/**\n * Single message removal on a channel.\n * @see https://dev.twitch.tv/docs/irc/commands#clearmsg-twitch-commands\n */\nexport const clearMessageMessage = (\n baseMessage: BaseMessage,\n): ClearMessageMessage => {\n const { tags } = baseMessage\n\n return {\n ...baseMessage,\n tags: {\n login: tags.login,\n targetMsgId: tags.targetMsgId,\n },\n command: Commands.CLEAR_MESSAGE,\n event: Commands.CLEAR_MESSAGE,\n targetMessageId: tags.targetMsgId,\n }\n}\n\n/**\n * Host starts or stops a message.\n * @see https://dev.twitch.tv/docs/irc/commands/#hosttarget-twitch-commands\n */\nexport const hostTargetMessage = (\n baseMessage: BaseMessage,\n): HostTargetMessage => {\n const [\n ,\n channel,\n username,\n numberOfViewers,\n ] = /:tmi.twitch.tv HOSTTARGET (#[^\\s]+) :([^\\s]+)?\\s?(\\d+)?/g.exec(\n baseMessage._raw,\n )\n const isStopped = username === '-'\n\n return {\n ...baseMessage,\n channel,\n username,\n command: Commands.HOST_TARGET,\n event: isStopped ? ChatEvents.HOST_OFF : ChatEvents.HOST_ON,\n numberOfViewers: isFinite(toNumber(numberOfViewers))\n ? parseInt(numberOfViewers, 10)\n : undefined,\n }\n}\n\n/**\n * When a user joins a channel or a room setting is changed.\n */\nexport const roomStateMessage = (\n baseMessage: BaseMessage,\n): RoomStateMessage => {\n const { tags, ...other } = baseMessage\n\n return {\n ...other,\n command: Commands.ROOM_STATE,\n event: Commands.ROOM_STATE,\n tags: tagParsers.roomState(tags),\n }\n}\n\n/**\n * NOTICE/ROOM_MODS message\n * @see https://dev.twitch.tv/docs/irc/commands/#msg-id-tags-for-the-notice-commands-capability\n */\nexport const noticeMessage = (baseMessage: BaseMessage): NoticeMessages => {\n const { tags: baseTags, ...other } = baseMessage\n\n const tags = (utils.isAuthenticationFailedMessage(baseMessage)\n ? { ...baseTags, msgId: toLower(Events.AUTHENTICATION_FAILED) }\n : baseTags) as NoticeTags\n\n const event = toUpper(tags.msgId) as NoticeEvents\n\n switch (tags.msgId) {\n case KnownNoticeMessageIds.ROOM_MODS:\n return {\n ...other,\n command: Commands.NOTICE,\n event: NoticeEvents.ROOM_MODS,\n tags,\n mods: helpers.mods(other.message),\n }\n default:\n return {\n ...other,\n command: Commands.NOTICE,\n event,\n tags,\n } as NoticeMessage\n }\n}\n\n/**\n * USERSTATE message\n * When a user joins a channel or sends a PRIVMSG to a channel.\n */\nexport const userStateMessage = (\n baseMessage: BaseMessage,\n): UserStateMessage => {\n const { tags, ...other } = baseMessage\n\n return {\n ...other,\n command: Commands.USER_STATE,\n event: Commands.USER_STATE,\n tags: tagParsers.userState(tags),\n }\n}\n\n/**\n * PRIVMSG message\n * When a user joins a channel or sends a PRIVMSG to a channel.\n * When a user cheers a channel.\n * When a user hosts your channel while connected as broadcaster.\n */\nexport const privateMessage = (baseMessage: BaseMessage): PrivateMessages => {\n const { _raw, tags } = baseMessage\n\n if (gt(tags.bits, 0)) {\n return {\n ...userStateMessage(baseMessage),\n command: Commands.PRIVATE_MESSAGE,\n event: ChatEvents.CHEER,\n bits: parseInt(tags.bits, 10),\n }\n }\n\n const [\n isHostingPrivateMessage,\n channel,\n displayName,\n isAuto,\n numberOfViewers,\n ] = constants.PRIVATE_MESSAGE_HOSTED_RE.exec(_raw) || []\n\n if (isHostingPrivateMessage) {\n if (isAuto) {\n return {\n ...baseMessage,\n command: Commands.PRIVATE_MESSAGE,\n event: ChatEvents.HOSTED_AUTO,\n channel: `#${channel}`,\n tags: { displayName },\n numberOfViewers: helpers.generalNumber(numberOfViewers),\n }\n }\n\n if (numberOfViewers) {\n return {\n ...baseMessage,\n command: Commands.PRIVATE_MESSAGE,\n event: ChatEvents.HOSTED_WITH_VIEWERS,\n channel: `#${channel}`,\n tags: { displayName },\n numberOfViewers: helpers.generalNumber(numberOfViewers),\n }\n }\n\n return {\n ...baseMessage,\n command: Commands.PRIVATE_MESSAGE,\n event: ChatEvents.HOSTED_WITHOUT_VIEWERS,\n channel: `#${channel}`,\n tags: { displayName },\n }\n }\n\n return {\n ...userStateMessage(baseMessage),\n command: Commands.PRIVATE_MESSAGE,\n event: Commands.PRIVATE_MESSAGE,\n }\n}\n\n/**\n * USERNOTICE message\n */\nexport const userNoticeMessage = (\n baseMessage: BaseMessage,\n): UserNoticeMessages => {\n const command = Commands.USER_NOTICE\n const tags = {\n ...tagParsers.userNotice(baseMessage.tags),\n systemMsg: helpers.generalString(baseMessage.tags.systemMsg),\n } as UserNoticeTags\n const systemMessage = helpers.generalString(baseMessage.tags.systemMsg) || ''\n const parameters = tagParsers.userNoticeMessageParameters(tags)\n\n switch (tags.msgId) {\n /**\n * On anonymous gifted subscription paid upgrade to a channel.\n */\n case KnownUserNoticeMessageIds.ANON_GIFT_PAID_UPGRADE:\n return {\n ...baseMessage,\n command,\n event: ChatEvents.ANON_GIFT_PAID_UPGRADE,\n parameters,\n tags,\n systemMessage,\n }\n\n /**\n * On gifted subscription paid upgrade to a channel.\n */\n case KnownUserNoticeMessageIds.GIFT_PAID_UPGRADE:\n return {\n ...baseMessage,\n command,\n event: ChatEvents.GIFT_PAID_UPGRADE,\n parameters: parameters as GiftPaidUpgradeParameters,\n tags,\n systemMessage,\n }\n\n /**\n * On channel raid.\n */\n case KnownUserNoticeMessageIds.RAID:\n return {\n ...baseMessage,\n command,\n event: ChatEvents.RAID,\n parameters: parameters as RaidParameters,\n tags,\n systemMessage,\n }\n\n /**\n * On resubscription (subsequent months) to a channel.\n */\n case KnownUserNoticeMessageIds.RESUBSCRIPTION:\n return {\n ...baseMessage,\n command,\n event: ChatEvents.RESUBSCRIPTION,\n parameters: parameters as ResubscriptionParameters,\n tags,\n systemMessage,\n }\n\n /**\n * On channel ritual.\n */\n case KnownUserNoticeMessageIds.RITUAL:\n return {\n ...baseMessage,\n command,\n event: ChatEvents.RITUAL,\n parameters: parameters as RitualParameters,\n tags,\n systemMessage,\n }\n\n /**\n * On subscription gift to a channel community.\n */\n case KnownUserNoticeMessageIds.SUBSCRIPTION_GIFT_COMMUNITY:\n return {\n ...baseMessage,\n command,\n event: ChatEvents.SUBSCRIPTION_GIFT_COMMUNITY,\n parameters: parameters as SubscriptionGiftCommunityParameters,\n tags,\n systemMessage,\n }\n\n /**\n * On subscription gift to a channel.\n */\n case KnownUserNoticeMessageIds.SUBSCRIPTION_GIFT:\n return {\n ...baseMessage,\n command,\n event: ChatEvents.SUBSCRIPTION_GIFT,\n parameters: parameters as SubscriptionGiftParameters,\n tags,\n systemMessage,\n }\n\n /**\n * On subscription (first month) to a channel.\n */\n case KnownUserNoticeMessageIds.SUBSCRIPTION:\n return {\n ...baseMessage,\n command,\n event: ChatEvents.SUBSCRIPTION,\n parameters: parameters as SubscriptionParameters,\n tags,\n systemMessage,\n }\n\n /**\n * Unknown USERNOTICE event.\n */\n default:\n return {\n ...baseMessage,\n command,\n event: toUpper(tags.msgId),\n tags,\n parameters,\n systemMessage,\n } as UserNoticeMessages\n }\n}\n\nexport default base\n","import { BaseMessage, Events, Commands } from '../../twitch'\n\nimport * as constants from '../constants'\n\nexport const isAuthenticationFailedMessage = (message?: BaseMessage) =>\n typeof message !== 'undefined' &&\n message.command === Commands.NOTICE &&\n message.channel === '' &&\n message.message === 'Login authentication failed'\n\nexport const getEventNameFromMessage = (message: BaseMessage) =>\n typeof message !== 'undefined' ? message.command || message.event : Events.ALL\n\nexport const isUserAnonymous = (value: string) =>\n constants.ANONYMOUS_USERNAME_RE.test(value)\n","import isEmpty from 'lodash/isEmpty'\nimport random from 'lodash/random'\n\nimport { ANONYMOUS_USERNAME } from '../constants'\n\nexport const channel = (value?: any): string => {\n if (typeof value !== 'string' || value.length === 0) {\n return ''\n }\n\n value = value.toLowerCase()\n\n if (!value.startsWith('#')) {\n return `#${value}`\n }\n\n return value\n}\n\nexport const token = (value: any): string => {\n if (value == null) {\n return 'TWITCHJS'\n }\n\n if (value.startsWith('oauth:')) {\n return value\n }\n\n return `oauth:${value}`\n}\n\nexport const username = (value: any): string => {\n if (isEmpty(value) || value === 'justinfan') {\n return `${ANONYMOUS_USERNAME}${random(80000, 81000)}`\n }\n\n return value\n}\n","import invariant from 'invariant'\n\nimport conformsTo from 'lodash/conformsTo'\nimport defaults from 'lodash/defaults'\nimport isString from 'lodash/isString'\nimport isFinite from 'lodash/isFinite'\nimport isFunction from 'lodash/isFunction'\nimport isBoolean from 'lodash/isBoolean'\nimport isNil from 'lodash/isNil'\n\nimport * as types from '../types'\n\nimport * as constants from '../constants'\nimport * as sanitizers from './sanitizers'\n\nexport const chatOptions = (\n options: Partial<types.ChatOptions>,\n): types.ChatOptions => {\n const shape = {\n username: (value: any) => isNil(value) || isString(value),\n token: (value: any) => isNil(value) || isString(value),\n isKnown: isBoolean,\n isVerified: isBoolean,\n connectionTimeout: isFinite,\n joinTimeout: isFinite,\n onAuthenticationFailure: isFunction,\n }\n\n const optionsWithDefaults = defaults(\n {\n ...options,\n username: options.username\n ? sanitizers.username(options.username)\n : undefined,\n token: options.token ? sanitizers.token(options.token) : undefined,\n },\n {\n isKnown: false,\n isVerified: false,\n connectionTimeout: constants.CONNECTION_TIMEOUT,\n joinTimeout: constants.JOIN_TIMEOUT,\n onAuthenticationFailure: () => Promise.reject(),\n },\n )\n\n invariant(\n conformsTo(optionsWithDefaults, shape),\n '[twitch-js/Chat] options: Expected valid options',\n )\n\n return optionsWithDefaults\n}\n\nexport const channel = (channel: string): string => {\n channel = sanitizers.channel(channel)\n\n if (!channel) {\n throw new Error('Channel required')\n }\n\n return channel\n}\n","import EventEmitter from 'eventemitter3'\nimport delay, { ClearablePromise } from 'delay'\nimport PCancelable from 'p-cancelable'\nimport pEvent from 'p-event'\nimport pTimeout from 'p-timeout'\n\nimport uniq from 'lodash/uniq'\n\nimport {\n BaseMessage,\n ChatCommands,\n Commands,\n Events,\n GlobalUserStateTags,\n Messages,\n NoticeMessages,\n RoomStateMessage,\n UserStateMessage,\n} from '../twitch'\n\nimport createLogger, { Logger } from '../utils/logger'\n\nimport Client from '../Client'\nimport { ClientEvents } from '../Client/types'\n\nimport * as Errors from './Errors'\n\nimport * as parsers from './utils/parsers'\nimport * as sanitizers from './utils/sanitizers'\nimport * as validators from './utils/validators'\n\nimport {\n ChatReadyStates,\n EventTypes,\n ChatOptions,\n ChannelStates,\n NoticeCompounds,\n PrivateMessageCompounds,\n UserNoticeCompounds,\n ChannelState,\n} from './types'\n\n/**\n * Interact with Twitch chat.\n *\n * ## Connecting\n *\n * ```js\n * const token = 'cfabdegwdoklmawdzdo98xt2fo512y'\n * const username = 'ronni'\n * const { chat } = new TwitchJs({ token, username })\n *\n * chat.connect().then(globalUserState => {\n * // Do stuff ...\n * })\n * ```\n *\n * **Note:** Connecting with a `token` and a `username` is optional.\n *\n * Once connected, `chat.userState` will contain\n * [[GlobalUserStateTags|global user state information]].\n *\n * ## Joining a channel\n *\n * ```js\n * const channel = '#dallas'\n *\n * chat.join(channel).then(channelState => {\n * // Do stuff with channelState...\n * })\n * ```\n *\n * After joining a channel, `chat.channels[channel]` will contain\n * [[ChannelState|channel state information]].\n *\n * ## Listening for events\n *\n * ```js\n * // Listen to all events\n * chat.on('*', message => {\n * // Do stuff with message ...\n * })\n *\n * // Listen to private messages\n * chat.on('PRIVMSG', privateMessage => {\n * // Do stuff with privateMessage ...\n * })\n * ```\n *\n * Events are nested; for example:\n *\n * ```js\n * // Listen to subscriptions only\n * chat.on('USERNOTICE/SUBSCRIPTION', userStateMessage => {\n * // Do stuff with userStateMessage ...\n * })\n *\n * // Listen to all user notices\n * chat.on('USERNOTICE', userStateMessage => {\n * // Do stuff with userStateMessage ...\n * })\n * ```\n *\n * For added convenience, TwitchJS also exposes event constants.\n *\n * ```js\n * const { chat } = new TwitchJs({ token, username })\n *\n * // Listen to all user notices\n * chat.on(chat.events.USER_NOTICE, userStateMessage => {\n * // Do stuff with userStateMessage ...\n * })\n * ```\n *\n * ## Sending messages\n *\n * To send messages, [Chat] must be initialized with a `username` and a\n * [`token`](../#authentication) with `chat_login` scope.\n *\n * All messages sent to Twitch are automatically rate-limited according to\n * [Twitch Developer documentation](https://dev.twitch.tv/docs/irc/guide/#command--message-limits).\n *\n * ### Speak in channel\n *\n * ```js\n * const channel = '#dallas'\n *\n * chat\n * .say(channel, 'Kappa Keepo Kappa')\n * // Optionally ...\n * .then(() => {\n * // ... do stuff on success ...\n * })\n * ```\n *\n * ### Send command to channel\n *\n * All chat commands are currently supported and exposed as camel-case methods. For\n * example:\n *\n * ```js\n * const channel = '#dallas'\n *\n * // Enable followers-only for 1 week\n * chat.followersOnly(channel, '1w')\n *\n * // Ban ronni\n * chat.ban(channel, 'ronni')\n * ```\n *\n * **Note:** `Promise`-resolves for each commands are\n * [planned](https://github.com/twitch-devs/twitch-js/issues/87).\n *\n * ## Joining multiple channels\n *\n * ```js\n * const channels = ['#dallas', '#ronni']\n *\n * Promise.all(channels.map(channel => chat.join(channel))).then(channelStates => {\n * // Listen to all messages from #dallas only\n * chat.on('#dallas', message => {\n * // Do stuff with message ...\n * })\n *\n * // Listen to private messages from #dallas and #ronni\n * chat.on('PRIVMSG', privateMessage => {\n * // Do stuff with privateMessage ...\n * })\n *\n * // Listen to private messages from #dallas only\n * chat.on('PRIVMSG/#dallas', privateMessage => {\n * // Do stuff with privateMessage ...\n * })\n *\n * // Listen to all private messages from #ronni only\n * chat.on('PRIVMSG/#ronni', privateMessage => {\n * // Do stuff with privateMessage ...\n * })\n * })\n * ```\n *\n * ### Broadcasting to all channels\n *\n * ```js\n * chat\n * .broadcast('Kappa Keepo Kappa')\n * // Optionally ...\n * .then(userStateMessages => {\n * // ... do stuff with userStateMessages on success ...\n * })\n * ```\n */\nclass Chat extends EventEmitter<EventTypes> {\n static Commands = Commands\n\n static Events = Events\n\n static CompoundEvents = {\n [Events.NOTICE]: NoticeCompounds,\n [Events.PRIVATE_MESSAGE]: PrivateMessageCompounds,\n [Events.USER_NOTICE]: UserNoticeCompounds,\n }\n\n private _options: ChatOptions\n\n private _log: Logger\n\n private _client?: Client\n\n private _readyState: ChatReadyStates = ChatReadyStates.WAITING\n\n private _connectionAttempts = 0\n private _connectionInProgress?: ClearablePromise<void> | void\n\n private _globalUserState?: GlobalUserStateTags\n private _channelState: ChannelStates = {}\n\n private _isAuthenticated = false\n\n /**\n * Chat constructor.\n */\n constructor(options: Partial<ChatOptions>) {\n super()\n\n this._options = validators.chatOptions(options)\n\n // Create logger.\n this._log = createLogger({ name: 'Chat', ...this._options.log })\n }\n\n /**\n * Connect to Twitch.\n */\n async connect(): Promise<void> {\n try {\n this._readyState = ChatReadyStates.CONNECTING\n\n if (this._connectionInProgress) {\n return this._connectionInProgress\n }\n\n this._connectionInProgress = await pTimeout(\n this._handleConnectionAttempt(),\n this._options.connectionTimeout,\n )\n\n this._readyState = ChatReadyStates.CONNECTED\n this._connectionAttempts = 0\n } catch (err) {\n if (\n this._readyState !== ChatReadyStates.DISCONNECTING &&\n this._readyState !== ChatReadyStates.DISCONNECTED\n ) {\n this._log.info('Retrying ...')\n await delay(this._options.connectionTimeout)\n\n await this._handleAuthenticationFailure()\n return this.connect()\n } else {\n throw err\n }\n }\n }\n\n /**\n * Updates the client options after instantiation.\n * To update `token` or `username`, use `reconnect()`.\n */\n updateOptions(options: Partial<ChatOptions>) {\n const { token, username } = this._options\n this._options = validators.chatOptions({ ...options, token, username })\n }\n\n /**\n * Send a raw message to Twitch.\n */\n send(\n message: string,\n options?: Partial<{ priority: number; isModerator: boolean }>,\n ): Promise<void> {\n if (!this._client) {\n throw new Errors.ChatError('Not connected')\n }\n\n return this._client.send(message, options)\n }\n\n /**\n * Disconnected from Twitch.\n */\n disconnect() {\n this._readyState = ChatReadyStates.DISCONNECTING\n this._client?.disconnect()\n this._readyState = ChatReadyStates.DISCONNECTED\n }\n\n /**\n * Reconnect to Twitch, providing new options to the client.\n */\n async reconnect(options?: ChatOptions) {\n if (options) {\n this._options = validators.chatOptions({ ...this._options, ...options })\n }\n\n this._connectionInProgress = undefined\n this._readyState = ChatReadyStates.RECONNECTING\n\n const channels = this._getChannels()\n this.disconnect()\n\n await this.connect()\n\n return Promise.all(channels.map((channel) => this.join(channel)))\n }\n\n /**\n * Join a channel.\n *\n * @example <caption>Joining #dallas</caption>\n * const channel = '#dallas'\n *\n * chat.join(channel).then(channelState => {\n * // Do stuff with channelState...\n * })\n *\n * @example <caption>Joining multiple channels</caption>\n * const channels = ['#dallas', '#ronni']\n *\n * Promise.all(channels.map(channel => chat.join(channel)))\n * .then(channelStates => {\n * // Listen to all PRIVMSG\n * chat.on('PRIVMSG', privateMessage => {\n * // Do stuff with privateMessage ...\n * })\n *\n * // Listen to PRIVMSG from #dallas ONLY\n * chat.on('PRIVMSG/#dallas', privateMessage => {\n * // Do stuff with privateMessage ...\n * })\n * // Listen to all PRIVMSG from #ronni ONLY\n * chat.on('PRIVMSG/#ronni', privateMessage => {\n * // Do stuff with privateMessage ...\n * })\n * })\n */\n async join(channel: string) {\n channel = validators.channel(channel)\n\n const joinProfiler = this._log.profile(`Joining ${channel}`)\n\n const [roomState, userState] = await Promise.all([\n pEvent<string, RoomStateMessage>(\n // @ts-expect-error EventTypes breaks this\n this,\n `${Commands.ROOM_STATE}/${channel}`,\n ),\n\n this._isAuthenticated\n ? pEvent<string, UserStateMessage>(\n // @ts-expect-error EventTypes breaks this\n this,\n `${Commands.USER_STATE}/${channel}`,\n )\n : undefined,\n this.send(`${Commands.JOIN} ${channel}`),\n ])\n\n const channelState = {\n roomState: roomState.tags,\n userState: userState ? userState.tags : undefined,\n }\n this._setChannelState(roomState.channel, channelState)\n\n joinProfiler.done(`Joined ${channel}`)\n\n return channelState\n }\n\n /**\n * Depart from a channel.\n */\n part(channel: string) {\n channel = validators.channel(channel)\n this._log.info(`Parting ${channel}`)\n\n this._removeChannelState(channel)\n return this.send(`${Commands.PART} ${channel}`)\n }\n\n /**\n * Send a message to a channel.\n */\n async say(\n channel: string,\n message: string,\n options: { priority?: number } = {},\n ): Promise<void> {\n if (!this._isAuthenticated) {\n throw new Errors.ChatError(\n 'To send messages, please connect with a token and username',\n )\n }\n\n channel = validators.channel(channel)\n\n const isCommand = message.startsWith('/')\n const isModerator = this._channelState[channel]?.userState?.mod === '1'\n\n if (isCommand) {\n this._log.info(`CMD/${channel} :${message}`)\n } else {\n this._log.info(`PRIVMSG/${channel} :${message}`)\n }\n\n const resolver: Promise<void | UserStateMessage> = isCommand\n ? // Commands do not result in USERSTATE messages\n Promise.resolve()\n : pEvent<string, UserStateMessage>(\n // @ts-expect-error EventTypes breaks this\n this,\n `${Commands.USER_STATE}/${channel}`,\n )\n\n await Promise.all([\n resolver,\n this.send(`${Commands.PRIVATE_MESSAGE} ${channel} :${message}`, {\n isModerator,\n ...options,\n }),\n ])\n }\n\n /**\n * Broadcast message to all connected channels.\n */\n async broadcast(message: string) {\n if (!this._isAuthenticated) {\n throw new Errors.ChatError(\n 'To broadcast, please connect with a token and username',\n )\n }\n\n return this._getChannels().map((channel) => this.say(channel, message))\n }\n\n /**\n * This command will allow you to permanently ban a user from the chat room.\n */\n async ban(channel: string, username: string): Promise<NoticeMessages> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.BAN} ${username}`\n const [notice] = await Promise.all([\n pEvent<string, NoticeMessages>(\n // @ts-expect-error EventTypes breaks this\n this,\n [\n `${NoticeCompounds.BAN_SUCCESS}/${channel}`,\n `${NoticeCompounds.ALREADY_BANNED}/${channel}`,\n ],\n ),\n this.say(channel, message),\n ])\n return notice\n }\n\n /**\n * This command will allow you to block all messages from a specific user in\n * chat and whispers if you do not wish to see their comments.\n */\n async block(channel: string, username: string): Promise<void> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.BLOCK} ${username}`\n return this.say(channel, message)\n }\n\n /**\n * Single message removal on a channel.\n */\n async delete(channel: string, targetMessageId: string): Promise<void> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.DELETE} ${targetMessageId}`\n return this.say(channel, message)\n }\n\n /**\n * This command will allow the Broadcaster and chat moderators to completely\n * wipe the previous chat history.\n */\n async clear(channel: string): Promise<NoticeMessages> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.CLEAR}`\n const [notice] = await Promise.all([\n pEvent<string, NoticeMessages>(\n // @ts-expect-error EventTypes breaks this\n this,\n [`${Commands.CLEAR_CHAT}/${channel}`],\n ),\n this.say(channel, message),\n ])\n return notice\n }\n\n /**\n * Allows you to change the color of your username.\n */\n async color(channel: string, color: string): Promise<NoticeMessages> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.COLOR} ${color}`\n const [notice] = await Promise.all([\n pEvent<string, NoticeMessages>(\n // @ts-expect-error EventTypes breaks this\n this,\n [`${NoticeCompounds.COLOR_CHANGED}/${channel}`],\n ),\n this.say(channel, message),\n ])\n return notice\n }\n\n /**\n * An Affiliate and Partner command that runs a commercial for all of your\n * viewers.\n */\n async commercial(\n channel: string,\n length: 30 | 60 | 90 | 120 | 150 | 180,\n ): Promise<NoticeMessages> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.COMMERCIAL} ${length}`\n const [notice] = await Promise.all([\n pEvent<string, NoticeMessages>(\n // @ts-expect-error EventTypes breaks this\n this,\n [`${NoticeCompounds.COMMERCIAL_SUCCESS}/${channel}`],\n ),\n this.say(channel, message),\n ])\n return notice\n }\n\n /**\n * This command allows you to set your room so only messages that are 100%\n * emotes are allowed.\n */\n async emoteOnly(channel: string): Promise<NoticeMessages> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.EMOTE_ONLY}`\n const [notice] = await Promise.all([\n pEvent<string, NoticeMessages>(\n // @ts-expect-error EventTypes breaks this\n this,\n [\n `${NoticeCompounds.EMOTE_ONLY_ON}/${channel}`,\n `${NoticeCompounds.ALREADY_EMOTE_ONLY_ON}/${channel}`,\n ],\n ),\n this.say(channel, message),\n ])\n return notice\n }\n\n /**\n * This command allows you to disable emote only mode if you previously\n * enabled it.\n */\n async emoteOnlyOff(channel: string): Promise<NoticeMessages> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.EMOTE_ONLY_OFF}`\n const [notice] = await Promise.all([\n pEvent<string, NoticeMessages>(\n // @ts-expect-error EventTypes breaks this\n this,\n [\n `${NoticeCompounds.EMOTE_ONLY_OFF}/${channel}`,\n `${NoticeCompounds.ALREADY_EMOTE_ONLY_OFF}/${channel}`,\n ],\n ),\n this.say(channel, message),\n ])\n return notice\n }\n\n /**\n * This command allows you or your mods to restrict chat to all or some of\n * your followers, based on how long they’ve followed.\n * @param period - Follow time from 0 minutes (all followers) to 3 months.\n */\n async followersOnly(\n channel: string,\n period: string,\n ): Promise<NoticeMessages> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.FOLLOWERS_ONLY} ${period}`\n const [notice] = await Promise.all([\n pEvent<string, NoticeMessages>(\n // @ts-expect-error EventTypes breaks this\n this,\n [\n `${NoticeCompounds.FOLLOWERS_ONZERO}/${channel}`,\n `${NoticeCompounds.FOLLOWERS_ON}/${channel}`,\n ],\n ),\n this.say(channel, message),\n ])\n return notice\n }\n\n /**\n * This command will disable followers only mode if it was previously enabled\n * on the channel.\n */\n async followersOnlyOff(channel: string): Promise<NoticeMessages> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.FOLLOWERS_ONLY_OFF}`\n const [notice] = await Promise.all([\n pEvent<string, NoticeMessages>(\n // @ts-expect-error EventTypes breaks this\n this,\n [`${NoticeCompounds.FOLLOWERS_OFF}/${channel}`],\n ),\n this.say(channel, message),\n ])\n return notice\n }\n\n async help(channel: string): Promise<NoticeMessages> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.HELP}`\n const [notice] = await Promise.all([\n pEvent<string, NoticeMessages>(\n // @ts-expect-error EventTypes breaks this\n this,\n [`${NoticeCompounds.CMDS_AVAILABLE}/${channel}`],\n ),\n this.say(channel, message),\n ])\n return notice\n }\n\n /**\n * This command will allow you to host another channel on yours.\n */\n async host(channel: string, hostChannel: string): Promise<NoticeMessages> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.HOST} ${hostChannel}`\n const [notice] = await Promise.all([\n pEvent<string, NoticeMessages>(\n // @ts-expect-error EventTypes breaks this\n this,\n [`${NoticeCompounds.HOST_ON}/${channel}`],\n ),\n this.say(channel, message),\n ])\n return notice\n }\n\n /**\n * Adds a stream marker (with an optional description, max 140 characters) at\n * the current timestamp. You can use markers in the Highlighter for easier\n * editing.\n */\n async marker(channel: string, description: string): Promise<void> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.MARKER} ${description.slice(0, 140)}`\n return this.say(channel, message)\n }\n\n /**\n * This command will color your text based on your chat name color.\n */\n async me(channel: string, text: string): Promise<void> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.ME} ${text}`\n return this.say(channel, message)\n }\n\n /**\n * This command will allow you to promote a user to a channel moderator.\n */\n async mod(channel: string, username: string): Promise<NoticeMessages> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.MOD} ${username}`\n const [notice] = await Promise.all([\n pEvent<string, NoticeMessages>(\n // @ts-expect-error EventTypes breaks this\n this,\n [`${NoticeCompounds.MOD_SUCCESS}/${channel}`],\n ),\n this.say(channel, message),\n ])\n return notice\n }\n\n /**\n * This command will display a list of all chat moderators for that specific\n * channel.\n */\n async mods(channel: string): Promise<NoticeMessages> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.MODS}`\n\n const [notice] = await Promise.all([\n pEvent<string, NoticeMessages>(\n // @ts-expect-error EventTypes breaks this\n this,\n [`${NoticeCompounds.ROOM_MODS}/${channel}`],\n ),\n this.say(channel, message),\n ])\n\n return notice\n }\n\n /**\n * @deprecated\n */\n async r9K(channel: string): Promise<NoticeMessages> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.R9K}`\n const [notice] = await Promise.all([\n pEvent<string, NoticeMessages>(\n // @ts-expect-error EventTypes breaks this\n this,\n [\n `${NoticeCompounds.R9K_ON}/${channel}`,\n `${NoticeCompounds.ALREADY_R9K_ON}/${channel}`,\n ],\n ),\n this.say(channel, message),\n ])\n return notice\n }\n\n /**\n * @deprecated\n */\n async r9KOff(channel: string): Promise<NoticeMessages> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.R9K_OFF}`\n const [notice] = await Promise.all([\n pEvent<string, NoticeMessages>(\n // @ts-expect-error EventTypes breaks this\n this,\n [\n `${NoticeCompounds.R9K_OFF}/${channel}`,\n `${NoticeCompounds.ALREADY_R9K_OFF}/${channel}`,\n ],\n ),\n this.say(channel, message),\n ])\n return notice\n }\n\n /**\n * This command will send the viewer to another live channel.\n */\n async raid(channel: string, raidChannel: string): Promise<void> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.RAID} ${raidChannel}`\n return this.say(channel, message)\n }\n\n /**\n * This command allows you to set a limit on how often users in the chat room\n * are allowed to send messages (rate limiting).\n */\n async slow(channel: string, seconds: string): Promise<NoticeMessages> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.SLOW} ${seconds}`\n const [notice] = await Promise.all([\n pEvent<string, NoticeMessages>(\n // @ts-expect-error EventTypes breaks this\n this,\n [`${NoticeCompounds.SLOW_ON}/${channel}`],\n ),\n this.say(channel, message),\n ])\n return notice\n }\n\n /**\n * This command allows you to disable slow mode if you had previously set it.\n */\n async slowOff(channel: string): Promise<NoticeMessages> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.SLOW_OFF}`\n const [notice] = await Promise.all([\n pEvent<string, NoticeMessages>(\n // @ts-expect-error EventTypes breaks this\n this,\n [`${NoticeCompounds.SLOW_OFF}/${channel}`],\n ),\n this.say(channel, message),\n ])\n return notice\n }\n\n /**\n * This command allows you to set your room so only users subscribed to you\n * can talk in the chat room. If you don't have the subscription feature it\n * will only allow the Broadcaster and the channel moderators to talk in the\n * chat room.\n */\n async subscribers(channel: string): Promise<NoticeMessages> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.SUBSCRIBERS}`\n const [notice] = await Promise.all([\n pEvent<string, NoticeMessages>(\n // @ts-expect-error EventTypes breaks this\n this,\n [\n `${NoticeCompounds.SUBS_ON}/${channel}`,\n `${NoticeCompounds.ALREADY_SUBS_ON}/${channel}`,\n ],\n ),\n this.say(channel, message),\n ])\n return notice\n }\n\n /**\n * This command allows you to disable subscribers only chat room if you\n * previously enabled it.\n */\n async subscribersOff(channel: string): Promise<NoticeMessages> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.SUBSCRIBERS_OFF}`\n const [notice] = await Promise.all([\n pEvent<string, NoticeMessages>(\n // @ts-expect-error EventTypes breaks this\n this,\n [\n `${NoticeCompounds.SUBS_OFF}/${channel}`,\n `${NoticeCompounds.ALREADY_SUBS_OFF}/${channel}`,\n ],\n ),\n this.say(channel, message),\n ])\n return notice\n }\n\n /**\n * This command allows you to temporarily ban someone from the chat room for\n * 10 minutes by default. This will be indicated to yourself and the\n * temporarily banned subject in chat on a successful temporary ban. A new\n * timeout command will overwrite an old one.\n */\n async timeout(\n channel: string,\n username: string,\n timeout?: number,\n ): Promise<NoticeMessages> {\n channel = validators.channel(channel)\n const timeoutArg = timeout ? ` ${timeout}` : ''\n const message = `/${ChatCommands.TIMEOUT} ${username}${timeoutArg}`\n const [notice] = await Promise.all([\n pEvent<string, NoticeMessages>(\n // @ts-expect-error EventTypes breaks this\n this,\n [`${NoticeCompounds.TIMEOUT_SUCCESS}/${channel}`],\n ),\n this.say(channel, message),\n ])\n return notice\n }\n\n /**\n * This command will allow you to lift a permanent ban on a user from the\n * chat room. You can also use this command to end a ban early; this also\n * applies to timeouts.\n */\n async unban(channel: string, username: string): Promise<NoticeMessages> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.UNBAN} ${username}`\n const [notice] = await Promise.all([\n pEvent<string, NoticeMessages>(\n // @ts-expect-error EventTypes breaks this\n this,\n [`${NoticeCompounds.UNBAN_SUCCESS}/${channel}`],\n ),\n this.say(channel, message),\n ])\n return notice\n }\n\n /**\n * This command will allow you to remove users from your block list that you\n * previously added.\n */\n async unblock(channel: string, username: string): Promise<void> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.UNBLOCK} ${username}`\n return this.say(channel, message)\n }\n\n /**\n * Using this command will revert the embedding from hosting a channel and\n * return it to its normal state.\n */\n async unhost(channel: string): Promise<NoticeMessages> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.UNHOST}`\n const [notice] = await Promise.all([\n pEvent<string, NoticeMessages>(\n // @ts-expect-error EventTypes breaks this\n this,\n [`${NoticeCompounds.HOST_OFF}/${channel}`],\n ),\n this.say(channel, message),\n ])\n return notice\n }\n\n /**\n * This command will allow you to demote an existing moderator back to viewer\n * status (removing their moderator abilities).\n */\n async unmod(channel: string, username: string): Promise<NoticeMessages> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.UNMOD} ${username}`\n const [notice] = await Promise.all([\n pEvent<string, NoticeMessages>(\n // @ts-expect-error EventTypes breaks this\n this,\n [`${NoticeCompounds.UNMOD_SUCCESS}/${channel}`],\n ),\n this.say(channel, message),\n ])\n return notice\n }\n\n /**\n * This command will cancel the raid.\n */\n async unraid(channel: string): Promise<NoticeMessages> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.UNRAID}`\n const [notice] = await Promise.all([\n pEvent<string, NoticeMessages>(\n // @ts-expect-error EventTypes breaks this\n this,\n [`${NoticeCompounds.UNRAID_SUCCESS}/${channel}`],\n ),\n this.say(channel, message),\n ])\n return notice\n }\n\n /**\n * This command will grant VIP status to a user.\n */\n unvip(channel: string, username: string): Promise<void> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.UNVIP} ${username}`\n return this.say(channel, message)\n }\n\n /**\n * This command will grant VIP status to a user.\n */\n vip(channel: string, username: string): Promise<void> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.VIP} ${username}`\n return this.say(channel, message)\n }\n\n /**\n * This command will display a list of VIPs for that specific channel.\n */\n vips(channel: string): Promise<void> {\n channel = validators.channel(channel)\n const message = `/${ChatCommands.VIPS}`\n return this.say(channel, message)\n }\n\n /**\n * This command sends a private message to another user on Twitch.\n */\n async whisper(username: string, message: string): Promise<void> {\n if (!this._isAuthenticated) {\n throw new Errors.ChatError(\n 'To whisper, please connect with a token and username',\n )\n }\n\n const command = `/${ChatCommands.WHISPER} ${username} ${message}`\n return this.send(command)\n }\n\n private _handleConnectionAttempt(): Promise<void> {\n return new PCancelable((resolve, reject) => {\n const connectProfiler = this._log.profile('Connecting ...')\n\n const { token, username } = this._options\n\n // Connect ...\n this._readyState = ChatReadyStates.CONNECTING\n\n // Increment connection attempts.\n this._connectionAttempts += 1\n\n if (this._client) {\n // Remove all listeners, just in case.\n this._client.removeAllListeners()\n }\n\n // Create client and connect.\n this._client = new Client(this._options)\n\n // Handle disconnects.\n this._client.on(ClientEvents.DISCONNECTED, this._handleDisconnect, this)\n\n // Listen for reconnects.\n this._client.once(ClientEvents.RECONNECT, () => this.reconnect())\n\n // Listen for authentication failure.\n this._client.once(ClientEvents.AUTHENTICATION_FAILED, reject)\n\n // Once the client is connected, resolve ...\n this._client.once(ClientEvents.CONNECTED, (message) => {\n if (token && username) {\n this._handleAuthenticated(message)\n }\n this._handleJoinsAfterConnect()\n resolve()\n connectProfiler.done('Connected')\n })\n\n // Handle messages.\n this._client.on(ClientEvents.ALL, this._handleMessage, this)\n })\n }\n\n private _handleDisconnect() {\n this._log.info('Disconnecting ...')\n if (this._connectionInProgress) {\n this._connectionInProgress.clear()\n }\n this._connectionInProgress = undefined\n this._isAuthenticated = false\n this._clearChannelState()\n this._log.info('Disconnected')\n }\n\n private _handleAuthenticated(message: BaseMessage) {\n const globalUserStateMessage = parsers.globalUserStateMessage(message)\n this._globalUserState = globalUserStateMessage.tags\n this._isAuthenticated = true\n }\n\n private async _handleAuthenticationFailure() {\n try {\n this._log.info('Retrying ...')\n\n const token = await this._options.onAuthenticationFailure?.()\n\n if (token) {\n this._log.info('Re-authenticating ...')\n this._options = { ...this._options, token }\n return this.connect()\n }\n } catch (err) {\n this._log.error('Re-authentication failed')\n throw new Errors.AuthenticationError(err)\n }\n }\n\n private _handleMessage(baseMessage: BaseMessage) {\n if (baseMessage instanceof Error) {\n this.emit('error', baseMessage)\n return\n }\n\n try {\n const [eventName, message] = this._parseMessageForEmitter(baseMessage)\n this._emit(eventName, message)\n } catch (error) {\n /**\n * Catch errors while parsing base messages into events.\n */\n this._log.error(\n '\\n' +\n 'An error occurred while attempting to parse a message into a ' +\n 'event. Please use the following stack trace and raw message to ' +\n 'resolve the bug in the TwitchJS source code, and then issue a ' +\n 'pull request at https://github.com/twitch-js/twitch-js/compare\\n' +\n '\\n' +\n 'Stack trace:\\n' +\n `${error}\\n` +\n '\\n' +\n 'Base message:\\n' +\n JSON.stringify(baseMessage),\n )\n this.emit(ClientEvents.ERROR_ENCOUNTERED, error)\n }\n }\n\n private async _handleJoinsAfterConnect() {\n const channels = this._getChannels()\n await Promise.all(channels.map((channel) => this.join(channel)))\n }\n\n private _getChannels() {\n return Object.keys(this._channelState)\n }\n\n private _getChannelState(channel: string): ChannelState | undefined {\n return this._channelState[channel]\n }\n\n private _setChannelState(channel: string, state: ChannelState) {\n this._channelState[channel] = state\n }\n\n private _removeChannelState(channel: string) {\n this._channelState = Object.entries(this._channelState).reduce(\n (channelStates, [name, state]) => {\n return name === channel\n ? channelStates\n : { ...channelStates, [name]: state }\n },\n {},\n )\n }\n\n private _clearChannelState() {\n this._channelState = {}\n }\n\n private _parseMessageForEmitter(\n baseMessage: BaseMessage,\n ): [string, Messages] {\n const channel = sanitizers.channel(baseMessage.channel)\n\n const baseEventName = baseMessage.event || baseMessage.command\n\n switch (baseMessage.command) {\n case Events.JOIN: {\n const message = parsers.joinMessage(baseMessage)\n const eventName = `${baseEventName}/${channel}`\n return [eventName, message]\n }\n\n case Events.PART: {\n const message = parsers.partMessage(baseMessage)\n const eventName = `${baseEventName}/${channel}`\n return [eventName, message]\n }\n\n case Events.NAMES: {\n const message = parsers.namesMessage(baseMessage)\n const eventName = `${baseEventName}/${channel}`\n return [eventName, message]\n }\n\n case Events.NAMES_END: {\n const message = parsers.namesEndMessage(baseMessage)\n const eventName = `${baseEventName}/${channel}`\n return [eventName, message]\n }\n\n case Events.CLEAR_CHAT: {\n const message = parsers.clearChatMessage(baseMessage)\n const eventName = `${baseEventName}/${message.event}/${channel}`\n return [eventName, message]\n }\n\n case Events.CLEAR_MESSAGE: {\n const message = parsers.clearMessageMessage(baseMessage)\n const eventName = `${baseEventName}/${channel}`\n return [eventName, message]\n }\n\n case Events.HOST_TARGET: {\n const message = parsers.hostTargetMessage(baseMessage)\n const eventName = `${baseEventName}/${channel}`\n return [eventName, message]\n }\n\n case Events.MODE: {\n const message = parsers.modeMessage(baseMessage)\n const eventName = `${baseEventName}/${channel}`\n\n const channelState = this._getChannelState(channel)\n\n if (\n this._isAuthenticated &&\n typeof channelState?.userState !== 'undefined' &&\n message.username === this._options.username\n ) {\n this._setChannelState(channel, {\n ...channelState,\n userState: {\n ...channelState.userState,\n mod: message.isModerator ? '1' : '0',\n isModerator: message.isModerator,\n },\n })\n }\n return [eventName, message]\n }\n\n case Events.USER_STATE: {\n const message = parsers.userStateMessage(baseMessage)\n const eventName = `${baseEventName}/${channel}`\n\n const channelState = this._getChannelState(channel)\n\n if (channelState) {\n this._setChannelState(channel, {\n ...channelState,\n userState: message.tags,\n })\n }\n return [eventName, message]\n }\n\n case Events.ROOM_STATE: {\n const message = parsers.roomStateMessage(baseMessage)\n const eventName = `${baseEventName}/${channel}`\n\n this._setChannelState(channel, {\n ...this._getChannelState(channel),\n roomState: message,\n })\n return [eventName, message]\n }\n\n case Events.NOTICE: {\n const message = parsers.noticeMessage(baseMessage)\n const eventName = `${baseEventName}/${message.event}/${channel}`\n return [eventName, message]\n }\n\n case Events.USER_NOTICE: {\n const message = parsers.userNoticeMessage(baseMessage)\n const eventName = `${baseEventName}/${message.event}/${channel}`\n return [eventName, message]\n }\n\n case Events.PRIVATE_MESSAGE: {\n const message = parsers.privateMessage(baseMessage)\n const eventName = `${baseEventName}/${message.event}/${channel}`\n return [eventName, message]\n }\n\n default: {\n const eventName = channel\n ? `${baseEventName}/${channel}`\n : baseEventName\n return [eventName, baseMessage]\n }\n }\n }\n\n private _emit(eventName: string, message: Messages) {\n try {\n if (eventName) {\n this._log.info(message, eventName)\n\n const events = uniq(eventName.split('/'))\n\n events\n .filter((part) => part !== '#')\n .reduce<string[]>((parents, part) => {\n const eventParts = [...parents, part]\n const eventCompound = eventParts.join('/')\n if (eventParts.length > 1) {\n super.emit(part, message)\n }\n super.emit(eventCompound, message)\n return eventParts\n }, [])\n }\n\n // Emit message under the ALL `*` event.\n super.emit(Events.ALL, message)\n } catch (error) {\n /**\n * Catch external implementation errors.\n */\n this._log.error(\n '\\n' +\n `While attempting to handle the ${message.command} event, an ` +\n 'error occurred in your implementation. To avoid seeing this ' +\n 'message, please resolve the error:\\n' +\n '\\n' +\n `${error.stack}\\n` +\n '\\n' +\n 'Parsed messages:\\n' +\n JSON.stringify(message),\n )\n\n this.emit(ClientEvents.ERROR_ENCOUNTERED, error)\n }\n }\n}\n\nexport default Chat\n","var toFinite = require('./toFinite');\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\nmodule.exports = toInteger;\n","var arrayMap = require('./_arrayMap');\n\n/**\n * The base implementation of `_.values` and `_.valuesIn` which creates an\n * array of `object` property values corresponding to the property names\n * of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the array of property values.\n */\nfunction baseValues(object, props) {\n return arrayMap(props, function(key) {\n return object[key];\n });\n}\n\nmodule.exports = baseValues;\n","var baseValues = require('./_baseValues'),\n keys = require('./keys');\n\n/**\n * Creates an array of the own enumerable string keyed property values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.values(new Foo);\n * // => [1, 2] (iteration order is not guaranteed)\n *\n * _.values('hi');\n * // => ['h', 'i']\n */\nfunction values(object) {\n return object == null ? [] : baseValues(object, keys(object));\n}\n\nmodule.exports = values;\n","var baseIndexOf = require('./_baseIndexOf'),\n isArrayLike = require('./isArrayLike'),\n isString = require('./isString'),\n toInteger = require('./toInteger'),\n values = require('./values');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Checks if `value` is in `collection`. If `collection` is a string, it's\n * checked for a substring of `value`, otherwise\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * is used for equality comparisons. If `fromIndex` is negative, it's used as\n * the offset from the end of `collection`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {boolean} Returns `true` if `value` is found, else `false`.\n * @example\n *\n * _.includes([1, 2, 3], 1);\n * // => true\n *\n * _.includes([1, 2, 3], 1, 2);\n * // => false\n *\n * _.includes({ 'a': 1, 'b': 2 }, 1);\n * // => true\n *\n * _.includes('abcd', 'bc');\n * // => true\n */\nfunction includes(collection, value, fromIndex, guard) {\n collection = isArrayLike(collection) ? collection : values(collection);\n fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n var length = collection.length;\n if (fromIndex < 0) {\n fromIndex = nativeMax(length + fromIndex, 0);\n }\n return isString(collection)\n ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n}\n\nmodule.exports = includes;\n","var __self__ = (function (root) {\nfunction F() {\nthis.fetch = false;\nthis.DOMException = root.DOMException\n}\nF.prototype = root;\nreturn new F();\n})(typeof self !== 'undefined' ? self : this);\n(function(self) {\n\nvar irrelevant = (function (exports) {\n\n var support = {\n searchParams: 'URLSearchParams' in self,\n iterable: 'Symbol' in self && 'iterator' in Symbol,\n blob:\n 'FileReader' in self &&\n 'Blob' in self &&\n (function() {\n try {\n new Blob();\n return true\n } catch (e) {\n return false\n }\n })(),\n formData: 'FormData' in self,\n arrayBuffer: 'ArrayBuffer' in self\n };\n\n function isDataView(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n }\n\n if (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ];\n\n var isArrayBufferView =\n ArrayBuffer.isView ||\n function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n };\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name);\n }\n if (/[^a-z0-9\\-#$%&'*+.^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value);\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift();\n return {done: value === undefined, value: value}\n }\n };\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n };\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {};\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value);\n }, this);\n } else if (Array.isArray(headers)) {\n headers.forEach(function(header) {\n this.append(header[0], header[1]);\n }, this);\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name]);\n }, this);\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name);\n value = normalizeValue(value);\n var oldValue = this.map[name];\n this.map[name] = oldValue ? oldValue + ', ' + value : value;\n };\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)];\n };\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name);\n return this.has(name) ? this.map[name] : null\n };\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n };\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value);\n };\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this);\n }\n }\n };\n\n Headers.prototype.keys = function() {\n var items = [];\n this.forEach(function(value, name) {\n items.push(name);\n });\n return iteratorFor(items)\n };\n\n Headers.prototype.values = function() {\n var items = [];\n this.forEach(function(value) {\n items.push(value);\n });\n return iteratorFor(items)\n };\n\n Headers.prototype.entries = function() {\n var items = [];\n this.forEach(function(value, name) {\n items.push([name, value]);\n });\n return iteratorFor(items)\n };\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries;\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true;\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result);\n };\n reader.onerror = function() {\n reject(reader.error);\n };\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader();\n var promise = fileReaderReady(reader);\n reader.readAsArrayBuffer(blob);\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader();\n var promise = fileReaderReady(reader);\n reader.readAsText(blob);\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf);\n var chars = new Array(view.length);\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i]);\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength);\n view.set(new Uint8Array(buf));\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false;\n\n this._initBody = function(body) {\n this._bodyInit = body;\n if (!body) {\n this._bodyText = '';\n } else if (typeof body === 'string') {\n this._bodyText = body;\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body;\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body;\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString();\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer);\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer]);\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body);\n } else {\n this._bodyText = body = Object.prototype.toString.call(body);\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8');\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type);\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n }\n };\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this);\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n };\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n };\n }\n\n this.text = function() {\n var rejected = consumed(this);\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n };\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n };\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n };\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'];\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase();\n return methods.indexOf(upcased) > -1 ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {};\n var body = options.body;\n\n if (input instanceof Request) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url;\n this.credentials = input.credentials;\n if (!options.headers) {\n this.headers = new Headers(input.headers);\n }\n this.method = input.method;\n this.mode = input.mode;\n this.signal = input.signal;\n if (!body && input._bodyInit != null) {\n body = input._bodyInit;\n input.bodyUsed = true;\n }\n } else {\n this.url = String(input);\n }\n\n this.credentials = options.credentials || this.credentials || 'same-origin';\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers);\n }\n this.method = normalizeMethod(options.method || this.method || 'GET');\n this.mode = options.mode || this.mode || null;\n this.signal = options.signal || this.signal;\n this.referrer = null;\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body);\n }\n\n Request.prototype.clone = function() {\n return new Request(this, {body: this._bodyInit})\n };\n\n function decode(body) {\n var form = new FormData();\n body\n .trim()\n .split('&')\n .forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=');\n var name = split.shift().replace(/\\+/g, ' ');\n var value = split.join('=').replace(/\\+/g, ' ');\n form.append(decodeURIComponent(name), decodeURIComponent(value));\n }\n });\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers();\n // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n // https://tools.ietf.org/html/rfc7230#section-3.2\n var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ');\n preProcessedHeaders.split(/\\r?\\n/).forEach(function(line) {\n var parts = line.split(':');\n var key = parts.shift().trim();\n if (key) {\n var value = parts.join(':').trim();\n headers.append(key, value);\n }\n });\n return headers\n }\n\n Body.call(Request.prototype);\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {};\n }\n\n this.type = 'default';\n this.status = options.status === undefined ? 200 : options.status;\n this.ok = this.status >= 200 && this.status < 300;\n this.statusText = 'statusText' in options ? options.statusText : 'OK';\n this.headers = new Headers(options.headers);\n this.url = options.url || '';\n this._initBody(bodyInit);\n }\n\n Body.call(Response.prototype);\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n };\n\n Response.error = function() {\n var response = new Response(null, {status: 0, statusText: ''});\n response.type = 'error';\n return response\n };\n\n var redirectStatuses = [301, 302, 303, 307, 308];\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n };\n\n exports.DOMException = self.DOMException;\n try {\n new exports.DOMException();\n } catch (err) {\n exports.DOMException = function(message, name) {\n this.message = message;\n this.name = name;\n var error = Error(message);\n this.stack = error.stack;\n };\n exports.DOMException.prototype = Object.create(Error.prototype);\n exports.DOMException.prototype.constructor = exports.DOMException;\n }\n\n function fetch(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init);\n\n if (request.signal && request.signal.aborted) {\n return reject(new exports.DOMException('Aborted', 'AbortError'))\n }\n\n var xhr = new XMLHttpRequest();\n\n function abortXhr() {\n xhr.abort();\n }\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n };\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL');\n var body = 'response' in xhr ? xhr.response : xhr.responseText;\n resolve(new Response(body, options));\n };\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'));\n };\n\n xhr.ontimeout = function() {\n reject(new TypeError('Network request failed'));\n };\n\n xhr.onabort = function() {\n reject(new exports.DOMException('Aborted', 'AbortError'));\n };\n\n xhr.open(request.method, request.url, true);\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true;\n } else if (request.credentials === 'omit') {\n xhr.withCredentials = false;\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob';\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value);\n });\n\n if (request.signal) {\n request.signal.addEventListener('abort', abortXhr);\n\n xhr.onreadystatechange = function() {\n // DONE (success or failure)\n if (xhr.readyState === 4) {\n request.signal.removeEventListener('abort', abortXhr);\n }\n };\n }\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit);\n })\n }\n\n fetch.polyfill = true;\n\n if (!self.fetch) {\n self.fetch = fetch;\n self.Headers = Headers;\n self.Request = Request;\n self.Response = Response;\n }\n\n exports.Headers = Headers;\n exports.Request = Request;\n exports.Response = Response;\n exports.fetch = fetch;\n\n return exports;\n\n}({}));\n})(__self__);\ndelete __self__.fetch.polyfill\nexports = __self__.fetch // To enable: import fetch from 'cross-fetch'\nexports.default = __self__.fetch // For TypeScript consumers without esModuleInterop.\nexports.fetch = __self__.fetch // To enable: import {fetch} from 'cross-fetch'\nexports.Headers = __self__.Headers\nexports.Request = __self__.Request\nexports.Response = __self__.Response\nmodule.exports = exports\n","let FormData;\n\nif (typeof global !== 'undefined' && typeof global.FormData !== 'undefined') {\n FormData = global.FormData;\n} else if (typeof window !== 'undefined' && typeof window.FormData !== 'undefined') {\n FormData = window.FormData;\n} else if (typeof self !== 'undefined' && typeof self.FormData !== 'undefined') {\n FormData = self.FormData;\n}\n\nmodule.exports = FormData;\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty;\nvar isArray = Array.isArray;\n\nvar hexTable = (function () {\n var array = [];\n for (var i = 0; i < 256; ++i) {\n array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase());\n }\n\n return array;\n}());\n\nvar compactQueue = function compactQueue(queue) {\n while (queue.length > 1) {\n var item = queue.pop();\n var obj = item.obj[item.prop];\n\n if (isArray(obj)) {\n var compacted = [];\n\n for (var j = 0; j < obj.length; ++j) {\n if (typeof obj[j] !== 'undefined') {\n compacted.push(obj[j]);\n }\n }\n\n item.obj[item.prop] = compacted;\n }\n }\n};\n\nvar arrayToObject = function arrayToObject(source, options) {\n var obj = options && options.plainObjects ? Object.create(null) : {};\n for (var i = 0; i < source.length; ++i) {\n if (typeof source[i] !== 'undefined') {\n obj[i] = source[i];\n }\n }\n\n return obj;\n};\n\nvar merge = function merge(target, source, options) {\n /* eslint no-param-reassign: 0 */\n if (!source) {\n return target;\n }\n\n if (typeof source !== 'object') {\n if (isArray(target)) {\n target.push(source);\n } else if (target && typeof target === 'object') {\n if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) {\n target[source] = true;\n }\n } else {\n return [target, source];\n }\n\n return target;\n }\n\n if (!target || typeof target !== 'object') {\n return [target].concat(source);\n }\n\n var mergeTarget = target;\n if (isArray(target) && !isArray(source)) {\n mergeTarget = arrayToObject(target, options);\n }\n\n if (isArray(target) && isArray(source)) {\n source.forEach(function (item, i) {\n if (has.call(target, i)) {\n var targetItem = target[i];\n if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') {\n target[i] = merge(targetItem, item, options);\n } else {\n target.push(item);\n }\n } else {\n target[i] = item;\n }\n });\n return target;\n }\n\n return Object.keys(source).reduce(function (acc, key) {\n var value = source[key];\n\n if (has.call(acc, key)) {\n acc[key] = merge(acc[key], value, options);\n } else {\n acc[key] = value;\n }\n return acc;\n }, mergeTarget);\n};\n\nvar assign = function assignSingleSource(target, source) {\n return Object.keys(source).reduce(function (acc, key) {\n acc[key] = source[key];\n return acc;\n }, target);\n};\n\nvar decode = function (str, decoder, charset) {\n var strWithoutPlus = str.replace(/\\+/g, ' ');\n if (charset === 'iso-8859-1') {\n // unescape never throws, no try...catch needed:\n return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape);\n }\n // utf-8\n try {\n return decodeURIComponent(strWithoutPlus);\n } catch (e) {\n return strWithoutPlus;\n }\n};\n\nvar encode = function encode(str, defaultEncoder, charset) {\n // This code was originally written by Brian White (mscdex) for the io.js core querystring library.\n // It has been adapted here for stricter adherence to RFC 3986\n if (str.length === 0) {\n return str;\n }\n\n var string = str;\n if (typeof str === 'symbol') {\n string = Symbol.prototype.toString.call(str);\n } else if (typeof str !== 'string') {\n string = String(str);\n }\n\n if (charset === 'iso-8859-1') {\n return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) {\n return '%26%23' + parseInt($0.slice(2), 16) + '%3B';\n });\n }\n\n var out = '';\n for (var i = 0; i < string.length; ++i) {\n var c = string.charCodeAt(i);\n\n if (\n c === 0x2D // -\n || c === 0x2E // .\n || c === 0x5F // _\n || c === 0x7E // ~\n || (c >= 0x30 && c <= 0x39) // 0-9\n || (c >= 0x41 && c <= 0x5A) // a-z\n || (c >= 0x61 && c <= 0x7A) // A-Z\n ) {\n out += string.charAt(i);\n continue;\n }\n\n if (c < 0x80) {\n out = out + hexTable[c];\n continue;\n }\n\n if (c < 0x800) {\n out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);\n continue;\n }\n\n if (c < 0xD800 || c >= 0xE000) {\n out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);\n continue;\n }\n\n i += 1;\n c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));\n out += hexTable[0xF0 | (c >> 18)]\n + hexTable[0x80 | ((c >> 12) & 0x3F)]\n + hexTable[0x80 | ((c >> 6) & 0x3F)]\n + hexTable[0x80 | (c & 0x3F)];\n }\n\n return out;\n};\n\nvar compact = function compact(value) {\n var queue = [{ obj: { o: value }, prop: 'o' }];\n var refs = [];\n\n for (var i = 0; i < queue.length; ++i) {\n var item = queue[i];\n var obj = item.obj[item.prop];\n\n var keys = Object.keys(obj);\n for (var j = 0; j < keys.length; ++j) {\n var key = keys[j];\n var val = obj[key];\n if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {\n queue.push({ obj: obj, prop: key });\n refs.push(val);\n }\n }\n }\n\n compactQueue(queue);\n\n return value;\n};\n\nvar isRegExp = function isRegExp(obj) {\n return Object.prototype.toString.call(obj) === '[object RegExp]';\n};\n\nvar isBuffer = function isBuffer(obj) {\n if (!obj || typeof obj !== 'object') {\n return false;\n }\n\n return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));\n};\n\nvar combine = function combine(a, b) {\n return [].concat(a, b);\n};\n\nvar maybeMap = function maybeMap(val, fn) {\n if (isArray(val)) {\n var mapped = [];\n for (var i = 0; i < val.length; i += 1) {\n mapped.push(fn(val[i]));\n }\n return mapped;\n }\n return fn(val);\n};\n\nmodule.exports = {\n arrayToObject: arrayToObject,\n assign: assign,\n combine: combine,\n compact: compact,\n decode: decode,\n encode: encode,\n isBuffer: isBuffer,\n isRegExp: isRegExp,\n maybeMap: maybeMap,\n merge: merge\n};\n","'use strict';\n\nvar replace = String.prototype.replace;\nvar percentTwenties = /%20/g;\n\nvar util = require('./utils');\n\nvar Format = {\n RFC1738: 'RFC1738',\n RFC3986: 'RFC3986'\n};\n\nmodule.exports = util.assign(\n {\n 'default': Format.RFC3986,\n formatters: {\n RFC1738: function (value) {\n return replace.call(value, percentTwenties, '+');\n },\n RFC3986: function (value) {\n return String(value);\n }\n }\n },\n Format\n);\n","'use strict';\n\nvar utils = require('./utils');\nvar formats = require('./formats');\nvar has = Object.prototype.hasOwnProperty;\n\nvar arrayPrefixGenerators = {\n brackets: function brackets(prefix) {\n return prefix + '[]';\n },\n comma: 'comma',\n indices: function indices(prefix, key) {\n return prefix + '[' + key + ']';\n },\n repeat: function repeat(prefix) {\n return prefix;\n }\n};\n\nvar isArray = Array.isArray;\nvar push = Array.prototype.push;\nvar pushToArray = function (arr, valueOrArray) {\n push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]);\n};\n\nvar toISO = Date.prototype.toISOString;\n\nvar defaultFormat = formats['default'];\nvar defaults = {\n addQueryPrefix: false,\n allowDots: false,\n charset: 'utf-8',\n charsetSentinel: false,\n delimiter: '&',\n encode: true,\n encoder: utils.encode,\n encodeValuesOnly: false,\n format: defaultFormat,\n formatter: formats.formatters[defaultFormat],\n // deprecated\n indices: false,\n serializeDate: function serializeDate(date) {\n return toISO.call(date);\n },\n skipNulls: false,\n strictNullHandling: false\n};\n\nvar isNonNullishPrimitive = function isNonNullishPrimitive(v) {\n return typeof v === 'string'\n || typeof v === 'number'\n || typeof v === 'boolean'\n || typeof v === 'symbol'\n || typeof v === 'bigint';\n};\n\nvar stringify = function stringify(\n object,\n prefix,\n generateArrayPrefix,\n strictNullHandling,\n skipNulls,\n encoder,\n filter,\n sort,\n allowDots,\n serializeDate,\n formatter,\n encodeValuesOnly,\n charset\n) {\n var obj = object;\n if (typeof filter === 'function') {\n obj = filter(prefix, obj);\n } else if (obj instanceof Date) {\n obj = serializeDate(obj);\n } else if (generateArrayPrefix === 'comma' && isArray(obj)) {\n obj = utils.maybeMap(obj, function (value) {\n if (value instanceof Date) {\n return serializeDate(value);\n }\n return value;\n }).join(',');\n }\n\n if (obj === null) {\n if (strictNullHandling) {\n return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset, 'key') : prefix;\n }\n\n obj = '';\n }\n\n if (isNonNullishPrimitive(obj) || utils.isBuffer(obj)) {\n if (encoder) {\n var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset, 'key');\n return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset, 'value'))];\n }\n return [formatter(prefix) + '=' + formatter(String(obj))];\n }\n\n var values = [];\n\n if (typeof obj === 'undefined') {\n return values;\n }\n\n var objKeys;\n if (isArray(filter)) {\n objKeys = filter;\n } else {\n var keys = Object.keys(obj);\n objKeys = sort ? keys.sort(sort) : keys;\n }\n\n for (var i = 0; i < objKeys.length; ++i) {\n var key = objKeys[i];\n var value = obj[key];\n\n if (skipNulls && value === null) {\n continue;\n }\n\n var keyPrefix = isArray(obj)\n ? typeof generateArrayPrefix === 'function' ? generateArrayPrefix(prefix, key) : prefix\n : prefix + (allowDots ? '.' + key : '[' + key + ']');\n\n pushToArray(values, stringify(\n value,\n keyPrefix,\n generateArrayPrefix,\n strictNullHandling,\n skipNulls,\n encoder,\n filter,\n sort,\n allowDots,\n serializeDate,\n formatter,\n encodeValuesOnly,\n charset\n ));\n }\n\n return values;\n};\n\nvar normalizeStringifyOptions = function normalizeStringifyOptions(opts) {\n if (!opts) {\n return defaults;\n }\n\n if (opts.encoder !== null && opts.encoder !== undefined && typeof opts.encoder !== 'function') {\n throw new TypeError('Encoder has to be a function.');\n }\n\n var charset = opts.charset || defaults.charset;\n if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {\n throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');\n }\n\n var format = formats['default'];\n if (typeof opts.format !== 'undefined') {\n if (!has.call(formats.formatters, opts.format)) {\n throw new TypeError('Unknown format option provided.');\n }\n format = opts.format;\n }\n var formatter = formats.formatters[format];\n\n var filter = defaults.filter;\n if (typeof opts.filter === 'function' || isArray(opts.filter)) {\n filter = opts.filter;\n }\n\n return {\n addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix,\n allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots,\n charset: charset,\n charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,\n delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter,\n encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode,\n encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder,\n encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly,\n filter: filter,\n formatter: formatter,\n serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate,\n skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls,\n sort: typeof opts.sort === 'function' ? opts.sort : null,\n strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling\n };\n};\n\nmodule.exports = function (object, opts) {\n var obj = object;\n var options = normalizeStringifyOptions(opts);\n\n var objKeys;\n var filter;\n\n if (typeof options.filter === 'function') {\n filter = options.filter;\n obj = filter('', obj);\n } else if (isArray(options.filter)) {\n filter = options.filter;\n objKeys = filter;\n }\n\n var keys = [];\n\n if (typeof obj !== 'object' || obj === null) {\n return '';\n }\n\n var arrayFormat;\n if (opts && opts.arrayFormat in arrayPrefixGenerators) {\n arrayFormat = opts.arrayFormat;\n } else if (opts && 'indices' in opts) {\n arrayFormat = opts.indices ? 'indices' : 'repeat';\n } else {\n arrayFormat = 'indices';\n }\n\n var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];\n\n if (!objKeys) {\n objKeys = Object.keys(obj);\n }\n\n if (options.sort) {\n objKeys.sort(options.sort);\n }\n\n for (var i = 0; i < objKeys.length; ++i) {\n var key = objKeys[i];\n\n if (options.skipNulls && obj[key] === null) {\n continue;\n }\n pushToArray(keys, stringify(\n obj[key],\n key,\n generateArrayPrefix,\n options.strictNullHandling,\n options.skipNulls,\n options.encode ? options.encoder : null,\n options.filter,\n options.sort,\n options.allowDots,\n options.serializeDate,\n options.formatter,\n options.encodeValuesOnly,\n options.charset\n ));\n }\n\n var joined = keys.join(options.delimiter);\n var prefix = options.addQueryPrefix === true ? '?' : '';\n\n if (options.charsetSentinel) {\n if (options.charset === 'iso-8859-1') {\n // encodeURIComponent('✓'), the \"numeric entity\" representation of a checkmark\n prefix += 'utf8=%26%2310003%3B&';\n } else {\n // encodeURIComponent('✓')\n prefix += 'utf8=%E2%9C%93&';\n }\n }\n\n return joined.length > 0 ? prefix + joined : '';\n};\n","'use strict';\n\nvar utils = require('./utils');\n\nvar has = Object.prototype.hasOwnProperty;\nvar isArray = Array.isArray;\n\nvar defaults = {\n allowDots: false,\n allowPrototypes: false,\n arrayLimit: 20,\n charset: 'utf-8',\n charsetSentinel: false,\n comma: false,\n decoder: utils.decode,\n delimiter: '&',\n depth: 5,\n ignoreQueryPrefix: false,\n interpretNumericEntities: false,\n parameterLimit: 1000,\n parseArrays: true,\n plainObjects: false,\n strictNullHandling: false\n};\n\nvar interpretNumericEntities = function (str) {\n return str.replace(/&#(\\d+);/g, function ($0, numberStr) {\n return String.fromCharCode(parseInt(numberStr, 10));\n });\n};\n\nvar parseArrayValue = function (val, options) {\n if (val && typeof val === 'string' && options.comma && val.indexOf(',') > -1) {\n return val.split(',');\n }\n\n return val;\n};\n\n// This is what browsers will submit when the ✓ character occurs in an\n// application/x-www-form-urlencoded body and the encoding of the page containing\n// the form is iso-8859-1, or when the submitted form has an accept-charset\n// attribute of iso-8859-1. Presumably also with other charsets that do not contain\n// the ✓ character, such as us-ascii.\nvar isoSentinel = 'utf8=%26%2310003%3B'; // encodeURIComponent('✓')\n\n// These are the percent-encoded utf-8 octets representing a checkmark, indicating that the request actually is utf-8 encoded.\nvar charsetSentinel = 'utf8=%E2%9C%93'; // encodeURIComponent('✓')\n\nvar parseValues = function parseQueryStringValues(str, options) {\n var obj = {};\n var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\\?/, '') : str;\n var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit;\n var parts = cleanStr.split(options.delimiter, limit);\n var skipIndex = -1; // Keep track of where the utf8 sentinel was found\n var i;\n\n var charset = options.charset;\n if (options.charsetSentinel) {\n for (i = 0; i < parts.length; ++i) {\n if (parts[i].indexOf('utf8=') === 0) {\n if (parts[i] === charsetSentinel) {\n charset = 'utf-8';\n } else if (parts[i] === isoSentinel) {\n charset = 'iso-8859-1';\n }\n skipIndex = i;\n i = parts.length; // The eslint settings do not allow break;\n }\n }\n }\n\n for (i = 0; i < parts.length; ++i) {\n if (i === skipIndex) {\n continue;\n }\n var part = parts[i];\n\n var bracketEqualsPos = part.indexOf(']=');\n var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1;\n\n var key, val;\n if (pos === -1) {\n key = options.decoder(part, defaults.decoder, charset, 'key');\n val = options.strictNullHandling ? null : '';\n } else {\n key = options.decoder(part.slice(0, pos), defaults.decoder, charset, 'key');\n val = utils.maybeMap(\n parseArrayValue(part.slice(pos + 1), options),\n function (encodedVal) {\n return options.decoder(encodedVal, defaults.decoder, charset, 'value');\n }\n );\n }\n\n if (val && options.interpretNumericEntities && charset === 'iso-8859-1') {\n val = interpretNumericEntities(val);\n }\n\n if (part.indexOf('[]=') > -1) {\n val = isArray(val) ? [val] : val;\n }\n\n if (has.call(obj, key)) {\n obj[key] = utils.combine(obj[key], val);\n } else {\n obj[key] = val;\n }\n }\n\n return obj;\n};\n\nvar parseObject = function (chain, val, options, valuesParsed) {\n var leaf = valuesParsed ? val : parseArrayValue(val, options);\n\n for (var i = chain.length - 1; i >= 0; --i) {\n var obj;\n var root = chain[i];\n\n if (root === '[]' && options.parseArrays) {\n obj = [].concat(leaf);\n } else {\n obj = options.plainObjects ? Object.create(null) : {};\n var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root;\n var index = parseInt(cleanRoot, 10);\n if (!options.parseArrays && cleanRoot === '') {\n obj = { 0: leaf };\n } else if (\n !isNaN(index)\n && root !== cleanRoot\n && String(index) === cleanRoot\n && index >= 0\n && (options.parseArrays && index <= options.arrayLimit)\n ) {\n obj = [];\n obj[index] = leaf;\n } else {\n obj[cleanRoot] = leaf;\n }\n }\n\n leaf = obj; // eslint-disable-line no-param-reassign\n }\n\n return leaf;\n};\n\nvar parseKeys = function parseQueryStringKeys(givenKey, val, options, valuesParsed) {\n if (!givenKey) {\n return;\n }\n\n // Transform dot notation to bracket notation\n var key = options.allowDots ? givenKey.replace(/\\.([^.[]+)/g, '[$1]') : givenKey;\n\n // The regex chunks\n\n var brackets = /(\\[[^[\\]]*])/;\n var child = /(\\[[^[\\]]*])/g;\n\n // Get the parent\n\n var segment = options.depth > 0 && brackets.exec(key);\n var parent = segment ? key.slice(0, segment.index) : key;\n\n // Stash the parent if it exists\n\n var keys = [];\n if (parent) {\n // If we aren't using plain objects, optionally prefix keys that would overwrite object prototype properties\n if (!options.plainObjects && has.call(Object.prototype, parent)) {\n if (!options.allowPrototypes) {\n return;\n }\n }\n\n keys.push(parent);\n }\n\n // Loop through children appending to the array until we hit depth\n\n var i = 0;\n while (options.depth > 0 && (segment = child.exec(key)) !== null && i < options.depth) {\n i += 1;\n if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) {\n if (!options.allowPrototypes) {\n return;\n }\n }\n keys.push(segment[1]);\n }\n\n // If there's a remainder, just add whatever is left\n\n if (segment) {\n keys.push('[' + key.slice(segment.index) + ']');\n }\n\n return parseObject(keys, val, options, valuesParsed);\n};\n\nvar normalizeParseOptions = function normalizeParseOptions(opts) {\n if (!opts) {\n return defaults;\n }\n\n if (opts.decoder !== null && opts.decoder !== undefined && typeof opts.decoder !== 'function') {\n throw new TypeError('Decoder has to be a function.');\n }\n\n if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {\n throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');\n }\n var charset = typeof opts.charset === 'undefined' ? defaults.charset : opts.charset;\n\n return {\n allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots,\n allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults.allowPrototypes,\n arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults.arrayLimit,\n charset: charset,\n charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,\n comma: typeof opts.comma === 'boolean' ? opts.comma : defaults.comma,\n decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults.decoder,\n delimiter: typeof opts.delimiter === 'string' || utils.isRegExp(opts.delimiter) ? opts.delimiter : defaults.delimiter,\n // eslint-disable-next-line no-implicit-coercion, no-extra-parens\n depth: (typeof opts.depth === 'number' || opts.depth === false) ? +opts.depth : defaults.depth,\n ignoreQueryPrefix: opts.ignoreQueryPrefix === true,\n interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults.interpretNumericEntities,\n parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults.parameterLimit,\n parseArrays: opts.parseArrays !== false,\n plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults.plainObjects,\n strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling\n };\n};\n\nmodule.exports = function (str, opts) {\n var options = normalizeParseOptions(opts);\n\n if (str === '' || str === null || typeof str === 'undefined') {\n return options.plainObjects ? Object.create(null) : {};\n }\n\n var tempObj = typeof str === 'string' ? parseValues(str, options) : str;\n var obj = options.plainObjects ? Object.create(null) : {};\n\n // Iterate over the keys and setup the new object\n\n var keys = Object.keys(tempObj);\n for (var i = 0; i < keys.length; ++i) {\n var key = keys[i];\n var newObj = parseKeys(key, tempObj[key], options, typeof str === 'string');\n obj = utils.merge(obj, newObj, options);\n }\n\n return utils.compact(obj);\n};\n","import BaseError from '../BaseError'\n\nclass FetchError extends BaseError {\n ok: Response['ok']\n status: Response['status']\n statusText: Response['statusText']\n url: Response['url']\n body: any\n\n constructor(response: Response, json: any) {\n const message = json?.message || `${response.url} ${response.statusText}`\n super(message)\n\n Object.setPrototypeOf(this, FetchError.prototype)\n\n this.ok = false\n this.status = response.status\n this.statusText = response.statusText\n this.url = response.url\n this.body = json\n }\n}\n\nexport default FetchError\n","/**\n * Checks if `value` is `undefined`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n * @example\n *\n * _.isUndefined(void 0);\n * // => true\n *\n * _.isUndefined(null);\n * // => false\n */\nfunction isUndefined(value) {\n return value === undefined;\n}\n\nmodule.exports = isUndefined;\n","import { ApiVersions } from '../twitch'\n\nimport { FetchOptions } from '../utils/fetch'\nimport { LoggerOptions } from '../utils/logger'\n\nexport type ApiOptions = {\n token: string\n clientId?: string\n log?: LoggerOptions\n onAuthenticationFailure?: () => Promise<string>\n}\n\nexport enum ApiReadyStates {\n 'NOT_READY',\n 'READY',\n 'INITIALIZED',\n}\n\nexport type ApiSettings = {\n baseUrl: string\n authorizationHeader: string\n}\n\nexport const Settings: Record<ApiVersions, ApiSettings> = {\n [ApiVersions.Helix]: {\n baseUrl: 'https://api.twitch.tv/helix',\n authorizationHeader: 'Bearer',\n },\n [ApiVersions.Kraken]: {\n baseUrl: 'https://api.twitch.tv/kraken',\n authorizationHeader: 'OAuth',\n },\n}\n\nexport type ApiHeaders = Record<string, string> & {\n 'Client-ID'?: string\n Accept?: string\n Authorization?: string\n}\n\ntype ApiVersionOptions = {\n version?: ApiVersions\n}\n\nexport type ApiFetchOptions = FetchOptions & ApiVersionOptions\n","import invariant from 'invariant'\n\nimport conformsTo from 'lodash/conformsTo'\nimport defaults from 'lodash/defaults'\nimport isFunction from 'lodash/isFunction'\nimport isString from 'lodash/isString'\nimport isUndefined from 'lodash/isUndefined'\n\nimport { ApiOptions } from '../types'\n\nexport const apiOptions = (options: Partial<ApiOptions>): ApiOptions => {\n const shape = {\n token: isString,\n clientId: (clientId: unknown) =>\n isString(clientId) || isUndefined(clientId),\n onAuthenticationFailure: (cb: unknown) => isFunction(cb) || isUndefined(cb),\n }\n\n options = defaults(options, {\n clientId: undefined,\n onAuthenticationFailure: undefined,\n })\n\n invariant(conformsTo(options, shape), 'Expected valid options')\n\n return options as ApiOptions\n}\n","import invariant from 'invariant'\nimport isEmpty from 'lodash/isEmpty'\nimport includes from 'lodash/includes'\nimport toLower from 'lodash/toLower'\nimport toUpper from 'lodash/toUpper'\n\nimport { ApiRootResponse, ApiVersions } from '../twitch'\n\nimport createLogger, { Logger } from '../utils/logger'\nimport fetchUtil, { FetchError } from '../utils/fetch'\n\nimport * as validators from './utils/validators'\n\nimport {\n ApiOptions,\n ApiReadyStates,\n ApiFetchOptions,\n Settings,\n ApiHeaders,\n} from './types'\n\n/**\n * Make requests to Twitch API.\n *\n * ## Initializing\n *\n * ```js\n * // With a token ...\n * const token = 'cfabdegwdoklmawdzdo98xt2fo512y'\n * const { api } = new TwitchJs({ token })\n *\n * // ... or with a client ID ...\n * const clientId = 'uo6dggojyb8d6soh92zknwmi5ej1q2'\n * const { api } = new TwitchJs({ clientId })\n * ```\n *\n * **Note:** The recommended way to initialize the API client is with a token.\n *\n * ## Making requests\n *\n * By default, the API client makes requests to the\n * [Helix API](https://dev.twitch.tv/docs/api), and exposes [[Api.get]],\n * [[Api.post]] and [[Api.put]] methods. Query string parameters and body\n * parameters are provided via `options.search` and `options.body` properties,\n * respectively.\n *\n * To make requests to the [Kraken/v5 API](https://dev.twitch.tv/docs/v5), use\n * `options.version = 'kraken'`\n *\n * ### Examples\n *\n * #### Get bits leaderboard\n * ```js\n * api\n * .get('bits/leaderboard', { search: { user_id: '44322889' } })\n * .then(response => {\n * // Do stuff with response ...\n * })\n * ```\n *\n * #### Get the latest Overwatch live streams\n * ```\n * api\n * .get('streams', { version: 'kraken', search: { game: 'Overwatch' } })\n * .then(response => {\n * // Do stuff with response ...\n * })\n * ```\n *\n * #### Start a channel commercial\n * ```\n * const channelId = '44322889'\n * api\n * .post(`channels/${channelId}/commercial`, {\n * version: 'kraken',\n * body: { length: 30 },\n * })\n * .then(response => {\n * // Do stuff with response ...\n * })\n * ```\n */\n\nclass Api {\n private _options: ApiOptions\n private _log: Logger\n\n private _readyState: ApiReadyStates = ApiReadyStates.READY\n\n private _status!: ApiRootResponse\n\n constructor(options: Partial<ApiOptions>) {\n this._options = validators.apiOptions(options)\n\n this._log = createLogger({ name: 'Api', ...this._options.log })\n }\n\n get readyState() {\n return this._readyState\n }\n\n get status() {\n return this._status\n }\n\n /**\n * New client options. To update `token` or `clientId`, use [**api.initialize()**]{@link Api#initialize}.\n */\n updateOptions(options: Partial<ApiOptions>) {\n const { clientId, token } = this._options\n this._options = validators.apiOptions({ ...options, clientId, token })\n }\n\n /**\n * Initialize API client and retrieve status.\n * @see https://dev.twitch.tv/docs/v5/#root-url\n */\n async initialize(newOptions?: Partial<ApiOptions>) {\n if (newOptions) {\n this._options = validators.apiOptions({ ...this._options, ...newOptions })\n }\n\n if (!newOptions && this.readyState === 2) {\n return Promise.resolve()\n }\n\n const statusResponse = await this.get<ApiRootResponse>('', {\n version: ApiVersions.Kraken,\n })\n\n if ('token' in statusResponse) {\n this._readyState = ApiReadyStates.INITIALIZED\n this._status = statusResponse\n }\n\n return statusResponse\n }\n\n /**\n * Check if current credentials include `scope`.\n * @see https://dev.twitch.tv/docs/authentication/#twitch-api-v5\n */\n hasScope(\n /** Scope to check */\n scope: string,\n ): Promise<boolean> {\n return new Promise((resolve, reject) => {\n if (this.readyState !== 2 || !this.status) {\n return reject(false)\n }\n\n return includes(this.status.token.authorization.scopes, scope)\n ? resolve(true)\n : reject(false)\n })\n }\n\n /**\n * GET endpoint.\n *\n * @example <caption>Get Live Overwatch Streams (Kraken)</caption>\n * ```\n * api.get('streams', { version: 'kraken', search: { game: 'Overwatch' } })\n * .then(response => {\n * // Do stuff with response ...\n * })\n * ```\n *\n * @example <caption>Get user follows (Helix)</caption>\n * ```\n * api.get('users/follows', { search: { to_id: '23161357' } })\n * .then(response => {\n * // Do stuff with response ...\n * })\n * ```\n */\n get<T = any>(endpoint = '', options?: ApiFetchOptions) {\n return this._handleFetch<T>(endpoint, options)\n }\n\n /**\n * POST endpoint.\n */\n post<T = any>(endpoint: string, options?: ApiFetchOptions) {\n return this._handleFetch<T>(endpoint, { ...options, method: 'post' })\n }\n\n /**\n * PUT endpoint.\n */\n put<T = any>(endpoint: string, options?: ApiFetchOptions) {\n return this._handleFetch<T>(endpoint, { ...options, method: 'put' })\n }\n\n private _isVersionHelix(version: ApiVersions) {\n return toLower(version) === ApiVersions.Helix\n }\n\n private _getBaseUrl(version: ApiVersions) {\n return Settings[version].baseUrl\n }\n\n private _getHeaders(version: ApiVersions): ApiHeaders {\n const { clientId, token } = this._options\n\n const isHelix = this._isVersionHelix(version)\n\n const headers: ApiHeaders = {}\n\n if (!isHelix) {\n headers['Accept'] = 'application/vnd.twitchtv.v5+json'\n }\n\n if (clientId) {\n headers['Client-ID'] = clientId\n }\n\n if (token) {\n headers[\n 'Authorization'\n ] = `${Settings[version].authorizationHeader} ${token}`\n }\n\n return headers\n }\n\n private async _handleFetch<T = any>(\n maybeUrl = '',\n options: ApiFetchOptions = {},\n ) {\n const { version = ApiVersions.Helix, ...fetchOptions } = options\n\n const baseUrl = this._getBaseUrl(version)\n\n const url = `${baseUrl}/${maybeUrl}`\n\n const message = `${toUpper(fetchOptions.method) || 'GET'} ${url}`\n\n const fetchProfiler = this._log.profile()\n\n const headers = this._getHeaders(version)\n\n const optionHeaders = Object.entries(fetchOptions.headers || {})\n\n for (const [name, value] of optionHeaders) {\n headers[String(name)] = value\n }\n\n const performRequest = () =>\n fetchUtil<T>(url, {\n ...fetchOptions,\n headers,\n })\n\n let caughtError\n try {\n return await performRequest()\n } catch (error) {\n caughtError = error\n if (\n typeof this._options.onAuthenticationFailure === 'function' &&\n error instanceof FetchError &&\n error.status === 401\n ) {\n const token = await this._options.onAuthenticationFailure()\n\n if (token) {\n await this.initialize({ token })\n this._log.info(`${message} ... re-initializing with new token`)\n }\n\n this._log.info(`${message} ... retrying`)\n\n return await performRequest()\n }\n throw error\n } finally {\n fetchProfiler.done(message, caughtError)\n }\n }\n}\n\nexport default Api\n","import fetch from 'cross-fetch'\nimport FormData from 'form-data'\nimport { stringify, IStringifyOptions } from 'qs'\nimport camelCaseKeys from 'camelcase-keys'\n\nimport FetchError from './Error'\n\ntype SearchOption = {\n /** Any query parameters you want to add to your request. */\n search?: { [key: string]: any }\n}\n\ntype HeaderOption = { headers?: Record<string, string> }\n\nexport type FetchOptions = Omit<RequestInit, 'headers'> &\n SearchOption &\n HeaderOption\n\n/**\n * Fetches URL\n */\nconst fetchUtil = async <T = Response>(\n url: RequestInfo,\n options: FetchOptions = {},\n qsOptions?: IStringifyOptions,\n) => {\n const isBodyJson =\n options.body &&\n !(options.body instanceof FormData) &&\n typeof options.body === 'object'\n\n const body = isBodyJson ? JSON.stringify(options.body) : options.body\n\n const headers = isBodyJson\n ? { ...options.headers, 'Content-Type': 'application/json' }\n : options.headers\n\n const search =\n typeof options.search === 'object'\n ? `?${stringify(options.search, qsOptions)}`\n : ''\n\n const fetchOptions = body\n ? {\n ...options,\n method: options.method || 'get',\n headers,\n body,\n }\n : {\n ...options,\n method: options.method || 'get',\n headers,\n }\n\n const response = await fetch(`${url}${search}`, fetchOptions)\n\n const responseJson = await response.json().catch(() => undefined)\n const json = responseJson\n ? camelCaseKeys(responseJson, { deep: true })\n : undefined\n\n if (!response.ok) {\n throw new FetchError(response, json)\n }\n\n if (json) {\n return json as T\n }\n\n return response\n}\n\nexport default fetchUtil\n","import Chat from './Chat'\nimport { ChatOptions } from './Chat/types'\nimport Api from './Api'\nimport { ApiOptions } from './Api/types'\n\nimport { LoggerOptions } from './utils/logger'\n\nexport { Chat }\nexport { Api }\nexport * from './twitch'\n\ntype BaseTwitchJsOptions = {\n clientId?: string\n token?: string\n username?: string\n log?: LoggerOptions\n onAuthenticationFailure?: () => Promise<string>\n}\n\ntype IndividualClassOptions = {\n chat?: ChatOptions\n api?: ApiOptions\n}\n\nexport type TwitchJsOptions = BaseTwitchJsOptions & IndividualClassOptions\n\n/**\n * Interact with chat and make requests to Twitch API.\n *\n * ## Initializing\n * ```\n * const token = 'cfabdegwdoklmawdzdo98xt2fo512y'\n * const username = 'ronni'\n * const twitchJs = new TwitchJs({ token, username })\n *\n * twitchJs.chat.connect().then(globalUserState => {\n * // Do stuff ...\n * })\n *\n * twitchJs.api.get('channel').then(response => {\n * // Do stuff ...\n * })\n * ```\n */\n\nclass TwitchJs {\n chat: Chat\n api: Api\n\n static Chat = Chat\n static Api = Api\n\n constructor(options: TwitchJsOptions) {\n const {\n token,\n username,\n clientId,\n log,\n onAuthenticationFailure,\n chat,\n api,\n } = options\n\n this.chat = new Chat({\n log,\n ...chat,\n token,\n username,\n onAuthenticationFailure,\n })\n\n this.api = new Api({\n log,\n ...api,\n token,\n clientId,\n onAuthenticationFailure,\n })\n }\n\n /**\n * Update client options.\n */\n updateOptions(options: IndividualClassOptions) {\n const { chat, api } = options\n\n if (chat) {\n this.chat.updateOptions(chat)\n }\n\n if (api) {\n this.api.updateOptions(api)\n }\n }\n}\n\nexport default TwitchJs\n"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__extends","__","this","constructor","create","__assign","assign","t","s","i","n","arguments","length","apply","__rest","e","indexOf","getOwnPropertySymbols","propertyIsEnumerable","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","rejected","result","done","then","__generator","body","f","y","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","v","op","TypeError","pop","push","__read","o","m","r","ar","error","__spread","concat","has","prefix","Events","EE","fn","context","once","addListener","emitter","event","listener","evt","_events","_eventsCount","clearEvent","EventEmitter","eventNames","events","name","names","slice","listeners","handlers","l","ee","listenerCount","emit","a1","a2","a3","a4","a5","args","len","removeListener","undefined","j","on","removeAllListeners","off","prefixed","module","createAbortError","Error","createDelay","clearTimeout","defaultClear","setTimeout","set","willResolve","ms","signal","aborted","timeoutId","settle","rejectFn","clear","signalListener","delayPromise","removeEventListener","addEventListener","delay","range","minimum","maximum","options","Math","floor","random","randomInteger","createWithTimers","CancelError","[object Object]","reason","super","isCanceled","PCancelable","userFn","arguments_","onCancel","executor","_cancelHandlers","_isPending","_isCanceled","_rejectOnCancel","_promise","_reject","handler","defineProperties","shouldReject","get","boolean","onFulfilled","onRejected","catch","onFinally","finally","promise","val","err","TimeoutError","message","pTimeout","milliseconds","fallback","Infinity","timer","timeoutError","cancel","pFinally","symbolAsyncIterator","asyncIterator","normalizeEmitter","bind","toArray","isArray","multiple","ret","rejectionEvents","multiArgs","resolveImmediately","count","Number","isInteger","items","onItem","filter","rejectHandler","rejectionEvent","timeout","pEvent","arrayPromise","array","resolutionEvents","limit","isDone","hasPendingError","nextQueue","valueQueue","eventCount","isLimitReached","valueHandler","shift","resolutionEvent","resolveHandler","cancelablePromise","customTimers","global","freeSelf","self","freeGlobal","Function","root","objectProto","nativeObjectToString","toString","symToStringTag","toStringTag","isOwn","tag","unmasked","getRawTag","objectToString","type","uid","isObject","baseGetTag","maskSrcKey","exec","coreJsData","keys","IE_PROTO","func","funcToString","reIsHostCtor","funcProto","reIsNative","RegExp","replace","isMasked","isFunction","test","toSource","object","key","getValue","baseIsNative","getNative","__data__","nativeCreate","size","data","Hash","entries","index","entry","hashClear","hashDelete","hashGet","hashHas","hashSet","other","eq","splice","assocIndexOf","ListCache","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","hash","map","Map","string","isKeyable","getMapData","MapCache","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","SetCache","values","add","setCacheAdd","setCacheHas","predicate","fromIndex","fromRight","strictIndexOf","baseFindIndex","baseIsNaN","baseIndexOf","comparator","cache","forEach","Set","setToArray","noop","iteratee","includes","arrayIncludes","isCommon","seen","arrayIncludesWith","createSet","cacheHas","outer","computed","seenIndex","ApiVersions","Capabilities","MembershipCommands","TagCommands","OtherCommands","BaseCommands","Commands","ChatEvents","ChatCommands","KnownNoticeMessageIds","baseUniq","reduce","uppercase","_a","_c","toUpperCase","PrivateMessageEvents","KnownUserNoticeMessageIds","NoticeEvents","NOTICE","BooleanBadges","NumberBadges","UserNoticeEvents","USER_NOTICE","tryStringify","JSON","stringify","opts","ss","objects","join","argLen","str","a","lastPos","flen","charCodeAt","String","pino","_console","defd","globalThis","defineProperty","configurable","window","pfGlobalThisOrFallback","console","stdSerializers","mapHttpRequest","mock","mapHttpResponse","wrapRequestSerializer","passthrough","wrapResponseSerializer","wrapErrorSerializer","req","res","obj","msg","stack","browser","transmit","send","proto","write","asObject","serializers","serialize","k","stdErrSerialize","fatal","warn","info","debug","trace","enabled","level","logger","log","levels","_level","setOpts","timestamp","getTimeFunction","setMaxListeners","getMaxListeners","prependListener","prependOnceListener","flush","_serialize","_stdErrSerialize","child","bindings","bindingsSerializers","childSerializers","childSerialize","applySerializers","Child","parent","_childLevel","_logEvent","createLogEventShape","getPrototypeOf","levelVal","ts","transmitLevel","transmitValue","methodValue","methodLevel","wrap","argsCloned","time","lvl","format","messages","arg","nullTime","epochTime","Date","now","labels","10","20","30","40","50","60","stdTimeFunctions","unixTime","round","isoTime","toISOString","createLogger","scope","prettyPrint","profile","startMessage","endMessage","ws","WebSocket","MozWebSocket","exports","first","it","_queue","run","element","priority","lower_bound_1","default","item","empty","p_timeout_1","_b","_d","_intervalCount","_intervalEnd","_pendingCount","_resolveEmpty","_resolveIdle","carryoverConcurrencyCount","intervalCap","interval","concurrency","autoStart","queueClass","priority_queue_1","isFinite","_carryoverConcurrencyCount","_isIntervalIgnored","_intervalCap","_interval","_queueClass","_timeout","_throwOnTimeout","throwOnTimeout","_isPaused","_doesIntervalAllowAnother","_doesConcurrentAllowAnother","_concurrency","_tryToStartAnother","_onInterval","_initializeIntervalIfNeeded","_timeoutId","_intervalId","_onResumeInterval","clearInterval","_resolvePromises","canInitializeInterval","_isIntervalPaused","dequeue","setInterval","_processQueue","newConcurrency","enqueue","async","operation","_next","functions","all","function_","existingResolve","pending","isPaused","KEEP_ALIVE_PING_TIMEOUT","BaseError","captureStackTrace","input","output","charCode","fromCharCode","nextBackslash","end","cursor","parseTags","tags","split","tagsLength","helpers_1","unescapeString","parsePrefix","userIndex","hostIndex","user","host","middle","writable","trailing","params","enumerable","nextWhitespace","errors_1","ParseError","command","isObjectCustom","mapObject","mapper","isSeen","WeakMap","deep","target","mapArray","newKey","newValue","camelCase","pascalCase","x","trim","toLowerCase","isLastCharLower","isLastCharUpper","isLastLastCharUpper","character","preserveCamelCase","p1","charAt","QuickLRU","maxSize","oldCache","_size","delete","_set","deleted","oldCacheSize","camelCaseConvert","exclude","stopPaths","stopPathsSet","makeMapper","parentPath","path","mapObj","some","lastIndex","cacheKey","Ctor","transform","overArg","isPrototype","nativeKeys","mapTag","promiseTag","setTag","weakMapTag","dataViewTag","dataViewCtorString","DataView","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","getTag","ArrayBuffer","ctorString","isObjectLike","baseIsArguments","isLength","freeExports","nodeType","freeModule","Buffer","isBuffer","stubFalse","typedArrayTags","freeProcess","process","nodeUtil","types","require","binding","nodeIsTypedArray","isTypedArray","baseUnary","baseIsTypedArray","isArrayLike","isArguments","baseKeys","symbolProto","symbolToString","baseToString","arrayMap","isSymbol","generalTimestamp","maybeTimestamp","parseInt","baseParser","rawMessages","username","rawMessage","parse","_e","channel","messageTags","isEmpty","camelcaseKeys","messageUsername","_i","maybeUsernames","maybeUsername","toLower","helpers.username","login","displayName","_raw","helpers.generalTimestamp","isSelf","condition","c","argIndex","framesToPop","source","props","reIsUint","inherited","isArr","isArg","isBuff","isType","skipIndexes","baseTimes","isIndex","arrayLikeKeys","baseConformsTo","nativeMax","max","start","otherArgs","constant","identity","nativeNow","lastCalled","stamp","remaining","shortOut","baseSetToString","setToString","overRest","nativeKeysIn","isProto","baseKeysIn","baseRest","sources","guard","isIterateeCall","keysIn","propsIndex","propsLength","nativeIsFinite","nativeFloor","nativeRandom","lower","upper","reTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","valueOf","isBinary","INFINITY","toNumber","freeParseFloat","parseFloat","nativeMin","min","BaseClientEvents","floating","toFinite","temp","rand","baseRandom","token","startsWith","ClientEvents","_super","_this","_options","shape","isNil","isString","server","port","ssl","isBoolean","isKnown","isVerified","optionsWithDefaults","defaults","sanitizers.token","invariant","conformsTo","validators.clientOptions","_log","protocol","_ws","onopen","_handleOpen","onmessage","_handleMessage","onerror","_handleError","onclose","_handleClose","_queueAuthenticate","Queue","_queueJoin","_moderatorQueue","Client","readyState","isModerator","pause","_handleHeartbeatReset","close","_clientPriority","_handleHeartbeat","messageEvent","ERROR_ENCOUNTERED","utils.isAuthenticationFailedMessage","PING","WELCOME","GLOBALUSERSTATE","_multiEmit","ALL","CONNECTED","RECONNECT","AUTHENTICATION_FAILED","disconnect","RAW","errorEvent","_closeEvent","DISCONNECTED","_heartbeatTimeoutId","constants.KEEP_ALIVE_PING_TIMEOUT","_reconnectTimeoutId","eventName","CustomError","_newTarget","fixStack","ChatError","AuthenticationError","PARSE_ERROR_ENCOUNTERED","JoinError","operator","createRelationalOperation","MESSAGE_PARAMETER_PREFIX_RE","PRIVATE_MESSAGE_HOSTED_RE","baseSlice","reHasUnicode","rsAstral","rsCombo","rsFitz","rsNonAstral","rsRegional","rsSurrPair","reOptMod","rsOptVar","rsSeq","rsSymbol","reUnicode","match","hasUnicode","unicodeToArray","asciiToArray","methodName","strSymbols","stringToArray","chr","castSlice","createCaseFirst","upperFirst","accumulator","initAccum","basePropertyOf","À","Á","Â","Ã","Ä","Å","à","á","â","ã","ä","å","Ç","ç","Ð","ð","È","É","Ê","Ë","è","é","ê","ë","Ì","Í","Î","Ï","ì","í","î","ï","Ñ","ñ","Ò","Ó","Ô","Õ","Ö","Ø","ò","ó","ô","õ","ö","ø","Ù","Ú","Û","Ü","ù","ú","û","ü","Ý","ý","ÿ","Æ","æ","Þ","þ","ß","Ā","Ă","Ą","ā","ă","ą","Ć","Ĉ","Ċ","Č","ć","ĉ","ċ","č","Ď","Đ","ď","đ","Ē","Ĕ","Ė","Ę","Ě","ē","ĕ","ė","ę","ě","Ĝ","Ğ","Ġ","Ģ","ĝ","ğ","ġ","ģ","Ĥ","Ħ","ĥ","ħ","Ĩ","Ī","Ĭ","Į","İ","ĩ","ī","ĭ","į","ı","Ĵ","ĵ","Ķ","ķ","ĸ","Ĺ","Ļ","Ľ","Ŀ","Ł","ĺ","ļ","ľ","ŀ","ł","Ń","Ņ","Ň","Ŋ","ń","ņ","ň","ŋ","Ō","Ŏ","Ő","ō","ŏ","ő","Ŕ","Ŗ","Ř","ŕ","ŗ","ř","Ś","Ŝ","Ş","Š","ś","ŝ","ş","š","Ţ","Ť","Ŧ","ţ","ť","ŧ","Ũ","Ū","Ŭ","Ů","Ű","Ų","ũ","ū","ŭ","ů","ű","ų","Ŵ","ŵ","Ŷ","ŷ","Ÿ","Ź","Ż","Ž","ź","ż","ž","IJ","ij","Œ","œ","ʼn","ſ","reLatin","reComboMark","deburrLetter","reAsciiWord","reHasUnicodeWord","rsDingbatRange","rsLowerRange","rsUpperRange","rsBreakRange","rsMathOpRange","rsBreak","rsDigits","rsDingbat","rsLower","rsMisc","rsUpper","rsMiscLower","rsMiscUpper","rsOptContrLower","rsOptContrUpper","rsModifier","rsEmoji","reUnicodeWord","pattern","hasUnicodeWord","unicodeWords","asciiWords","reApos","callback","arrayReduce","words","deburr","createCompounder","word","capitalize","ChatReadyStates","NoticeCompounds","PrivateMessageCompounds","UserNoticeCompounds","generalString","maybeMessage","generalNumber","maybeNumber","number","generalBoolean","maybeBoolean","mods","roomState","roomStateTags","followersOnlyAsNumber","_g","helpers.generalString","helpers.generalNumber","helpers.generalBoolean","userState","badges","maybeBadges","parsed","badge","rawKey","bits","color","emotes","maybeEmotes","emoteTag","emoteIndices","id","indices","emoteSets","maybeEmoteSets","userType","maybeUserType","mod","globalUserState","userNotice","noticeMessage","baseMessage","baseTags","msgId","toUpper","ROOM_MODS","helpers.mods","userStateMessage","USER_STATE","tagParsers.userState","userNoticeMessage","tagParsers.userNotice","systemMsg","systemMessage","parameters","param","constants.MESSAGE_PARAMETER_PREFIX_RE","tagParsers.userNoticeMessageParameters","ANON_GIFT_PAID_UPGRADE","GIFT_PAID_UPGRADE","RAID","RESUBSCRIPTION","RITUAL","SUBSCRIPTION_GIFT_COMMUNITY","SUBSCRIPTION_GIFT","SUBSCRIPTION","chatOptions","connectionTimeout","joinTimeout","onAuthenticationFailure","sanitizers.channel","WAITING","validators.chatOptions","Chat","_readyState","CONNECTING","_connectionInProgress","_handleConnectionAttempt","_connectionAttempts","DISCONNECTING","_handleAuthenticationFailure","connect","err_1","_client","Errors.ChatError","RECONNECTING","channels","_getChannels","validators.channel","joinProfiler","ROOM_STATE","_isAuthenticated","JOIN","channelState","_setChannelState","_removeChannelState","PART","isCommand","_channelState","resolver","PRIVATE_MESSAGE","say","BAN","BAN_SUCCESS","ALREADY_BANNED","BLOCK","targetMessageId","DELETE","CLEAR","CLEAR_CHAT","COLOR","COLOR_CHANGED","COMMERCIAL","COMMERCIAL_SUCCESS","EMOTE_ONLY","EMOTE_ONLY_ON","ALREADY_EMOTE_ONLY_ON","EMOTE_ONLY_OFF","ALREADY_EMOTE_ONLY_OFF","period","FOLLOWERS_ONLY","FOLLOWERS_ONZERO","FOLLOWERS_ON","FOLLOWERS_ONLY_OFF","FOLLOWERS_OFF","HELP","CMDS_AVAILABLE","hostChannel","HOST","HOST_ON","description","MARKER","text","ME","MOD","MOD_SUCCESS","MODS","R9K","R9K_ON","ALREADY_R9K_ON","R9K_OFF","ALREADY_R9K_OFF","raidChannel","seconds","SLOW","SLOW_ON","SLOW_OFF","SUBSCRIBERS","SUBS_ON","ALREADY_SUBS_ON","SUBSCRIBERS_OFF","SUBS_OFF","ALREADY_SUBS_OFF","timeoutArg","TIMEOUT","TIMEOUT_SUCCESS","UNBAN","UNBAN_SUCCESS","UNBLOCK","UNHOST","HOST_OFF","UNMOD","UNMOD_SUCCESS","UNRAID","UNRAID_SUCCESS","UNVIP","VIP","VIPS","WHISPER","connectProfiler","_handleDisconnect","reconnect","_handleAuthenticated","_handleJoinsAfterConnect","_clearChannelState","globalUserStateMessage","tagParsers.globalUserState","_globalUserState","Errors.AuthenticationError","err_2","_parseMessageForEmitter","_emit","state","channelStates","baseEventName","parsers.joinMessage","parsers.partMessage","NAMES","namesV","usernames","parsers.namesMessage","NAMES_END","parsers.namesEndMessage","banReason","banDuration","USER_BANNED","parsers.clearChatMessage","CLEAR_MESSAGE","targetMsgId","parsers.clearMessageMessage","HOST_TARGET","numberOfViewers","isStopped","parsers.hostTargetMessage","MODE","mode","baseModeMessage","MOD_GAINED","MOD_LOST","parsers.modeMessage","_getChannelState","parsers.userStateMessage","tagParsers.roomState","parsers.roomStateMessage","parsers.noticeMessage","parsers.userNoticeMessage","gt","CHEER","constants.PRIVATE_MESSAGE_HOSTED_RE","isHostingPrivateMessage","isAuto","HOSTED_AUTO","HOSTED_WITH_VIEWERS","HOSTED_WITHOUT_VIEWERS","parsers.privateMessage","uniq","part","parents","eventParts","eventCompound","remainder","baseValues","collection","toInteger","__self__","F","fetch","DOMException","support","Blob","viewClasses","isArrayBufferView","isView","normalizeName","normalizeValue","iteratorFor","Headers","headers","append","header","getOwnPropertyNames","consumed","bodyUsed","fileReaderReady","reader","onload","readBlobAsArrayBuffer","blob","FileReader","readAsArrayBuffer","bufferClone","buf","view","Uint8Array","byteLength","buffer","Body","_initBody","_bodyInit","_bodyText","isPrototypeOf","_bodyBlob","FormData","_bodyFormData","URLSearchParams","_bodyArrayBuffer","arrayBuffer","readAsText","chars","readArrayBufferAsText","formData","decode","json","oldValue","methods","Request","method","upcased","url","credentials","referrer","form","bytes","decodeURIComponent","Response","bodyInit","status","ok","statusText","clone","response","redirectStatuses","redirect","RangeError","location","init","request","xhr","XMLHttpRequest","abortXhr","abort","rawHeaders","getAllResponseHeaders","line","parts","responseURL","responseText","ontimeout","onabort","open","withCredentials","responseType","setRequestHeader","onreadystatechange","polyfill","hexTable","arrayToObject","plainObjects","acc","combine","compact","queue","prop","refs","compacted","compactQueue","decoder","charset","strWithoutPlus","unescape","encode","defaultEncoder","escape","$0","out","isRegExp","maybeMap","mapped","merge","allowPrototypes","mergeTarget","targetItem","percentTwenties","Format","RFC1738","RFC3986","util","formatters","arrayPrefixGenerators","brackets","comma","repeat","pushToArray","arr","valueOrArray","toISO","defaultFormat","formats","addQueryPrefix","allowDots","charsetSentinel","delimiter","encoder","utils","encodeValuesOnly","formatter","serializeDate","date","skipNulls","strictNullHandling","generateArrayPrefix","sort","objKeys","keyPrefix","normalizeStringifyOptions","arrayFormat","joined","FetchError","ApiReadyStates","apiOptions","clientId","isUndefined","cb","Settings","Helix","baseUrl","authorizationHeader","Kraken","READY","validators.apiOptions","Api","_status","newOptions","version","statusResponse","INITIALIZED","authorization","scopes","endpoint","_handleFetch","_isVersionHelix","maybeUrl","fetchOptions","_getBaseUrl","fetchProfiler","_getHeaders","optionHeaders","optionHeaders_1","__values","name_1","performRequest","qsOptions","isBodyJson","Content-Type","search","responseJson","camelCaseKeys","fetchUtil","caughtError","error_1","initialize","chat","api","TwitchJs","updateOptions"],"mappings":"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"} |