UNPKG

@wistia/wistia-player

Version:

An embeddable wistia-player web component and React wrapper to add responsive, lightweight, and SEO-friendly videos to your site.

1,245 lines (1,183 loc) 762 kB
/******/ var __webpack_modules__ = ({ /***/ 159: /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Rb: () => (/* binding */ findScriptInDomBySrc) /* harmony export */ }); /* unused harmony exports removeScriptsBySrc, runScript, runScripts, scriptInputsToHash */ /* harmony import */ var utilities_wlog_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6637); /* harmony import */ var utilities_obj_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(731); /* harmony import */ var utilities_runScript_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(1248); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } var findScriptInDomBySrc = function findScriptInDomBySrc(targetSrc) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var scriptTags = document.getElementsByTagName('script'); for (var i = 0; i < scriptTags.length; i++) { var s = scriptTags[i]; var src = s.getAttribute('src') || ''; if (options.ignoreQueryParams) { var matches = src.split('?'); var urlWithoutParams = matches[0]; src = urlWithoutParams; } if (!options.scriptRegex && options.ignoreProtocol) { src = src.replace(/^https?:/, ''); targetSrc = targetSrc.replace(/^https?:/, ''); } if (options.scriptRegex && options.scriptRegex.test(src)) { return s; } if (options.testStartsWith && src.indexOf(targetSrc) === 0) { return s; } if (src === targetSrc) { return s; } } return null; }; var removeScriptsBySrc = function removeScriptsBySrc(targetSrc) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var s; var _loop = function _loop() { if (s) { s.onload = s.onreadystatechange = s.onerror = null; if (s.parentNode && typeof s.parentNode.removeChild) { try { s.parentNode.removeChild(s); } catch (e) { setTimeout(function () { throw e; }, 0); } } } }; while (s = findScriptInDomBySrc(targetSrc, options)) { _loop(); } }; // fire and forget. // run a script and immediately remove it from the DOM. var runScript = function runScript(src) { var timeout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 8000; var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; if (timeout == null) { timeout = 8000; } if (options == null) { options = {}; } var s; var alreadyExists; return new Promise(function (resolve) { if (options.once === true && (s = findScriptInDomBySrc(src))) { alreadyExists = true; } if (options.once && alreadyExists) { if (!s.readyState || /loaded|complete/.test(s.readyState)) { setTimeout(function () { resolve(); }, 1); } } else { runScriptWithPromise(src, timeout).then(resolve).catch(function (msg) { resolve(msg); setTimeout(function () { console.error(msg); }, 1); }); } }); }; var runScripts = function runScripts() { // support either an array of scripts or a single script as a string var scripts; for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } if (args[0] instanceof Array) { scripts = args[0]; } else { scripts = args; } scripts = scriptInputsToHash(scripts); var asyncScripts = []; var syncScripts = []; var scriptPromises = []; scripts.forEach(function (s) { var script = _objectSpread({}, s); var p = new Promise(function (resolve) { script.resolve = resolve; }); script.promise = p; scriptPromises.push(script.promise); if (s.async) { asyncScripts.push(script); } else { syncScripts.push(script); } }); syncScripts.reduce(function (prev, script) { if (script.fn) { try { script.fn(); } catch (e) { wlog.error(e); } finally { script.resolve(); } } else if (script.src) { runScript(script.src, null, script).then(script.resolve); } return prev.then(script.promise); }, Promise.resolve()); setTimeout(function () { asyncScripts.forEach(function (script) { if (script.fn) { try { script.fn(); } catch (e) { wlog.error(e); } finally { script.resolve(); } } else if (script.src) { runScript(script.src, null, script).then(script.resolve); } }); }, 1); return Promise.all(scriptPromises); }; var scriptInputsToHash = function scriptInputsToHash(scripts) { var result = []; for (var i = 0; i < scripts.length; i++) { var script = scripts[i]; if (typeof script === 'string') { result.push({ src: script, async: false }); } else if (isObject(script)) { result.push(script); } else { result.push({ fn: script, async: false }); } } return result; }; /***/ }), /***/ 267: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ O: () => (/* binding */ hasPerformanceMeasureSupport) /* harmony export */ }); var hasPerformanceMeasureSupport = function hasPerformanceMeasureSupport() { var _window = window, performance = _window.performance; // eslint-disable-next-line @typescript-eslint/unbound-method return Boolean(performance) && Boolean(performance.measure); }; /***/ }), /***/ 438: /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ $F: () => (/* binding */ choosePlayer), /* harmony export */ gC: () => (/* binding */ buildContext) /* harmony export */ }); /* unused harmony exports HLS_ENGINE_PATH, NATIVE_HLS_ENGINE_PATH, SIMPLE_AUDIO_ENGINE_PATH, MANUAL_QUALITY_ENGINE_PATH, SPHERICAL_VIDEO_ENGINE_PATH, PLUGIN_CONFIGS, bestPlayer, bestUsableEngine, bestUsableEngineClass, canPlayInline, canUsePlayer, determinePlayerPreferenceFromInput, doesBrowserSupportHlsTools, enginesToLoad, getDefaultContext, hasAssetsForPlayer, hasEnoughReadyMp4Assets, hasSupportedHlsAssets, isBrowserInNativeAndroid, isBrowserOldChrome, isHlsEnabled, isMobile, isNotPlayable, isPasswordProtected, isSupportedPlayer, isValidPlayer, logWarnings, playerPlugins, report, shouldServeHls, supportedPlayers, usablePlayers, urlHasBeenTamperedWith, xhrHasBeenTamperedWith */ /* harmony import */ var utilities_obj_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(731); /* harmony import */ var utilities_detect_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7231); /* harmony import */ var utilities_metrics_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(655); /* harmony import */ var utilities_legacyLocalstorage_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(3695); /* harmony import */ var utilities_root_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(8176); /* harmony import */ var utilities_wlog_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(6637); /* harmony import */ var _assets_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(7209); /* harmony import */ var _wistia_namespace_ts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(5509); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } var wlog = utilities_wlog_js__WEBPACK_IMPORTED_MODULE_5__/* .wlog */ .ct.getPrefixedFunctions('judy'); var AUTO = 'auto'; var CAROUSEL_HARD_WALL = 'carouselHardWall'; var EXTERNAL = 'external'; var HLS_VIDEO = 'hlsVideo'; var HTML5 = 'html5'; var MANUAL_QUALITY_VIDEO = 'manualQualityVideo'; var NATIVE_HLS_VIDEO = 'nativeHlsVideo'; var NOT_PLAYABLE = 'notplayable'; var PASSWORD_PROTECTED = 'passwordprotected'; var SIMPLE_HTML5 = 'simplehtml5'; var VULCAN_V2 = 'vulcan-v2'; var SPHERICAL_VIDEO = 'sphericalVideo'; var PLAYERS = [VULCAN_V2, HTML5, SIMPLE_HTML5, EXTERNAL, NOT_PLAYABLE, PASSWORD_PROTECTED]; var HLS_ENGINE_PATH = 'engines/hls_video.js'; var NATIVE_HLS_ENGINE_PATH = 'engines/native_hls_video.js'; var SIMPLE_AUDIO_ENGINE_PATH = 'engines/simple_audio.js'; var MANUAL_QUALITY_ENGINE_PATH = 'engines/manual_quality_video.js'; var SPHERICAL_VIDEO_ENGINE_PATH = 'engines/spherical_video.js'; var PLUGIN_CONFIGS = { notPlayableVideo: { on: true, initBeforeHasData: true, async: false, loadWeight: -1 }, vulcanV2Player: { on: true, initBeforeHasData: false, async: false, loadWeight: -1 }, hlsVideo: { on: true, initBeforeHasData: false, async: false, loadWeight: 0 }, nativeHlsVideo: { on: true, initBeforeHasData: false, async: false, loadWeight: 0 }, passwordProtectedVideo: { on: true, initBeforeHasData: true, async: false, loadWeight: -1 }, externalPlayer: { on: true, initBeforeHasData: false, async: false, loadWeight: -1 }, html5Player: { on: true, initBeforeHasData: false, async: false, loadWeight: -1 }, playlist: { on: true, initBeforeHasData: false, async: false, loadWeight: -1 } }; var bestPlayer = function bestPlayer(context, mediaData, embedOptions) { var detect = context.detect, logger = context.logger; var isSpherical = isSphericalVideo({ mediaData: mediaData, options: embedOptions }, detect); if (detect.oldandroid) { logger.info('external on old android'); return EXTERNAL; } if (canUsePlayer(context, VULCAN_V2, mediaData)) { logger.info('default, ret', VULCAN_V2); return VULCAN_V2; } if (mediaData.mediaType === 'Audio' || mediaData.mediaType === 'LiveStream') { // audio and lives are only supported with vulcan_v2 return VULCAN_V2; } if (canUsePlayer(context, HTML5, mediaData)) { logger.info('default, ret', HTML5); return HTML5; } logger.info('nothing left, use', EXTERNAL); // Everything supports external, but nobody likes it. It's just an image // and a link to an mp4 file. return EXTERNAL; }; var bestUsableEngine = function bestUsableEngine(context, mediaData) { var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var detect = context.detect, logger = context.logger; logger.info('bestUsableEngineClass'); var allowHls = shouldServeHls(context, mediaData, options); var isSpherical = isSphericalVideo({ mediaData: mediaData, options: options }, detect); if (options.engine) { return options.engine; } if (isSpherical) { logger.info(SPHERICAL_VIDEO); return SPHERICAL_VIDEO_ENGINE_PATH; } if (mediaData.mediaType === 'Audio') { return SIMPLE_AUDIO_ENGINE_PATH; } // If managedMediaSource is false or restricted by same origin (often iframes), we need to use the native hls video engine // Otherwise, we can use the hls.js in Safari var isApple = detect.safari || detect.ios.version > 0; var allowsSameOrigin = window.origin !== 'null'; var restrictedBySameOrigin = isApple && !allowsSameOrigin; if (allowHls && detect.nativeHls && (detect.managedMediaSource === false || restrictedBySameOrigin)) { logger.info(NATIVE_HLS_VIDEO); return NATIVE_HLS_ENGINE_PATH; } if (allowHls) { logger.info(HLS_VIDEO); return HLS_ENGINE_PATH; } logger.info(MANUAL_QUALITY_VIDEO); return MANUAL_QUALITY_ENGINE_PATH; }; // Given a media data blob and options--and assuming all engine scripts have // been loaded--return the engine class that we should initialize. var bestUsableEngineClass = function bestUsableEngineClass(context, mediaData) { var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var detect = context.detect, logger = context.logger; logger.info('bestUsableEngineClass'); var allowHls = shouldServeHls(context, mediaData, options); var engines = Wistia.engines || {}; if (mediaData.mediaType === 'Audio') { return engines.SimpleAudio; } if (allowHls && detect.nativeHls && engines.NativeHlsVideo) { logger.info(NATIVE_HLS_VIDEO); return engines.NativeHlsVideo; } if (allowHls && engines.HlsVideo) { logger.info(HLS_VIDEO); return engines.HlsVideo; } logger.info(MANUAL_QUALITY_VIDEO); return engines.ManualQualityVideo; }; var buildContext = function buildContext() { var overrides = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var pageUrl = contextUrl(overrides); return _objectSpread(_objectSpread(_objectSpread({}, getDefaultContext()), overrides), {}, { pageUrl: pageUrl }); }; var canPlayInline = function canPlayInline(context) { var detect = context.detect; return detect.android || detect.ios.version >= 10; }; var canUsePlayer = function canUsePlayer(context, player, mediaData) { return isSupportedPlayer(context, player) && hasAssetsForPlayer(context, player, mediaData); }; var choosePlayer = function choosePlayer(context, mediaData, embedOptions) { var detect = context.detect; var logger = context.logger; var playerForce = embedOptions.playerForce; logger.info('choosePlayer input', mediaData.hashedId); // This can be falsey if there is no specific player preference. Users may // also pass in "auto" to be explicit, which means there should be no // preference. var playerPreference = determinePlayerPreferenceFromInput(context, mediaData, embedOptions); // Loudly error but don't die if given invalid input. if (playerForce && !isValidPlayer(context, playerForce)) { logger.error("Invalid playerForce option: \"".concat(playerForce, "\", ignoring")); playerForce = null; } if (playerPreference && playerPreference !== AUTO && !isValidPlayer(context, playerPreference)) { logger.error("Invalid playerPreference option: \"".concat(playerPreference, "\", ignoring")); playerPreference = AUTO; } logger.info('playerPreference is', playerPreference); if (playerForce) { // This is really only used when testing. logger.info('"playerForce" used, return', playerForce); return playerForce; } // A carousel can contain a password-protected media which should be unlocked // when the carousel is unlocked, so this check should always // come before the check to see if a media is password-protected if (mediaData.carouselHardWall) { logger.info('return', CAROUSEL_HARD_WALL); return CAROUSEL_HARD_WALL; } if (isPasswordProtected(context, embedOptions)) { // the video is marked as being password protected. it's expected that the // password protected player, upon a successful password entry, changes an // option and is replaced such that isPasswordProtected() returns false. logger.info('return', PASSWORD_PROTECTED); return PASSWORD_PROTECTED; } if (isNotPlayable(context, mediaData, embedOptions)) { // 1. We can generate embed codes before a video can actually be played. If we // can't field any kind of player, we want to embed NOT_PLAYABLE instead, // which shows upload and encoding progress, then re-embeds as a "real" // player once it reaches 100%. // 2. DRM-lite customers must include their `authorization` credentials as embedOptions. If we know // a media is "protected", but there are no authorization credentials for the embed, we can build // directly into the NotPlayablePlayer state. // 3. DRM-lite customers that either do not have HLS enabled or cannot use HLS // will reach a NOT_PLAYABLE state. logger.info('return', NOT_PLAYABLE); return NOT_PLAYABLE; } // DRM-lite medias are marked as "protected". And those medias must be played back using our // VULCAN_V2 player. if (mediaData.protected) { return VULCAN_V2; } if (playerPreference !== AUTO && canUsePlayer(context, playerPreference, mediaData)) { var isSpherical = isSphericalVideo({ mediaData: mediaData, options: embedOptions }, detect); if (playerPreference !== VULCAN_V2 && isSpherical) { logger.info("this player doesn't support spherical, return", VULCAN_V2); return VULCAN_V2; } // Hooray! The customer has chosen a preference that we can actually use. // Let's use it. logger.info('"playerPreference" used, return', playerPreference); return playerPreference; } // Okay, we are not being compelled to use any particular player. Choose // the best one that we can support. logger.info('choosing player with no preference'); return bestPlayer(context, mediaData, embedOptions); }; // return the url to use for building up the Judy context. var contextUrl = function contextUrl() { var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; if (opts.pageUrl) { return opts.pageUrl; } if (Object(window.FreshUrl).originalUrl) { return window.FreshUrl.originalUrl; } if (window.top === window.self) { return location.href || ''; } return document.referrer || ''; }; var determinePlayerPreferenceFromInput = function determinePlayerPreferenceFromInput(context, mediaData, embedOptions) { // platformPreference is a legacy option. It used to have difference // semantics as playerPreference, but let's treat it the same now. var playerPreference = embedOptions.playerPreference || embedOptions.platformPreference; if (playerPreference && playerPreference !== AUTO) { if (playerPreference === HTML5) { if (isMobile(context)) { return HTML5; } return VULCAN_V2; } if (playerPreference === SIMPLE_HTML5) { // Because "html5" is an overloaded term on desktop, we add this other one // so we can more easily test the simple/mobile html5 player. return HTML5; } return playerPreference; } // no preference was specified return AUTO; }; // the browser can support hlsjs or native HLS var doesBrowserSupportHlsTools = function doesBrowserSupportHlsTools(detect) { var hasPromise = Boolean(window.Promise); return (detect.mediaSource || detect.nativeHls) && hasPromise; }; // Given a media data blob and options, return _all_ engines and sub-engines // that will need to be loaded. This is how we determine which scripts to load. var enginesToLoad = function enginesToLoad(context, mediaData) { var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var detect = context.detect, logger = context.logger; var engineNames = []; logger.info('enginesToLoad'); var allowHls = shouldServeHls(context, mediaData, options); if (allowHls && detect.nativeHls) { logger.info(NATIVE_HLS_VIDEO); engineNames.push(NATIVE_HLS_VIDEO); } else if (allowHls) { logger.info(HLS_VIDEO); engineNames.push(HLS_VIDEO); } else { logger.info(MANUAL_QUALITY_VIDEO); engineNames.push(MANUAL_QUALITY_VIDEO); } var isSpherical = isSphericalVideo({ mediaData: mediaData, options: options }, detect); if (isSpherical) { engineNames.push(SPHERICAL_VIDEO); logger.info(SPHERICAL_VIDEO); } // Make sure engine names are unique in this array. var tmpHash = {}; engineNames.forEach(function (engineName) { tmpHash[engineName] = true; }); var result = []; for (var engineName in tmpHash) { result.push(engineName); } return result; }; var cachedDefaultContext; var getDefaultContext = function getDefaultContext() { if (cachedDefaultContext) { return cachedDefaultContext; } cachedDefaultContext = { detect: (0,utilities_obj_js__WEBPACK_IMPORTED_MODULE_0__/* .clone */ .o8)((0,utilities_detect_js__WEBPACK_IMPORTED_MODULE_1__/* .cachedDetect */ .o1)()), inIframe: top !== self, location: window.location, logger: wlog, pageUrl: location.href, silenceGlobalWarnings: utilities_root_js__WEBPACK_IMPORTED_MODULE_4__/* .root */ .z.wistiaSilenceGlobalWarnings, userAgent: navigator.userAgent }; return cachedDefaultContext; }; var getPluginConfig = function getPluginConfig(context, pluginName) { var result = {}; result[pluginName] = PLUGIN_CONFIGS[pluginName]; return result; }; var canUseInstantHls = function canUseInstantHls(context, mediaData) { var embedOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; return embedOptions.instantHls !== false && mediaData.instantHlsAssetsReady && shouldServeHls(context, mediaData, embedOptions); }; var canUseOriginalFilePlayback = function canUseOriginalFilePlayback(context, mediaData) { var embedOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; return mediaData.originalIsEligibleForDirectPlayback && shouldServeHls(context, mediaData, embedOptions); }; var hasAssetsForPlayer = function hasAssetsForPlayer(context, player, mediaData) { if (!isValidPlayer(context, player)) { return false; } if (player === NOT_PLAYABLE || player === PASSWORD_PROTECTED || player === CAROUSEL_HARD_WALL) { // No special asset requirements for these. return true; } var assets = mediaData.assets; if (player === VULCAN_V2) { return canUseInstantHls(context, mediaData) || canUseOriginalFilePlayback(context, mediaData) || hasReadyVideoAssets(assets) || hasReadyAudioAssets(assets); } if (player === HTML5) { return (0,_assets_js__WEBPACK_IMPORTED_MODULE_6__/* .readyPublicMp4s */ .Fi)(assets).length > 0; } if (player === EXTERNAL) { return (0,_assets_js__WEBPACK_IMPORTED_MODULE_6__/* .readyPublicMp4s */ .Fi)(assets).length > 0; } throw new Error("Unhandled player type '".concat(player, "'")); }; var hasReadyVideoAssets = function hasReadyVideoAssets(assets) { return (0,_assets_js__WEBPACK_IMPORTED_MODULE_6__/* .readyPublicMp4s */ .Fi)(assets).length > 0 || (0,_assets_js__WEBPACK_IMPORTED_MODULE_6__/* .readyPublicM3u8s */ .x4)(assets).length > 0; }; var hasReadyAudioAssets = function hasReadyAudioAssets(assets) { return (0,_assets_js__WEBPACK_IMPORTED_MODULE_6__/* .readyPublicMp3s */ .o2)(assets).length > 0; }; var hasEnoughReadyMp4Assets = function hasEnoughReadyMp4Assets(assets) { var mp4Assets = (0,_assets_js__WEBPACK_IMPORTED_MODULE_6__/* .filter */ .pb)(assets, { container: 'mp4', metadata: function metadata(m) { return m && m.max_bitrate; }, public: true, sortBy: 'width desc', status: _assets_js__WEBPACK_IMPORTED_MODULE_6__/* .READY */ .yE, type: /\b(?!captioned_video)\S+/ // no burned in captions }); // ensure that we have at least one asset at or above 400 width. This prevents // using HLS from using too low quality an asset, say in the scenario where // the other assets are still being processed. var hasAssetWithBitRateAndSize = Boolean(mp4Assets[0] && mp4Assets[0].width >= 400); return hasAssetWithBitRateAndSize; }; var hasSupportedHlsAssets = function hasSupportedHlsAssets(mediaData) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; if (options.instantHls !== false && mediaData.instantHlsAssetsReady) { return true; } if (mediaData.originalIsEligibleForDirectPlayback) { return true; } var hasAssets = hasEnoughReadyMp4Assets(mediaData.assets); if (!hasAssets) { (0,utilities_metrics_js__WEBPACK_IMPORTED_MODULE_2__/* .count */ .U9)('player/originV2/media-has-no-metadata', 1, { hashedId: mediaData.hashedId }); } return hasAssets; }; var hlsOverrideValue = function hlsOverrideValue(_ref, embedOptions) { var pageUrl = _ref.pageUrl; var paramVal = hlsQueryParamValue(pageUrl); if (paramVal != null) { return paramVal; } var localStorageVal = (0,utilities_legacyLocalstorage_js__WEBPACK_IMPORTED_MODULE_3__/* .setOrGet */ .Qy)('forceHls'); if (localStorageVal != null) { return localStorageVal; } return embedOptions.hls; }; var hlsQueryParamValue = function hlsQueryParamValue(pageUrl) { var match = pageUrl && pageUrl.match && pageUrl.match(/[&?]whls=([^&]+)/); var val = match && match[1]; if (val != null) { return (0,utilities_obj_js__WEBPACK_IMPORTED_MODULE_0__/* .cast */ .wg)(val); } return null; }; // Chromecast doesn't work with hlsjs because it only understands a src // that can be referenced externally. And playsinline=false or // nativeMode=true is our signal to use something close to a native player. var isBrowserInNativeAndroid = function isBrowserInNativeAndroid(detect, embedOptions) { return detect.android && (embedOptions.playsinline === false || embedOptions.nativeMode === true); }; // chrome 49 and earlier (the last supported version on Win XP/Vista) does // not support MSE well enough for hls.js. var isBrowserOldChrome = function isBrowserOldChrome(detect) { return detect.chrome && parseInt(detect.chrome.version, 10) < 50; }; var isHlsEnabled = function isHlsEnabled(context, mediaData, embedOptions) { // always prefer the hls override value if it is present, regardless of the // hls_enabled value var overrideValue = hlsOverrideValue(context, embedOptions); if (overrideValue === true || overrideValue === false) { return overrideValue; } if (mediaData.hls_enabled === false) { return false; } return true; }; var isMobile = function isMobile(_ref2) { var detect = _ref2.detect; return detect.iphone || detect.ipad || detect.android; }; var isNotPlayable = function isNotPlayable(context, mediaData) { var _embedOptions$authori; var embedOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var assets = mediaData.assets; if (!mediaData.protected && (canUseInstantHls(context, mediaData, embedOptions) || canUseOriginalFilePlayback(context, mediaData, embedOptions))) { return false; } var assetsArentReady = mediaData.type === 'Audio' ? (0,_assets_js__WEBPACK_IMPORTED_MODULE_6__/* .readyPublicMp3s */ .o2)(assets).length == 0 : (0,_assets_js__WEBPACK_IMPORTED_MODULE_6__/* .readyPublicMp4s */ .Fi)(assets).length == 0; // LiveStreams won't have ready assets, but that does not mean we're in an // unplayable position. if (mediaData.mediaType === 'LiveStream') { return false; } // DRM-lite authorization check! // For DRM-lite, customers must include their `authorization` credentials as embedOptions. If we know // a media is "protected", but there are no authorization credentials for the embed, we can build // directly into the NotPlayablePlayer state. if (mediaData.protected && !((_embedOptions$authori = embedOptions.authorization) !== null && _embedOptions$authori !== void 0 && _embedOptions$authori.jwt)) { embedOptions.notPlayableOptions = { fadeIn: false, message: 'This video is set to private.', shouldRefresh: false }; return true; } var allowHls = shouldServeHls(context, mediaData, embedOptions); if (mediaData.protected && allowHls === false) { embedOptions.notPlayableOptions = { fadeIn: false, message: 'This video is not playable.', shouldRefresh: false }; return true; } return assets.length === 0 || assets.length === 1 && assets[0].type === 'original' || assetsArentReady || (0,_assets_js__WEBPACK_IMPORTED_MODULE_6__/* .nonfailedPublicOver400 */ .aF)(assets).length > 0 && (0,_assets_js__WEBPACK_IMPORTED_MODULE_6__/* .readyPublicOver400 */ .n9)(assets).length === 0; }; var isPasswordProtected = function isPasswordProtected(context, embedOptions) { var pluginOpts = (0,utilities_obj_js__WEBPACK_IMPORTED_MODULE_0__/* .getDeep */ .b$)(embedOptions, 'plugin.passwordProtectedVideo'); return pluginOpts != null && pluginOpts.on !== false; }; var isSphericalVideo = function isSphericalVideo() { var _mediaInfo$mediaData, _mediaInfo$opts; var mediaInfo = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; if (mediaInfo.options.overrideSpherical) { return false; } var mediaDataSpherical = String((_mediaInfo$mediaData = mediaInfo.mediaData) === null || _mediaInfo$mediaData === void 0 ? void 0 : _mediaInfo$mediaData.spherical); var optsSpherical = String((_mediaInfo$opts = mediaInfo.opts) === null || _mediaInfo$opts === void 0 ? void 0 : _mediaInfo$opts.spherical); return mediaDataSpherical === 'true' || optsSpherical === 'true'; }; var isSupportedPlayer = function isSupportedPlayer(context, player) { if (!isValidPlayer(context, player)) { return false; } return (0,utilities_obj_js__WEBPACK_IMPORTED_MODULE_0__/* .indexOf */ .qh)(supportedPlayers(context), player) >= 0; }; var isValidPlayer = function isValidPlayer(context, player) { return (0,utilities_obj_js__WEBPACK_IMPORTED_MODULE_0__/* .indexOf */ .qh)(PLAYERS, player) >= 0; }; var logWarnings = function logWarnings(context) { var detect = context.detect, userAgent = context.userAgent, logger = context.logger, silenceGlobalWarnings = context.silenceGlobalWarnings; if (silenceGlobalWarnings) { // Customers can set window.wistiaSilenceGlobalWarnings = true, and that // will be included in the default judy context. return; } var isHeadless = /phantomjs/i.test(userAgent); if (xhrHasBeenTamperedWith()) { if (!isHeadless) { logger.error('The XMLHttpRequest constructor has been tampered with. Because this affects CORS/Range XHR requests, HLS playback has been disabled. To enable HLS playback and other important features, please remove code that changes the definition of window.XMLHttpRequest.'); } } if (urlHasBeenTamperedWith()) { if (detect.mediaSource && !isHeadless) { logger.error('window.URL.createObjectURL has been tampered with. Because this affects use of Media Source Extensions, HLS playback has been disabled. window.URL is a browser API that should not be clobbered. Its current value is:', window.URL); } } }; var playerPlugins = function playerPlugins(context, player, mediaData, embedOptions) { var logger = context.logger; var plugins = {}; logger.info('playerPlugins input', player, mediaData.hashedId, mediaData, embedOptions); if (player === NOT_PLAYABLE) { merge(plugins, getPluginConfig(context, 'notPlayableVideo')); } else if (player === PASSWORD_PROTECTED) { merge(plugins, getPluginConfig(context, 'passwordProtectedVideo')); } else if (player === HTML5) { merge(plugins, getPluginConfig(context, 'html5Player')); } else if (player === EXTERNAL) { merge(plugins, getPluginConfig(context, 'externalPlayer')); } else if (player === VULCAN_V2) { merge(plugins, getPluginConfig(context, 'vulcanV2Player')); } var pluginNames = []; for (var k in plugins) { pluginNames.push(k); } logger.info.apply(logger, ['playerPlugins output'].concat(pluginNames, [plugins])); return plugins; }; var report = function report(context, mediaData, embedOptions) { return { bestPlayer: bestPlayer(context, mediaData, embedOptions), playerPreferenceFromInput: determinePlayerPreferenceFromInput(context, mediaData, embedOptions), supportedPlayers: supportedPlayers(context), usablePlayers: usablePlayers(context, mediaData.assets) }; }; var shouldServeHls = function shouldServeHls(context, mediaData, embedOptions) { // start by forcing HLS when the type is livestream, but later // refactor things such that NotPlayablePlayer is used if we can't handle // live if (mediaData.type === 'LiveStream') { return true; } var detect = context.detect; return doesBrowserSupportHlsTools(detect) && !isBrowserOldChrome(detect) && !isBrowserInNativeAndroid(detect, embedOptions) && // the account has hls enabled or explicitly trying to force isHlsEnabled(context, mediaData, embedOptions) && // the media actually has desktop assets compatable with the delivery system hasSupportedHlsAssets(mediaData) && ( // Some sites completely replace the XMLHttpRequest constructor with one // that doesn't work with hls.js. If we detect that, don't use HLS // (...unless we explicitly say to try it.) !xhrHasBeenTamperedWith(context) && !urlHasBeenTamperedWith(context) || hlsOverrideValue(context, embedOptions)); }; var supportedPlayers = function supportedPlayers(context) { var detect = context.detect; var result = [NOT_PLAYABLE, PASSWORD_PROTECTED, EXTERNAL, CAROUSEL_HARD_WALL]; if (detect.vulcanV2Support) { result.push(VULCAN_V2); } if (detect.video.h264) { result.push(HTML5); } return result; }; var usablePlayers = function usablePlayers(context, mediaData) { var result = []; var candidates = supportedPlayers(context); for (var i = 0; i < candidates.length; i++) { var player = candidates[i]; if (canUsePlayer(context, player, mediaData)) { result.push(player); } } return result; }; // `URL` is a built-in type, but a lot sites accidentally clobber it like // `URL = location.href`. hls.js uses it though. var urlHasBeenTamperedWith = function urlHasBeenTamperedWith() { return typeof (window.URL && window.URL.createObjectURL) !== 'function'; }; // `XMLHttpRequest.prototype.constructor.toString()` should be of this form if it's untampered with var XMLHTTPREQUEST_CONSTRUCTOR_RE = /\s*function\s+XMLHttpRequest\(\)\s*{\s*\[native code\]\s*}\s*/m; // Oddly, safari 9.x seems to display this in the [object ...] form. var XMLHTTPREQUEST_CONSTRUCTOR_IN_SAFARI_9_RE = /\[object XMLHttpRequestConstructor\]/m; var xhrHasBeenTamperedWith = function xhrHasBeenTamperedWith() { if (XMLHttpRequest && XMLHttpRequest.prototype && XMLHttpRequest.prototype.constructor) { var constructorString = XMLHttpRequest.prototype.constructor.toString(); return !(XMLHTTPREQUEST_CONSTRUCTOR_RE.test(constructorString) || XMLHTTPREQUEST_CONSTRUCTOR_IN_SAFARI_9_RE.test(constructorString)); } return true; }; /***/ }), /***/ 541: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ z: () => (/* binding */ maybeStartWistiaQueue) /* harmony export */ }); /* unused harmony export stopWistiaQueue */ /* harmony import */ var _wistia_namespace_ts__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5509); var QUEUE_INTERVAL = 500; var wistiaQueue = null; /** * Periodically checks the Wistia queue and executes the functions in it * @returns {void} */ var maybeStartWistiaQueue = function maybeStartWistiaQueue() { if (wistiaQueue) { return; } wistiaQueue = setInterval(function () { var queue = window._wq; if (!queue || queue.length === 0) { return; } queue.slice(0).forEach(function (item) { if (typeof item === 'function') { item(_wistia_namespace_ts__WEBPACK_IMPORTED_MODULE_0__/* .Wistia */ .s); queue.splice(queue.indexOf(item), 1); } else if (!_wistia_namespace_ts__WEBPACK_IMPORTED_MODULE_0__/* .Wistia */ .s.flushInitQueue) { queue.splice(queue.indexOf(item), 1); // eslint-disable-next-line no-console console.warn("<wistia-player> elements must be configured via window.wistiaOptions instead of window._wq. Config not applied", item); } }); }, QUEUE_INTERVAL); }; /** * Stops the Wistia queue * @returns {void} */ var stopWistiaQueue = function stopWistiaQueue() { if (wistiaQueue) { clearInterval(wistiaQueue); wistiaQueue = null; } }; /***/ }), /***/ 655: /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ U9: () => (/* binding */ count) /* harmony export */ }); /* unused harmony exports send, msend, sample */ /* harmony import */ var utilities_timeout_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3737); /* harmony import */ var utilities_wlog_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6637); /* harmony import */ var utilities_obj_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(731); /* harmony import */ var utilities_elem_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(7715); /* harmony import */ var utilities_url_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(2671); /* harmony import */ var utilities_hosts_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(5857); /* harmony import */ var utilities_trackingConsentApi_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(4755); /* harmony import */ var _wistia_namespace_ts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(5509); var _this = undefined; var W = (/* unused pure expression or super */ null && (Wistia)); if (_wistia_namespace_ts__WEBPACK_IMPORTED_MODULE_7__/* .Wistia */ .s._metricsCache == null) { _wistia_namespace_ts__WEBPACK_IMPORTED_MODULE_7__/* .Wistia */ .s._metricsCache = {}; } var METRICS_CACHE = _wistia_namespace_ts__WEBPACK_IMPORTED_MODULE_7__/* .Wistia */ .s._metricsCache; var send = function send(type, key, val) { var extraData = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; try { if (METRICS_CACHE.toMput == null) { METRICS_CACHE.toMput = []; } if (METRICS_CACHE.requestId == null) { METRICS_CACHE.requestId = 0; } var messageObj = (0,utilities_obj_js__WEBPACK_IMPORTED_MODULE_2__/* .merge */ .h1)({ type: type, key: key, value: val != null ? val : null, request_id: METRICS_CACHE.requestId }, extraData); var serialized = JSON.stringify(messageObj); utilities_wlog_js__WEBPACK_IMPORTED_MODULE_1__/* .wlog */ .ct.debug('send metrics', serialized); METRICS_CACHE.toMput.push(serialized); (0,utilities_timeout_utils_js__WEBPACK_IMPORTED_MODULE_0__/* .doTimeout */ .L)('metrics.debounce', function () { (0,utilities_elem_js__WEBPACK_IMPORTED_MODULE_3__/* .pageLoaded */ .Rx)(function () { msend.apply(_this, METRICS_CACHE.toMput); METRICS_CACHE.toMput = []; METRICS_CACHE.requestId += 1; }); }, 500); } catch (e) { utilities_wlog_js__WEBPACK_IMPORTED_MODULE_1__/* .wlog */ .ct.error(e); } }; var msend = function msend() { if (!(0,utilities_trackingConsentApi_js__WEBPACK_IMPORTED_MODULE_6__/* .isVisitorTrackingEnabled */ .D5)()) { return; } var url = "".concat((0,utilities_url_js__WEBPACK_IMPORTED_MODULE_4__/* .proto */ .ff)(), "//").concat((0,utilities_hosts_js__WEBPACK_IMPORTED_MODULE_5__/* .metricsHost */ .Qz)(), "/mput?topic=metrics"); for (var _len = arguments.length, messages = new Array(_len), _key = 0; _key < _len; _key++) { messages[_key] = arguments[_key]; } return fetch(url, { method: 'POST', mode: 'cors', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: messages.join('\n') }).then(function (response) { if (!response.ok) { // If fetch returns a response with an HTTP error code, // print an error in the console console.error(response); } }).catch(function (reason) { // If fetch fails (such as when this URL is blocked by an ad blocking extension), // print an error in the console console.error(reason); }); }; var count = function count(key) { var val = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; var extraData = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; return send('count', key, val, extraData); }; var sample = function sample(key, val, extraData) { return send('sample', key, val, extraData); }; /***/ }), /***/ 731: /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Cs: () => (/* binding */ eachLeaf), /* harmony export */ G0: () => (/* binding */ unsetDeep), /* harmony export */ Im: () => (/* binding */ isEmpty), /* harmony export */ Lt: () => (/* binding */ select), /* harmony export */ b$: () => (/* binding */ getDeep), /* harmony export */ cy: () => (/* binding */ isArray), /* harmony export */ di: () => (/* binding */ sort), /* harmony export */ h1: () => (/* binding */ merge), /* harmony export */ iu: () => (/* binding */ except), /* harmony export */ j6: () => (/* binding */ only), /* harmony export */ kp: () => (/* reexport safe */ utilities_assign_js__WEBPACK_IMPORTED_MODULE_0__.k), /* harmony export */ mA: () => (/* binding */ setAndPreserveUndefined), /* harmony export */ o8: () => (/* binding */ clone), /* harmony export */ qh: () => (/* binding */ indexOf), /* harmony export */ vd: () => (/* binding */ setDeep), /* harmony export */ wg: () => (/* binding */ cast) /* harmony export */ }); /* unused harmony exports mergeOne, identityFunc, legacyShouldDeleteFromMerge, exists, castDeep, filter, values, isObject, isFunction, isRegExp, isBasicType, isSubsetDeep, equalsDeep, eachDeep, pick, keys */ /* harmony import */ var utilities_assign_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9025); var _this = (/* unused pure expression or super */ null && (undefined)); var _objectHasOwn = function (object, property) { if (typeof object === 'undefined' || object === null) { throw new TypeError('Cannot convert undefined or null to object'); } return Object.prototype.hasOwnProperty.call(Object(object), property); }; // Old trick to clone arrays, i.e. `aps.call(array)`. var aps = Array.prototype.slice; var merge = function merge(obj1) { if ((arguments.length <= 1 ? 0 : arguments.length - 1) === 0) { return obj1; } for (var i = 0; i < (arguments.length <= 1 ? 0 : arguments.length - 1); i++) { _mergeOne(obj1, i + 1 < 1 || arguments.length <= i + 1 ? undefined : arguments[i + 1]); } return obj1; }; // Recursively merge the leaf values of obj2 into obj1. obj1 is modified // in-place. Accepts objects or arrays. Always returns obj1. // // By default, we do not transform any merged values. // // We also use a non-ideal legacy strategy when merging null/undefined // values from obj2: they will _delete_ corresponding keys in obj1. The more // correct solution seems like it would be to _never_ delete from obj1, or // at least to only delete `undefined` values, but maybe not null. We _may_ // be able to just make this change, but let's do one thing at a time. var _mergeOne = function mergeOne(obj1, obj2) { var transformerFn = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : identityFunc; var shouldDeleteFn = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : legacyShouldDeleteFromMerge; if (isArray(obj2)) { if (!isArray(obj1)) { obj1 = []; } for (var i = 0; i < obj2.length; i++) { var v = obj2[i]; // note that setting an index of an array will naturally increase the // length of the array. Array#push() is not necessary. if (obj1[i] == null && v != null) { if (isArray(v)) { obj1[i] = []; } else if (isObject(v)) { obj1[i] = {}; } } var result = _mergeOne(obj1[i], v, transformerFn); if (shouldDeleteFn(obj2, i, result)) { delete obj1[i]; } else { obj1[i] = result; } } return transformerFn(obj1); } if (isObject(obj2)) { for (var k in obj2) { if (_objectHasOwn(obj2, k) && (_objectHasOwn(obj1, k) || obj1[k] == null)) { var _v = obj2[k]; if (isArray(_v)) { if (!isArray(obj1[k])) { obj1[k] = []; } _mergeOne(obj1[k], _v, transformerFn); obj1[k] = transformerFn(obj1[k]); } else if (isObject(_v)) { if (!isObject(obj1[k])) { obj1[k] = {}; } _mergeOne(obj1[k], _v, transformerFn); obj1[k] = transformerFn(obj1[k]); } else if (obj1 == null) { obj1 = {}; if (!shouldDeleteFn(obj2, k, _v)) { obj1[k] = transformerFn(_v); } } else if (shouldDeleteFn(obj2, k, _v)) { delete obj1[k]; } else { obj1[k] = transformerFn(_v); } } } return transformerFn(obj1); } // obj2 is not an object that can be cloned. Since we may recurse down // to this level, we should just return obj2, since it will overwrite // obj1. return transformerFn(obj2); }; var identityFunc = function identityFunc(v) { return v; }; // When merging, delete key from obj1 if the value from obj2 is null or // undefined. var legacyShouldDeleteFromMerge = function legacyShouldDeleteFromMerge(obj, k, v) { return v == null; }; var clone = function clone(obj, transformerFn) { if (isArray(obj)) { return _mergeOne([], obj, transformerFn); } return _mergeOne({}, obj, transformerFn); }; var getDeep = function getDeep(obj, parts, create) { if (typeof parts === 'string') { parts = parts.split('.'); } else { parts = aps.call(parts); } var lastObj = obj; var lastP; while (obj != null && parts.length) { var p = parts.shift(); if ((obj[p] === undefined || !isObject(obj[p]) && !isArray(obj[p])) && create) { if (p === 0) { obj = lastObj[lastP] = []; obj[p] = {}; } else { obj[p] = {}; } } lastObj = obj; lastP = p; // Only descend into properties that the object directly owns. getDeep({}, '__proto__') // See for security vulnerability reproduction. // https://github.com/wistia/player-modern/issues/1800 if (_objectHasOwn(obj, p)) { obj = obj[p]; } else { obj = undefined; } } return obj; }; var setDeep = function setDeep(obj, parts, value) { return setAndMaybeDeleteUndefined(obj, parts, value, true); }; var setAndPreserveUndefined = function setAndPreserveUndefined(obj, parts, value) { return setAndMaybeDeleteUndefined(obj, parts, value, false); }; var setAndMaybeDeleteUndefined = function setAndMaybeDeleteUndefined(obj, parts, value) { var shouldDeleteUndefined = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; if (typeof parts === 'string') { parts = parts.split('.'); } else { parts = aps.call(parts); } var prop = parts.pop(); obj = getDeep(obj, parts, true); if (obj != null && (isObject(obj) || isArray(obj)) && prop != null) { if (!shouldDeleteUndefined || value != null) { obj[prop] = value; } else { delete obj[prop]; } } else { // nothing to set or delete return undefined; } }; var unsetDeep = function unsetDeep(obj, parts) { return setDeep(obj, parts); }; var exists = function exists(obj, name) { return getDeep(obj, name) !== undefined; }; var cast = function cast(maybeStr) { if (maybeStr == null) { return maybeStr; } if (isObject(maybeStr) || isArray(maybeStr)) { return castDeep(maybeStr); } return castStr("".concat(maybeStr), maybeStr); }; var castStr = function castStr(str) { var defaultRet = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : str; if (/^-?[1-9]\d*?$/.test(str)) { return parseInt(str, 10); } if (str === '0' || str === '-0') { return 0; } if (/^-?\d*\.\d+$/.test(str)) { return parseFloat(str); } if (/^true$/i.test(str)) { return true; } if (/^false$/i.test(str)) { return false; } return defaultRet; }; // Given an object or array, iterates over each leaf and casts the value. var